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类型,范型中的约束类型。
努力,向上,自律