MyBatis的ResultMap

通常来说,数据库的命名规范一般是​​xxx_xxx​​​这样子,而Java的属性命名方式一般是采用的​​小驼峰命名​​​,即eName,empNo…这样的。而MyBatis的自动映射机制要求我们必须要与数据库的字段对应。所以​​ResultMap​​​可以将我们的Java属性与数据库字段映射对应,即​​自定义的映射关系​​​。
ResultMap标签就是用来解决这种情况。

这里数据库中有两张表emp01(员工表),dept01(部门表)

MyBaris-ResultMap定制化查询结果_数据库


一表:部门表

多表:员工表

关联字段:部门编号

ResultMap结果集映射

resultMap 元素的属性值和子节点

  1. 属性
  • id :唯一标识,此 id 值用于 select 元素 resultMap 属性的引用。
  • type :表示该 resultMap 的映射结果类型。
  1. 节点
  • result :用于标识一些简单属性,其中 column 属性表示从数据库中查询的字段名或别名, property 属性则表示查询出来的字段对应的值赋给实体对象的哪个属性。

说明:
MyBatis 中在对查询进行 select 映射的时候,返回类型可以用 resultType 也可以用 resultMap ,resultType和 resultMap 有一定关联和区别,应用场景也不同。

ResulMap标签主要是用于表的​​关联查询​​​操作以及实现pojo与数据库表的​​映射关系​​​,首先说明常用的
多表对应关系

  1. 一对一
  2. 一对多
  3. 多对一
  4. 多对多(可以拆分[成多对一+一对多])

数据库字段名和实体类属性名不一致的问题

方式一 typeAliases起别名

类型别名是为 Java 类型命名的一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
使用方式:
在著配置文件中,在settings标签中设置typeAliases子标签

<!--设置别名 -->
<typeAliases>
<!--扫描一个包 -->
<package name="com.wei.pojo"></package>
</typeAliases>

也可以为某一个类去设置别名

<typeAliases>
<typeAlias type="com.wei.pojo.Emp01" alias="student"/>
</typeAliases>

不足之处:

  1. 这张方式只为一个类设置别名,会造成大量的typeAliases标签,本身别名就是为了简化操作,这又要每一个类要配置一个typeAliases标签,失去了本身的意义。

使用注意事项:

  1. 所以通常我们都是使用​​package标签​​​,为整个pojo包下设置别名,​​这样设置的别名都是我们的类名​​,
  2. 但是也可以随便起,不建议。扫描之后的别名就是类名(不区分大小写),建议使用的时候和类名一致(小写)。
<select id="queryAll" resultType="emp01">
select empno,ename,job,mgr,sal from emp01
</select>

方式二 resultMap自定义映射关系

如果我们的pojo实体类中的字段属性与数据库中不一致,存在多表关联的操作,那么此时我们就需要使用resultMap自定义引用数据类型的数据。

多表出发 association属性

从多表的一方出发观察:

pojo类

MyBaris-ResultMap定制化查询结果_设置别名_02


数据库字段

MyBaris-ResultMap定制化查询结果_java_03


MyBaris-ResultMap定制化查询结果_java_04

一方出发

<!-- 一对多方向 -->
<resultMap type="Dept" id="deptMap">
<result column="name" property="name"/>
<!-- 配置多的一方 -->
<collection property="emps" column="deptno" javaType="Emp01">
<id column="empno" property="empNo" />
<result column="ename" property="eName"/>
<result column="email" property="email"/>
<result column="mgr" property="mgr"/>
<result column="job" property="job"/>
<result column="sal" property="salary"/>
</collection>
</resultMap>