• 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类型对应的别名简写

  • 相关阅读:
    交通运输线(LCA)
    POJ 2186 Popular cows(Kosaraju+强联通分量模板)
    Codeforces 351D Jeff and Removing Periods(莫队+区间等差数列更新)
    Codeforces 375D
    Codeforces 86D
    SPOJ D-query(莫队算法模板)
    Educational Codeforces Round 25 D
    Codeforces Round #423 Div. 2 C-String Reconstruction(思维)
    HDU3974 Assign the task(多叉树转换为线段+线段树区间染色)
    bzoj 2463: [中山市选2009]谁能赢呢?
  • 原文地址:https://www.cnblogs.com/machi12/p/15407179.html
Copyright © 2020-2023  润新知