MyBatis(十七):一对多的处理

种地  论坛元老 | 2022-9-17 08:42:11 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1088|帖子 1088|积分 3264

上一篇我们学习了多对一的处理,这次我们来学习一对多的处理。
一对多的处理与多对一的处理差别不大,只是有一些细微的地方需要注意。
我们还是先做准备工作,其他部分与多对一的准备工作相同,仅实体类构建需要做出改变。
一、修改实体类
Student类:
  1. package com.jms.pojo;
  2. public class Student {
  3.     private int id;
  4.     private String name;
  5.     private int tid;
  6.     public Student() {
  7.     }
  8.     public Student(int id, String name, int tid) {
  9.         this.id = id;
  10.         this.name = name;
  11.         this.tid = tid;
  12.     }
  13.     public int getId() {
  14.         return id;
  15.     }
  16.     public void setId(int id) {
  17.         this.id = id;
  18.     }
  19.     public String getName() {
  20.         return name;
  21.     }
  22.     public void setName(String name) {
  23.         this.name = name;
  24.     }
  25.     public int getTid() {
  26.         return tid;
  27.     }
  28.     public void setTid(int tid) {
  29.         this.tid = tid;
  30.     }
  31.     @Override
  32.     public String toString() {
  33.         return "Student{" +
  34.                 "id=" + id +
  35.                 ", name='" + name + '\'' +
  36.                 ", tid=" + tid +
  37.                 '}';
  38.     }
  39. }
复制代码
Teacher类:
  1. package com.jms.pojo;
  2. import java.util.List;
  3. public class Teacher {
  4.     private int id;
  5.     private String name;
  6.     private List<Student> students;
  7.     public Teacher() {
  8.     }
  9.     public Teacher(int id, String name, List<Student> students) {
  10.         this.id = id;
  11.         this.name = name;
  12.         this.students = students;
  13.     }
  14.     public int getId() {
  15.         return id;
  16.     }
  17.     public void setId(int id) {
  18.         this.id = id;
  19.     }
  20.     public String getName() {
  21.         return name;
  22.     }
  23.     public void setName(String name) {
  24.         this.name = name;
  25.     }
  26.     public List<Student> getStudents() {
  27.         return students;
  28.     }
  29.     public void setStudents(List<Student> students) {
  30.         this.students = students;
  31.     }
  32.     @Override
  33.     public String toString() {
  34.         return "Teacher{" +
  35.                 "id=" + id +
  36.                 ", name='" + name + '\'' +
  37.                 ", students=" + students +
  38.                 '}';
  39.     }
  40. }
复制代码
 二、一对多的实现
1.按结果嵌套处理
(1)在TeacherMapper接口中声明方法
  1. Teacher getTeacher(int id);
复制代码
(2)在TeacherMapper.xml中实现接口的方法
  1. <resultMap id="TeacherAndStudent" type="Teacher">
  2.         <result property="id" column="tid"/>
  3.         <result property="name" column="tname"/>
  4.         
  5.         <collection property="students" ofType="Student">
  6.             <result property="id" column="sid"/>
  7.             <result property="name" column="sname"/>
  8.             <result property="tid" column="tid"/>
  9.         </collection>
  10.     </resultMap>
  11.     <select id="getTeacher" parameterType="_int" resultMap="TeacherAndStudent">
  12.         select t.id as tid,t.name as tname,s.id as sid,s.name as sname
  13.         from mybaties.student as s,mybaties.teacher as t
  14.         where t.id=s.tid and t.id=#{id}
  15.     </select>
复制代码
可以看到多对一与一对多的实现大同小异,不同的地方就是多对一中的association标签变成了collection,我们还是看官方文档对coolection的说明:
collection – 一个复杂类型的集合
  嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射的引用
所以collection用于集合,ofType表示集合中泛型的类型。在官方文档中,多对一代表关联,一对多代表集合。
(3)junit测试
  1. @Test
  2.     public void getTeacherTest() {
  3.         SqlSession sqlSession = MyBatisUtil.getSqlSession();
  4.         TeacherMapper teacherMapper = sqlSession.getMapper(TeacherMapper.class);
  5.         Teacher teacher = teacherMapper.getTeacher(1);
  6.         System.out.println(teacher);
  7.     }
复制代码
测试结果:

 
 没有问题。
2.按查询嵌套处理
(1)在TeacherMapper接口中声明方法
  1. Teacher getTeacher2(int id);
复制代码
(2)在TeacherMapper.xml中实现接口的方法
  1.     <resultMap id="TeacherAndStudent2" type="Teacher">
  2.         <result property="id" column="id"/>
  3.         <collection property="students" column="id" javaType="List" ofType="Student" select="getStudent"/>
  4.     </resultMap>
  5.     <select id="getTeacher2" parameterType="_int" resultMap="TeacherAndStudent2">
  6.         select * from mybaties.teacher where id=#{id}
  7.     </select>
  8.     <select id="getStudent" resultType="Student">
  9.         select * from mybaties.student where tid=#{id}
  10.     </select>
复制代码
大同小异。
需要注意的是,这里这句映射是必要的,因为查询到的id列还被映射到了students集合,如果不进行映射,会出现Teacher的id为0的情况。
(3)junit测试
  1. @Test
  2.     public void getTeacherTest2() {
  3.         SqlSession sqlSession = MyBatisUtil.getSqlSession();
  4.         TeacherMapper teacherMapper = sqlSession.getMapper(TeacherMapper.class);
  5.         Teacher teacher = teacherMapper.getTeacher2(1);
  6.         System.out.println(teacher);
  7.     }
复制代码
测试结果:

 
 没有问题。
 
(本文仅作个人学习用,如有纰漏敬请指正)
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表