MyBatis 之四:结果映射和关联映射

结果映射

当查询的 SQL 中,出现了表字段名和实体类属性名不一致情况时,需要指定映射关系

常见方式:

  • 使用 SQL 的 AS 别名方式
  • ResultMap 方式
普通属性映射配置

第一步:编写结果映射

复制代码
<resultMap id="empMap" type="emp">
    <id property="empno" column="empno"></id>
    <result property="salary" column="sal"></result>
    <!--如果属性名和字段名一致时,可以省略的-->
    <result property="ename" column="ename"></result>
</resultMap>

第二步:<select>查询 中引用

复制代码
<!--2.使用结果映射,就是把 resultType 换为 resultMap,注意两者不能同时使用-->
<select id="queryAll" resultMap="empMap">
    select empno,ename,sal,hiredate,deptno from emp
</select>

第三步:代码查询,看下不一致的属性是否能获取到值

复制代码
//SqlSession
SqlSession sqlSession = MyBatisUtil.getSqlSession();
// 动态代理  动态根据接口实现生成对应的实现类的代理对象
IEmpDao dao = sqlSession.getMapper(IEmpDao.class);

Emp emp = dao.get(1);

dao.queryAll().forEach(System.out::println);
特别注意
autoMapping

此属性属于映射文件中 resultMap 标记

如果设置这个属性,MyBatis 将会为本结果映射开启或者关闭自动映射。

这个属性会覆盖全局的属性 autoMappingBehavior。默认值:true

如果false,只是映射在<resultMap>中配置的属性才会被映射

复制代码
<resultMap id="empMap" type="emp" autoMapping="true">
    <id property="empno" column="empno"></id>
    <result property="salary" column="sal"></result>
    <!--如果属性名和字段名一致时,可以省略的-->
    <result property="ename" column="ename"></result>
</resultMap>

如果要设置所有的结果映射中的行为策略为默认禁用自动映射,可以在配置文件中配置下面配置

autoMappingBehavior

此属性属于配置文件中的 settings 标记下的配置

指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。 FULL 会自动映射任何复杂的结果集(无论是否嵌套)。

复制代码
<settings>
    <!--日志配置-->
    <setting name="logImpl" value="STDOUT_LOGGING"/>
    <setting name="autoMappingBehavior" value="NONE"/>
</settings>

注意注意

如果配置了autoMappingBehavior 为 NONE 时,会对其他没有使用结果映射的查询结果产生影响

对应没有使用结果映射,而使用 resultType 的查询,会查询结果直接为 null

例如:

配置文件中配置 :

复制代码
<setting name="autoMappingBehavior" value="NONE"/>

映射文件中:

复制代码
<resultMap id="empMap" type="emp">
    <id property="empno" column="empno"></id>
    <result property="salary" column="sal"></result>
</resultMap>

<!--下面使用 resultType ,代码调用查询结果返回的 Emp 对象为 null-->
<select id="get" resultType="emp">
    select empno,ename,sal,hiredate from emp where empno=#{empno}
</select>

<!--下面使用 resultMap ,可以有正常的映射结果-->
<select id="queryAll" resultMap="empMap">
    select empno,ename,sal,hiredate,deptno from emp
</select>

10. 关联映射

通过一个对象的查询,可以很方便自动关联查询出其他对象

一对一

一对多

多对多

实现方式

实现方式:

  1. 内嵌查询:发起N+1查询
  2. 内嵌映射
1. 内嵌查询方式

例:通过查询员工来自动关联查询部门

  • 在员工映射文件中,配置 resultMap 中配置

    复制代码
    <resultMap id="empMap" type="emp" autoMapping="true">
        <id property="empno" column="empno"></id>
        <result property="salary" column="sal"></result>
        <!--如果属性名和字段名一致时,可以省略的-->
        <result property="ename" column="ename"></result>
    
        <association property="dept" column="deptno" select="com.wdzl.dao.IDeptDao.get" ></association>
    </resultMap>
  • select : 映射文件中的 id 。调用其他的查询语句的。本例中,引用了com.wdzl.dao.IDeptDao命名空间中get 查询

  • column: 查询部门时,通过deptno 的值来查询的。所以注意,在查询员工时,必须得查询出 deptno

例:通过部门关联查询员工集合

  • 修改部门映射文件

    复制代码
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.wdzl.dao.IDeptDao">
    
        <resultMap id="deptMap" type="Dept">
            <id column="deptno" property="deptno"></id>
            <collection property="emps" column="deptno" ofType="emp"
                        select="com.wdzl.dao.IEmpDao.getEmpByDept"></collection>
        </resultMap>
    
        <select id="get" resultMap="deptMap">
             select deptno,dname from dept where deptno=#{id}
        </select>
    </mapper>
  • 注意:

    <collection property="emps" column="deptno" ofType="emp"

    复制代码
                    select="com.wdzl.dao.IEmpDao.getEmpByDept"></collection>
    • select 中 来自员工映射文件中:

      <select id="getEmpByDept" resultType="emp"> select empno,ename,sal,hiredate,deptno from emp where deptno=#{id} </select>
    • 注意:ofType="emp"

2. 内嵌映射方式

例子:通过员工查询部门

  • 修改原有的员工查询语句,改为以员工为主的外连接查询
  • 修改结果映射 中的
复制代码
<!--autoMapping="false" 内嵌映射这里默认值,这里默认不会自动映射的,需要手动配置或配置为true-->
<association property="dept"  >
    <id column="deptno" property="deptno"></id>
    <result column="dname" property="dname"></result>
</association>

注意:

  • 默认情况下,autoMapping="false" 内嵌映射这里默认值

  • 这里默认不会自动映射的,需要手动配置或配置为true

  • 配置文件中影响:

    复制代码
    <setting name="autoMappingBehavior" value="FULL"/>

如果取值其他值 NONE 或 默认值 PARTIAL ,则 association 下不会自动映射,需要手动配置或增加属性 autoMapping="true"

相关推荐
sp423 分钟前
漫谈 Java 轻量级的模板技术:从字符串替换到复杂模板
java·后端
2301_795167205 分钟前
玩转Rust高级应用. ToOwned trait 提供的是一种更“泛化”的Clone 的功能,Clone一般是从&T类型变量创造一个新的T类型变量
开发语言·后端·rust
你才是向阳花17 分钟前
如何用Python实现飞机大战小游戏
开发语言·python·pygame
9523618 分钟前
数据结构-链表
java·数据结构·学习
喵手21 分钟前
Java线程通信:多线程程序中的高效协作!
java
合作小小程序员小小店22 分钟前
web网页开发,在线%商城,电商,商品购买%系统demo,基于vscode,apache,html,css,jquery,php,mysql数据库
开发语言·前端·数据库·mysql·html·php·电商
TDengine (老段)31 分钟前
TDengine 字符串函数 CONCAT 用户手册
java·数据库·tdengine
星释38 分钟前
Rust 练习册 :Phone Number与电话号码处理
开发语言·机器学习·rust
one year.40 分钟前
Linux:线程同步与互斥
java·开发语言
一 乐43 分钟前
旅游|内蒙古景点旅游|基于Springboot+Vue的内蒙古景点旅游管理系统设计与实现(源码+数据库+文档)
开发语言·前端·数据库·vue.js·spring boot·后端·旅游