Mybatis学习-多对一处理&一对多处理

Mybatis学习-多对一处理&一对多处理

环境准备

在这里插入图片描述

  • 多个学生对应一个老师·
  • 对学生而言,关联 多个学生学生关联一个老师 【多对一】
  • 对于老师而言,集合 一个老师有很多学生【一对多】
    SQL

数据库sql文件

create table teacher (
	id int(10) not null,
	name varchar(30) default null,
	primary key (id)
) enginge=INNODB default CHARSET=utf8;

insert into teacher(id,name) values (1,'李老师');

create table student (
	id int(10) not null,
	name varchar(30) default null,
	tid int(10) default null,
	primary key (id),
	key fktid (tid),
	constraint fktid foreign key (tid) references teacher(id)
);

insert into student(id,name,tid) values (1,'小明',1);
insert into student(id,name,tid) values (2,'小红',1);
insert into student(id,name,tid) values (3,'小张',1);
insert into student(id,name,tid) values (4,'小李',1);
insert into student(id,name,tid) values (5,'小王',1);

测试环境搭建

  1. 导入lombok
  2. 新建实体类Teacher,Student
  3. 新建Mapper接口
  4. 建立Mapper.xml文件
  5. 在核心配置文件中绑定注册我们的Mapper接口或者文件
  6. 测试查询是否能够成功

多对一处理

实体类

@Data
public class Student {
    private int id;
    private String name;

    //学生需要关联一个老师
    private Teacher teacher;

}
@Data
public class Teacher {
    private int id;
    private String name;

}

按照查询嵌套处理

<!--
    思路:
        1、查询所有的学生信息
        2、根据查询到的学生对应的tid寻找对应的teacher信息
-->
<resultMap id="StudentTeacher" type="Student">
    <result property="id" column="id" />
    <result property="name" column="name" />
    <!--复杂的属性我们需要单独处理 对象:association  集合:collection-->
    <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
</resultMap>

<select id="getStudent" resultMap="StudentTeacher">
    select * from student;
</select>

<select id="getTeacher" resultType="Teacher">
    select * from teacher where id = #{id}
</select>

按照结果嵌套处理

<!--按照结果嵌套处理-->
<select id="getStudent2" resultMap="StudentTeacher2">
    select s.id sid,s.name sname,t.name tname
    from student s,teacher t
    where s.tid =t.id;
</select>

<resultMap id="StudentTeacher2" type="Student">
    <result property="id" column="sid" />
    <result property="name" column="sname" />
    <association property="teacher" javaType="Teacher">
        <result property="name" column="tname"/>
    </association>
</resultMap>

一对多处理

比如:一个老师拥有多个学生!
对于老师而言,就是一对多的关系!

实体类

@Data
public class Student {
    private int id;
    private String name;
    private int  tid;

}
@Data
public class Teacher {
    private int id;
    private String name;

    // 一个老师拥有多个学生
    private List<Student> students;
}

按照结果嵌套处理

<!--按结果嵌套查询-->
<select id="getTeacherStudent" resultMap="TeacherStudentMap">
    select s.id sid, s.name sname,t.name tname, t.id tid
    from student s,teacher t
    where s.tid=t.id and t.id = #{tid};
</select>

<resultMap id="TeacherStudentMap" type="Teacher">
    <result property="id" column="tid" />
    <result property="name" column="tname" />
    <!--复杂的属性我们需要单独处理,对象:association 集合:collection
        javaType指定属性的类型
        集合中的泛型信息,我们使用ofType获取
    -->
    <collection property="students" ofType="Student">
        <result property="id" column="sid"/>
        <result property="name" column="sname" />
        <result property="tid" column="tid" />
    </collection>
</resultMap>

按照查询嵌套处理

<select id="getTeacherStudent2" resultMap="TeacherStudent2">
    select * from teacher where id = #{tid};
</select>
<resultMap id="TeacherStudent2" type="Teacher">
	<result property="id" column="id"/>
    <result property="name" column="name" />
    <collection property="students" javaType="ArrayList" ofType="Student"
                select="getStudentByTeacherId" column="id"/>
</resultMap>
<select id="getStudentByTeacherId" resultType="Student">
    select * from student where tid = #{tid};
</select>

小结

  1. 关联 - association 【多对一】
  2. 集合 - collection 【一对多】
  3. javaType & ofType
    1、javaType 用来指定实体类中属性的类型
    2、ofType 用来指定映射到List或者集合中的pojo类型,泛型中的约束类型

注意点:

  • 保证SQL的可读性,尽量保证通俗易懂
  • 注意一对多和多对一中,属性名和字段的问题
  • 如果问题不好排查错误,可以使用日志,建议使用log4j
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值