MyBatis-------级联查询(一对一、一对多)
一、持有其它对象
package com.tyzhou.stu.model;
import lombok.Data;
@Data
public class ClassRoom {
/**
* 班级编号
*/
private Long id;
private String name;
/**
* 一个班级有一个班主任
*/
private Teacher teacher;
}
@Data
public class Teacher {
private Long id;
private String name;
}
核心:映射到某个对象的某个属性中
<select id="queryById" resultType="com.tyzhou.stu.model.ClassRoom">
SELECT
m.id id,
m.name name,
t.id "teacher.id",
t.name "teacher.name"
FROM m_classroom m
JOIN m_teacher t ON m.teacherId = t.id
WHERE m.id = #{id}
</select>
二、持有其它对象集合
一个老师会管多个班级。
@Data
public class Teacher {
private Long id;
private String name;
/**
* 一个老师管理多个班级
*/
List<ClassRoom> classRoomList;
}
@Data
public class ClassRoom {
/**
* 班级编号
*/
private Long id;
private String name;
}
拨云见日:
(1) 最先查询出老师的相关数据,并使用resultMap进行映射
(2) 在resultMap映射完老师实体后,将老师实体的主键ID作为参数传递
(3) 最后一个查询,它接收老师主键ID作为条件,查询出老师管理的多个班级集合
<!-- 第一步:查询主表数据,并使用resultMap -->
<select id="queryTeacherById" resultMap="getClassRoom">
SELECT
m.id tId,
m.name tName
FROM
m_teacher m
WHERE
m.id = #{id}
</select>
<!-- 第二步:映射主表数据字段,并传递级联查询的主表ID -->
<resultMap id="getClassRoom" type="com.tyzhou.stu.model.Teacher">
<id column="tId" property="id"/>
<result column="tName" property="name"/>
<!--
property:Java中list的引用名
ofType:List的泛型
select:即将要查询的SQL语句的id
column:传递过去的查询参数
-->
<collection property="classRoomList"
ofType="com.tyzhou.stu.model.ClassRoom"
select="getClassRoom" column="tId">
</collection>
</resultMap>
<!-- 第三步:通过传递过来的ID查询多个List -->
<select id="getClassRoom" parameterType="long"
resultType="com.tyzhou.stu.model.ClassRoom">
SELECT
m.id id,
m.name name
FROM
m_classroom m
WHERE
m.teacherId = #{tId}
</select>
更多MyBatis使用经验