Mybatis 高级结果集映射

wuchangjian2021-10-27 16:55:14编程学习

MyBatis 创建时的一个思想是:数据库不可能永远是你所想或所需的那个样子。 我们希望每个数据库都具备良好的第三范式或 BCNF 范式,可惜它们并不都是那样。 如果能有一种数据库映射模式,完美适配所有的应用程序,那就太好了,但可惜也没有。 而 ResultMap 就是 MyBatis 对这个问题的答案。
因为官方的解释有些地方比较生涩难懂,这里就我的个人实践在结合实例对Mybatis的高级结果集映射做一个更加简单易懂的讲解。附官方文档:Mybatis结果集映射

废话不多说,先看一个案例。

一、(案例)处理老师与学生一对多结果集映射

注意这里不提供测试,只做讲解。请自行进行测试。

首先分析老师与学生的关系是一个老师对应多个学生,即一个老师可能教多个学生。在数据库中两者关系是使用外键关联的,我们先来建立两个表的实体类,如下:

//学生类
public class Student {
  private Integer id;
  private String name;
}
//老师类
public class Teacher {
  private Integer id;
  private String name;
}

实体类建好了,现在如果我们需要查询一个老师的信息及这个老师教的学生们。这时候就发现问题了,这里的查询需要进行连表,且查询的结果集我们如何进行封装,这时候我们就会疑惑了。怎么做呢?我们可以在老师类中添加一个学生类的集合。

public class Teacher {
  private Integer id;
  private String name;
    //一个老师对应多个学生
  private List<Student> students;
}

那么如何将结果集映射到这个实体类中,就可以使用Mybatis的结果集映射。省略接口与方法的定义,这里只讲映射器的实现。使用结果集映射的子查询方式查询老师的详细信息,代码如下:

<!--
属性:
reslutMap 用于指定映射器
-->
<select id="getTeacherById" resultMap="TeacherMap">
    select * from teacher where id = #{id}
</select>
<!--
标签:
resultMap	定义一个映射器
result	映射普通结果集
collection	映射一个集合
属性:
id 指定映射器名称
type 映射器映射的类型
property 要映射的属性
column 数据库字段
select 指定一个select映射
ofType 指定集合的泛型(即集合装的对象)
-->
<resultMap id="TeacherMap" type="teacher">
    <result property="id" column="id"/>
    <result property="name" column="name"/>
    <collection property="students" select="getStudentById" column="id" ofType="student">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
    </collection>
</resultMap>
<!--根据老师id查询学生-->
<select id="getStudentById" resultType="student">
    select * from student where tid = #{id}
</select>

这里讲解了类属性集合的映射方式,而如果要进行类属性对象的映射,可以查看我的另一篇博客 Mybatis结果集映射的多对一处理。

映射集合元素使用 collection
映射对象元素使用 association

相关文章

jQuery基础 学习笔记

目录 jQuery优点 jQuery下载 jQuery引入:...

PAT乙级 1078 字符串压缩与解压

题目: 文本压缩有很多种方法,这里我们只考虑最简单的一种:...

想问下大家这个积分怎么获取

有没有哪位铁子和我说一下积分怎么获取的...

XML 元素概述

XML 元素概述

XML 元素指的是从(且包括)开始标签直到(且...

“21天好习惯”第一期-5

john带上小狗Tommy去见女友Mary,他们同时出发相向而行。Tomm...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。