Mybatis笔记(五):一对多的处理

时间:2021/10/14

一.目的

前一篇中所说的多对一关系的重点在学生实体身上,体现了多个学生对应一个老师,所以学生实体类中需要包含属性teacher来表现这种多对一的关系。本篇中的一对多关系体现在教师实体上,所以学生实体不需要teacher属性,直接使用tid属性即可,但是教师实体需要添加一个List<Student>属性,用来体现教师和学生之间一对多的关系。

我们的目的是完成类似于下面SQL语句的功能:

1 select s.id sid, s.name sname, t.id tid, t.name tname
2         from student s, teacher t where s.tid = t.id and t.id = 1

二.修改实体类

Student.class:

 1 package bupt.machi.pojo;
 2 
 3 public class Student {
 4 
 5     private int id;
 6     private String name;
 7     //由于这里需要体现一对多的关系,所以在学生类中不需要Teacher类的属性,直接使用tid即可
 8     private int tid;
 9 
10     public int getId() {
11         return id;
12     }
13 
14     public String getName() {
15         return name;
16     }
17 
18     public int getTid() {
19         return tid;
20     }
21 
22     public void setId(int id) {
23         this.id = id;
24     }
25 
26     public void setName(String name) {
27         this.name = name;
28     }
29 
30     public void setTid(int tid) {
31         this.tid = tid;
32     }
33 
34     @Override
35     public String toString() {
36         return "Student{" +
37                 "id=" + id +
38                 ", name='" + name + '\'' +
39                 ", tid=" + tid +
40                 '}';
41     }
42 }

Teacher.class:

 1 package bupt.machi.pojo;
 2 
 3 import java.util.List;
 4 
 5 public class Teacher {
 6 
 7     private int id;
 8     private String name;
 9     private List<Student> studentList;
10 
11     public int getId() {
12         return id;
13     }
14 
15     public String getName() {
16         return name;
17     }
18 
19     public List<Student> getStudentList() {
20         return studentList;
21     }
22 
23     public void setId(int id) {
24         this.id = id;
25     }
26 
27     public void setName(String name) {
28         this.name = name;
29     }
30 
31     public void setStudentList(List<Student> studentList) {
32         this.studentList = studentList;
33     }
34 
35     @Override
36     public String toString() {
37         return "Teacher{" +
38                 "id=" + id +
39                 ", name='" + name + '\'' +
40                 ", studentList=" + studentList +
41                 '}';
42     }
43 }

三.修改TeacherMapper接口

 1 package bupt.machi.dao;
 2 
 3 import bupt.machi.pojo.Teacher;
 4 import org.apache.ibatis.annotations.Param;
 5 
 6 public interface TeacherMapper {
 7 
 8     Teacher getTeacherById(@Param("tid") int id);
 9 
10     Teacher getTeacherById2(@Param("tid") int id);
11 }

四.编写SQL配置文件

1)使用结果嵌套处理(推荐):

TeacherMapper.xml:

 1 <?xml version="1.0" encoding="UTF8" ?>
 2 <!DOCTYPE mapper
 3         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <!--绑定接口-->
 6 <mapper namespace="bupt.machi.dao.TeacherMapper">
 7     <select id="getTeacherById" resultMap="getTeacher">
 8         select s.id sid, s.name sname, t.id tid, t.name tname
 9         from student s, teacher t where s.tid = t.id and t.id = #{tid}
10     </select>
11 
12     <resultMap id="getTeacher" type="Teacher">
13         <result column="tid" property="id"/>
14         <result column="tname" property="name"/>
15 <!--  这里由于是集合,所以使用collection标签
16       javaType:对象的类型
17       ofType:集合中范型的类型
18       -->
19         <collection property="studentList" ofType="Student">
20             <result property="id" column="sid"/>
21             <result property="name" column="sname"/>
22         </collection>
23     </resultMap>
24 
25 </mapper>

但使用上面这种方法时,查询出来的结果如下:

2)使用查询嵌套处理

 1 <!--  使用查询嵌套处理  -->
 2     <select id="getTeacherById2" resultMap="getTeacher2">
 3         select * from teacher where id = #{tid}
 4     </select>
 5 
 6 <!--  这里的type指的是接口中方法的返回类型  -->
 7     <resultMap id="getTeacher2" type="Teacher">
 8         <!--可以自动对应上的映射就不用写了-->
 9         <!--javaType用来表示返回值的类型,由于这里返回值类型是List,所以写成ArrayList
10             ofType用来表示范型中的类型
11             column用来向子查询中传递参数
12         -->
13         <collection property="studentList" javaType="ArrayList" ofType="Student" select="getStudent" column="id"/>
14     </resultMap>
15 
16     <select id="getStudent" resultType="Student">
17         select * from student where tid = #{id}
18     </select>

查询出来的结果如下:

五.注意

1.关联-association(多对一)

  集合-collection(一对多)

2.javaType:用来制定实体类中属性的类型

  ofType:用来制定映射到List或者集合中的pojo类型,范型中的约束类型。

3.mybatis中Java类型对应的别名简写

原文地址:https://www.cnblogs.com/machi12/p/15407179.html