Mybatis(9) 一对多和多对一处理

9.多对一处理

    9.1

多个学生,对应一个老师

       对于学生而言 关联  多个学生,关联一个老师 【多对一】

       对于老师而言 集合  一个老师,有很多学生【一对多】

             

       Sql:

       CREATE TABLE `teacher` (

          `id` INT(10) NOT NULL,

          `name` VARCHAR(30) DEFAULT NULL,

          PRIMARY KEY (`id`)

) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师');

 

CREATE TABLE `student` (

                 `id` INT(10) NOT NULL,

                 `name` VARCHAR(30) DEFAULT NULL,

                 `tid` INT(10) DEFAULT NULL,

                 PRIMARY KEY (`id`),

                 KEY `fktid` (`tid`),

          CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)

) ENGINE=INNODB DEFAULT CHARSET=utf8

 

INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1');

INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小红', '1');

INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小张', '1');

INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1');

INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');

 

环境搭建:

 

    9.2 按照查询嵌套处理

<mapper namespace="com.luo.dao.StudentMapper">
    <select id="getStudentAndTeacher" resultMap="StudentTeacher" >
        select *from mybatis.student;
    </select>

    <resultMap id="StudentTeacher" type="student">
        <!-- 复杂的属性,我们需要单独处理 对象 association  集合:collection-->
        <association property="teacher" column="tid"   javaType="Teacher" select="getTeacher"></association>
    </resultMap>

    <select id="getTeacher" resultType="teacher">
        select *from mybatis.teacher where id=#{id}
    </select>
</mapper>

    9.3 按照结果嵌套处理

<select id="getStudentAndTeacher2" resultMap="StudentTeacher2">
     select s.id sid,s.name sname,t.name tname,t.id tid from mybatis.student s inner join  mybatis.teacher t on s.tid=t.id
</select>

 <resultMap id="StudentTeacher2" type="student">
     <result property="id" column="sid"></result>
     <result property="name" column="sname"></result>
     <association property="teacher" javaType="teacher">
        <result property="name" column="tname"></result>
         <result property="id" column="tid"></result>
     </association>
 </resultMap>

 

10.多对一处理

       比如:一个老师拥有多个学生!

       对于老师而言,就是一对多的关系。

 

实体类:

private int id;
private String name;
private List<Student> students;

 

private int id;
private String name;
private int tid;

 

//获取指定老师下所有学生及老师的信息
Teacher getTeacher(int id);

按照结果集查询

<mapper namespace="com.luo.dao.TeacherMapper">
        <select id="getTeacher" resultMap="getTeachers">
            SELECT s.id sid,s.name sname,t.name tname ,t.id tid FROM  mybatis.student s INNER JOIN
            mybatis.teacher t ON s.tid=t.id and tid=#{id}
        </select>
       
        <resultMap id="getTeachers" type="Teacher">
              <result property="id" column="tid"></result>
                <result property="name" column="tname"></result>
              <collection property="students" ofType="Student">
                      <result property="id" column="sid"></result>
                      <result property="name" column="sname"></result>
                      <result property="id" column="tid"></result>
              </collection>
        </resultMap>
</mapper>

 

    小结:

l  1.关联: association [多对一]

l  2.集合 collection [一对多]

l  javaType & ofType

n  1.javaType 用来指定实体类中属性的类型

n  2.ofType 用来指定映射到List或者集合中pojo类型,泛型中的约束类型

注意点:

l  保证sql的可读性,尽量保证通俗易懂

l  注意一对多和多对一中,属性名和字段的问题

posted @ 2022-04-11 16:44  十三加油哦  阅读(48)  评论(0)    收藏  举报