mybatis-03 多对一,一对多的处理

多对一处理

举例:
  • 对学生而言是多个学生对一个老师

  • 对老师而言是一个老师关联多个学生

    • 思路:

      • 编写实体类
      @Data //GET,SET,ToString,有参,无参构造
      public class Teacher{
      private int id;
      private String name;
      }
      
      @Data
      public class Student {
      private int id;
      private String name;
      //多个学生可以是同一个老师,即多对一
      private Teacher teacher;
      }
      
      • 编写接口

        public interface StudentMapper {
        		// 查询所有的学生信息和老师的信息
             List<Student> getStudents();
        }
        
        public interface TeacherMapper {
        }
        
      • 编写对应的Mapper.xml文件

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <mapper namespace="com.kuang.mapper.StudentMapper">
        
      </mapper>
      
      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <mapper namespace="com.kuang.mapper.TeacherMapper">
      </mapper>
      

      多对一: 查询 :多个学生对应一个老师

      按查询嵌套处理

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <mapper namespace="com.kuang.mapper.StudentMapper">
      <!--
      	需求:获取所有学生及对应老师的信息
      思路:
      	1. 获取所有学生的信息
      	2. 根据获取的学生信息的老师ID->获取该老师的信息
      	3. 思考问题,这样学生的结果集中应该包含老师,该如何处理呢,数据库中我们一般
      使用关联查询?
      	1. 做一个结果集映射:StudentTeacher
      	2. StudentTeacher结果集的类型为 Student
      	3. 学生中老师的属性为teacher,对应数据库中为tid。
      多个 [1,...)学生关联一个老师=> 一对一,一对多
      4. 查看官网找到:association – 一个复杂类型的关联;使用它来处理关联查
      询
      -->
      <select id="getStudents" resultMap="StudentTeacher">
      	select * from student
      </select>
      <resultMap id="StudentTeacher" type="Student">
      	<!--association关联属性 property属性名 javaType属性类型 column在多的一方的表中的列名-->
      	<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
      </resultMap>
      <!--
      	这里传递过来的id,只有一个属性的时候,下面可以写任何值
      	association中column多参数配置:
      	column="{key=value,key=value}"
      	其实就是键值对的形式,key是传给下个sql的取值名称,value是片段一中sql查询的
      	字段名。
      -->
      <select id="getTeacher" resultType="teacher">
      		select * from teacher where id = #{id}
      </select>
      </mapper>
      

      按结果嵌套处理

      <!--
      按查询结果嵌套处理
      思路:
      1. 直接查询出结果,进行结果集的映射
        多对一
      -->
      <!--按照结果嵌套查询-->
              <select id="getStudents2" 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: 关联属性 : 用于多对一,一对一 -->
              <association property="teacher" javaType="Teacher">
                  <result property="name" column="tname"/>
              </association>
      
          </resultMap>
      
      • 按照查询进行嵌套处理就像SQL中的子查询
      • 按照结果进行嵌套处理就像SQL中的联表查询

一对多的处理:

​ 举例:一个老师拥有对个学生

​ 就是一对多: 可以理解为老师的类下拥有一个学生的集合

实例类:

@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;
}

按结果嵌套处理

// 获取指定老师下的所有学生,以及老师的信息
    Teacher getTeacher2(@Param("tid") int id);
<!--按结果嵌套查询-->
    <select id="getTeacher2" resultMap="TeacherStudent">
        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="TeacherStudent" 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>

Teacher getTeacher3(@Param("tid") int id);
<!--按照查询嵌套-->
    <select id="getTeacher3" resultMap="TeacherStudent2">
        select * from teacher where  id = #{tid}
    </select>
    <resultMap id="TeacherStudent2" type="Teacher">
        <collection property="students" column="id" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId"/>

    </resultMap>
    <select id="getStudentByTeacherId" resultType="Student">
        select * from student where tid = #{tid}
    </select>
  1. 关联-association (多对一,一对一)

  2. 集合-collection (一对多,多对多)

  3. 所以association是用于一对一和多对一,而collection是用于一对多的关系

  4. JavaType和ofType都是用来指定对象类型的 JavaType是用来指定pojo中属性的类型 ofType指定的是映射到list集合属性中pojo的类型。

上一篇:自适应rem.js


下一篇:练习:多表合并