一.介绍与应用场景
- 通常我们会遇到这样一个业务场景:有一个班级叫A班,班级有10个学生(B),学生包括了性别,年龄,家庭情况(C),每个学生家庭情况包含住址,父母的姓名的属性,那么现在通过mysql关联查询查询到以上所有信息,那么查询结果如何映射成一个对象,这就是mybatis高级结果映射要做的事情。
- 其中涉及到一对多与一对一的结果映射关系,想了解更多,请看文档,不在赘述。
结果映射介绍
二准备工作
-
建表
image.png - 建DTO
课程
public class Course {
private Integer id;
private String cousreName;
List<Student> students;
}
学生
public class Student {
private Integer id;
private String stuName;
private Address address;
}
家庭情况
public class Address {
private Integer id;
private String address;
}
- .结果映射与sql
<resultMap id="testMap" type="course">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="cousre_name" jdbcType="VARCHAR"property="cousreName" />
<collection property=" students" ofType="student">
<id column="s_id" jdbcType="INTEGER" property="id" />
<result column="stu_name " jdbcType="VARCHAR" property="stuName" />
<association property="address" javaType="Address">
<id column="a_id" jdbcType="INTEGER" property="id" />
<result column="address" jdbcType="VARCHAR" property="address" />
</association>
</collection>
</resultMap>
<select id="findCommodityPageById" resultMap="commodityPageModal" >
SELECT
c.id ,
c.course_name ,
s.id as s_id,
s.stu_name ,
a.id,
a.address
FROM course c
LEFT JOIN student s
ON c.id=s.course_id
LEFT JOIN address a
ON s.id=a.stu_id
</select>
三.分析
- 属性分析resultMap: id="testMap"(自定义),type="course"(映射的dto)
- 属性分析result: column(mysql字段),property(dt对应字段)
- collection(一对多映射),ofType(子类映射的dto)
- association(一对一)
- 那为什么我的id有id,a_id,s_id呢?结果映射如果不同dto有相同名称属性,需要映射成不同名字,否则只会映射第一个属性,这点要注意。