MyBatis ---- 自定义映射resultMap

news2024/12/23 23:06:15

MyBatis ---- 自定义映射resultMap

  • 1. resultMap处理字段和属性的映射关系
  • 2. 多对一映射处理
    • a>级联方式处理映射关系
    • b>使用association处理映射关系
    • c>分布查询
  • 3. 一对多映射处理
    • a>collection
    • b>分步查询

1. resultMap处理字段和属性的映射关系

当实体类中的属性名和数据库中的属性名不一致时
在这里插入图片描述

在这里插入图片描述

    <!--List<Emp> getAllEmp();-->
    <select id="getAllEmp" resultType="emp">
        select * from t_emp;
    </select>

输出时并不会报异常,而是对于属性值不一样的值,输出结果为 null
在这里插入图片描述
解决方案

  1. 为字段起别名的方式,保证和实体类中的属性名保持一致
    <!--List<Emp> getAllEmp();-->
    <select id="getAllEmp" resultType="emp">
        <!--select * from t_emp;-->
        select eid, emp_name empName, age, sex, email from t_emp;
    </select>

在这里插入图片描述

  1. 可以在 MyBatis 的核心配置文件中设置一个全局配置信息 mapUnderscoreToCamelCase
    <!--配置MyBatis的全局变量-->
    <settings>
        <!--自动将_映射为驼峰规则-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!--List<Emp> getAllEmp();-->
    <select id="getAllEmp" resultType="emp">
        <!--select * from t_emp;-->
        <!--select eid, emp_name empName, age, sex, email from t_emp;-->
        select * from t_emp;
    </select>

在这里插入图片描述

  1. 通过 resultMap 自定义映射
    <resultMap id="EmpResultMap" type="emp">
        <id property="eid" column="eid"></id>
        <result property="empName" column="emp_name"></result>
        <result property="age" column="age"></result>
        <result property="sex" column="sex"></result>
        <result property="email" column="email"></result>
    </resultMap>
    
    <!--List<Emp> getAllEmp();-->
    <select id="getAllEmp" resultMap="EmpResultMap">
        select * from t_emp;
    </select>

resultMap:设置自定义映射
属性:
id:表示自定义映射的唯一标识
type:查询的数据要映射的实体类的类型
子标签:
id:设置主键的映射关系
result:设置普通字段的映射关系
property:设置映射关系中实体类中的属性名
column:设置映射关系中表中的字段名

在这里插入图片描述

2. 多对一映射处理

a>级联方式处理映射关系

    <resultMap id="empDeptMap" type="emp">
        <id property="eid" column="eid"></id>
        <result property="empName" column="emp_name"></result>
        <result property="age" column="age"></result>
        <result property="sex" column="sex"></result>
        <result property="email" column="email"></result>
        <result property="dept.did" column="did"></result>
        <result property="dept.deptName" column="dept_name"></result>
    </resultMap>

    <!--Emp getEmpAndDeptByEid(@Param("eid") Integer eid);-->
    <select id="getEmpAndDeptByEid" resultMap="empDeptMap">
        select * from t_emp left join t_dept on t_emp.did = t_dept.did where t_emp.eid = #{eid};
    </select>

在这里插入图片描述

b>使用association处理映射关系

    <resultMap id="empDeptMap" type="emp">
        <id property="eid" column="eid"></id>
        <result property="empName" column="emp_name"></result>
        <result property="age" column="age"></result>
        <result property="sex" column="sex"></result>
        <result property="email" column="email"></result>
        <association property="dept" javaType="Dept">
            <id property="did" column="did"></id>
            <result property="deptName" column="dept_name"></result>
        </association>
    </resultMap>

    <!--Emp getEmpAndDeptByEid(@Param("eid") Integer eid);-->
    <select id="getEmpAndDeptByEid" resultMap="empDeptMap">
        select * from t_emp left join t_dept on t_emp.did = t_dept.did where t_emp.eid = #{eid};
    </select>

在这里插入图片描述

c>分布查询

  1. 查询员工信息
    /**
     * 分布查询第一步
     * @param eid
     * @return
     */
    Emp getEmpByStepOne(@Param("eid") Integer eid);
    <resultMap id="empAndDeptByStep" type="emp">
        <id property="eid" column="eid"></id>
        <result property="empName" column="emp_name"></result>
        <result property="age" column="age"></result>
        <result property="sex" column="sex"></result>
        <result property="email" column="email"></result>
        <association property="dept" select="com.fickler.mybatis.mapper.DeptMapper.getDeptByStepTwo" column="did"></association>
    </resultMap>

    <!--Emp getEmpByStepOne(@Param("eid") Integer eid);-->
    <select id="getEmpByStepOne" resultMap="empAndDeptByStep">
        select * from t_emp where eid = #{eid};
    </select>
  1. 根据员工所对应的部门id查询部门信息
    /**
     * 分布查询第二步
     * @param did
     * @return
     */
    Dept getDeptByStepTwo(@Param("did") Integer did);
    <!--Dept getDeptByStepTwo(@Param("did") Integer did);-->
    <select id="getDeptByStepTwo" resultType="dept">
        select * from t_dept where did = #{did}
    </select>

在这里插入图片描述

分布查询的优点
可以实现延迟加载,但是必须在核心配置文件中设置全局配置信息:
lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载
aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载
此时就可以实现按需加载,获取的数据是什么,就只会执行相应的 sql。此时可通过 association 和 collection 中的 fetchType 属性设置当前的分步查询是否使用延迟加载,fetchType = “lazy(延迟加载)|eager(立即加载)”

lazyLoadingEnabled

    <!--配置MyBatis的全局变量-->
    <settings>
        <!--自动将_映射为驼峰规则-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--开启延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>
    @Test
    public void testGetEmpAndDeptByStep(){

        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
        Emp empByStepOne = empMapper.getEmpByStepOne(5);
        System.out.println(empByStepOne.getEmpName());

    }

只执行第一个 sql 语句
在这里插入图片描述
aggressiveLazyLoading

开启之后,是立即加载

    <!--配置MyBatis的全局变量-->
    <settings>
        <!--自动将_映射为驼峰规则-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--开启延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--实现立即加载-->
        <setting name="aggressiveLazyLoading" value="true"/>
    </settings>

在这里插入图片描述
fetchType

fetchType 的值为 eager,为立即加载,即使全局配置中设置为延迟加载,fetchType 可以按需设置为立即加载

    <!--配置MyBatis的全局变量-->
    <settings>
        <!--自动将_映射为驼峰规则-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--开启延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--实现立即加载-->
<!--        <setting name="aggressiveLazyLoading" value="true"/>-->
    </settings>
    <resultMap id="empAndDeptByStep" type="emp">
        <id property="eid" column="eid"></id>
        <result property="empName" column="emp_name"></result>
        <result property="age" column="age"></result>
        <result property="sex" column="sex"></result>
        <result property="email" column="email"></result>
        <association property="dept" fetchType="eager" select="com.fickler.mybatis.mapper.DeptMapper.getDeptByStepTwo" column="did"></association>
    </resultMap>

在这里插入图片描述

在这里插入图片描述

此时为 延迟加载

    <resultMap id="empAndDeptByStep" type="emp">
        <id property="eid" column="eid"></id>
        <result property="empName" column="emp_name"></result>
        <result property="age" column="age"></result>
        <result property="sex" column="sex"></result>
        <result property="email" column="email"></result>
        <association property="dept" fetchType="lazy" select="com.fickler.mybatis.mapper.DeptMapper.getDeptByStepTwo" column="did"></association>
    </resultMap>

在这里插入图片描述

在这里插入图片描述

3. 一对多映射处理

a>collection

    /**
     * 查询部门中的所有员工信息
     * @param did
     * @return
     */
    Dept getDeptEmpByDid(@Param("did") Integer did);
    <resultMap id="deptEmpByDid" type="dept">
        <id property="did" column="did"></id>
        <result property="deptName" column="dept_name"></result>
        <collection property="emps" ofType="emp">
            <id property="eid" column="eid"></id>
            <result property="empName" column="emp_name"></result>
            <result property="age" column="age"></result>
            <result property="sex" column="sex"></result>
            <result property="email" column="email"></result>
        </collection>
    </resultMap>

    <!--Dept getDeptEmpByDid(@Param("did") Integer did);-->
    <select id="getDeptEmpByDid" resultMap="deptEmpByDid">
        select * from t_dept left join t_emp on t_dept.did = t_emp.did where t_dept.did = #{did};
    </select>

在这里插入图片描述

b>分步查询

  1. 查询部门信息
    /**
     * 分布查询第一步
     * @param did
     * @return
     */
    Dept getDeptByStep(@Param("did") Integer did);
    <resultMap id="deptEmpStep" type="dept">
        <id property="did" column="did"></id>
        <result property="deptName" column="dept_name"></result>
        <collection property="emps" select="com.fickler.mybatis.mapper.EmpMapper.getEmpByStep" column="did"></collection>
    </resultMap>

    <!--Dept getDeptByStep(@Param("did") Integer did);-->
    <select id="getDeptByStep" resultMap="deptEmpStep">
        select * from t_dept where t_dept.did = #{did};
    </select>
  1. 根据部门 id 查询部门中的所有员工
    /**
     * 分组查询第二步
     * @param did
     * @return
     */
    Emp getEmpByStep(@Param("did") Integer did);
    <!--Emp getEmpByStep(@Param("eid") Integer did);-->
    <select id="getEmpByStep" resultType="emp">
        select * from t_emp where t_emp.did = #{did};
    </select>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/59338.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文详解数据链路相关技术

一文详解数据链路相关技术1.MAC地址2.共享介质型网络争用方式令牌传递3.非共享介质网络4.环路检测技术生成树方式源路由法5.VLAN1.MAC地址 MAC地址直译为媒体存取控制位址&#xff0c;也称为局域网地址&#xff08;LAN Address&#xff09;&#xff0c;MAC位址&#xff0c;以太…

云服务器使用及Linux基本命令

文章目录前言一、Linux1.Linux发现版本2.Linux环境搭建方式云服务器使用终端软件连接Linux3.Linux基础命令&#xff08;1&#xff09;ls:列出该目录下的所有子目录与文件。&#xff08;2&#xff09;pwd&#xff1a;显示当前所在用户&#xff08;3&#xff09;cd &#xff1a;改…

终于来了

程序员求职简历&#xff0c;项目经验怎么写&#xff1f;免费修改简历、提供模板并内部推荐昨天我还在说"三年了&#xff0c;乌云还未散尽&#xff0c;仿佛若有光"。今天一大早&#xff0c;光就照进来了。深圳卫健委宣布公交、地铁、药店、公园、旅游景点等场所都不需…

数据结构(王卓)(4)附:链表的销毁与清空

销毁 Status 销毁单链表(LinkList L) {LinkList p;while (L){p L;L->next;delete p;}return OK; } 运行逻辑&#xff1a; &#xff08;1&#xff09;:设定一个指针&#xff0c;让指针指向链表的头指针L &#xff08;2&#xff09;&#xff1a;让头指针等于头指针里面指向下…

Session和Cookie

回顾 1.Servlet API 2.HttpServlet DoXXX处理哪种Http方法会调用到对应的方法 init/destroy/service—>servlet的生命周期 3.HttpServletRequest Http请求 get系列方法 协议名&#xff08;版本号&#xff09; url query string header query String/body HttpServletRespon…

【配准和融合相互作用,交互】

RFNet: Unsupervised Network for Mutually Reinforcing Multi-modal Image Registration and Fusion &#xff08;RFNet&#xff1a;一种互增强的多模态图像配准与融合的无监督网络&#xff09; 本文提出了一种在相互增强的框架RFNet中实现多模态图像配准与融合的新方法。我们…

第八章 集成学习

8.1 个体与集成 集成学习通过构建并结合多个学习器来完成学习任务&#xff0c;有时也被称为多分类系统、基于委员会的学习等。 下图显示出集成学习的一般结构&#xff1a;先产生一组个体学习器&#xff0c;再用某种策略将它们结合起来。个体学习器通常由一个现有的学习算法从训…

Redis实战——分布式锁

目录 1 一人一单并发安全问题 2 分布式锁的原理和实现 2.1 什么是分布式锁&#xff1f; 2.2 分布式锁的实现 1 一人一单并发安全问题 之前一人一单的业务使用的悲观锁&#xff0c;在分布式系统下&#xff0c;是无法生效的。 理想的情况下是这样的&#xff1a;一个线程成功…

计算机中数的表示和运算

定点数 编程时需要确定小数点位置难以表示两个大小相差较大的数存储空间利用率低 这种用二进制来表示十进制的编码方式&#xff0c;叫作BCD 编码&#xff08;Binary-Coded Decimal&#xff09;。 浮点数 小数点的位置可以左右移动的数 规格化浮点数: IEEE 754规格化的尾数…

基于Java+Swing+Mysql实现《黄金矿工》游戏

基于JavaSwingMysq实现《黄金矿工》游戏一、系统介绍二、功能展示三、其他系统一、系统介绍 《黄金矿工》游戏是一个经典的抓金子小游戏&#xff0c;它可以锻炼人的反应能力。。该游戏中&#xff0c;可以通过“挖矿”获得积分&#xff0c;游戏道具&#xff1a;有3瓶药水&#…

cubeIDE开发, 如何结合FreeRTOS开发STM32程序

一、STM32CubeIDE使用内置的FreeRTOS 不同于STM32CubeIDE使用像RTThread这些第三方物联网系统&#xff0c;STM32CubeIDE在安装时就已经在MiddleWare中间件一栏直接支持了FreeRTOS操作系统。 既然STM32CubeIDE已经把FreeRTOS深度整合到了自家的系统中&#xff0c;所以移植及使用…

深度学习中的正则化——L1、L2 和 Dropout

正则化是一组技术&#xff0c;可以防止神经网络中的过度拟合&#xff0c;从而在面对来自问题域的全新数据时提高深度学习模型的准确性。 在本文中&#xff0c;我们将介绍最流行的正则化技术&#xff0c;称为 L1、L2 和 dropout。 文章目录1. 回顾&#xff1a;过拟合2.什么是正则…

【并发编程】AQS ReentrantLock 底层实现原理

一、概述 synchronized上锁机制是通过对象头来实现的&#xff0c;通过锁升级的过程来完成加锁。&#xff08;https://blog.csdn.net/zhangting19921121/article/details/106002751&#xff09; 但是synchronized锁升级的过程犹如一个黑盒&#xff0c;我们无法掌控。因此&…

常见的损失函数

1. 损失函数、代价函数与目标函数 损失函数&#xff08;Loss Function&#xff09;&#xff1a;是定义在单个样本上的&#xff0c;是指一个样本的误差。   代价函数&#xff08;Cost Function&#xff09;&#xff1a;是定义在整个训练集上的&#xff0c;是所有样本误差的平均…

07_openstack之安全组与浮动IP

目录 一、环境准备 二、浮动IP 1、浮动IP介绍 2、创建和分配浮动IP 三、安全组 1、安全组介绍 2、创建安全组 3、给云主机绑定安全组 一、环境准备 部署openstack私有云环境&#xff1a;02_openstack私有云部署_桂安俊kylinOS的博客-CSDN博客 创建项目和用户&#xf…

Mac电脑系统降级至10.15 Catalina(2020末代intel)

目录起因前期准备降级系统步骤&#xff08;联网&#xff09;选定开机阶段需要按的快捷键进入简化的macOS激活锁页面macOS实用工具页面抹除磁盘安装降级系统Catalina关于从U盘重装系统相关参考博客起因 这部分碎碎念可以不看> < 20年7月买mac是为了找工作&#xff0c;找到…

[附源码]计算机毕业设计校园商铺Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]计算机毕业设计药品仓库及预警管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

libcef.dll文件丢失怎么办?丢失对电脑有什么影响?

提到电脑中的系统文件可能大家都是不太了解的&#xff0c;毕竟平时使用电脑的时候也接触不到那些复杂的文件&#xff0c;最多大家只会使用电脑上面的各种功能&#xff0c;不过虽然接触不到但是大家也要适当的了解一下&#xff0c;就比如libcef.dll文件丢失了就会造成电脑系统出…

Word2Vec详解

Word2Vec 基本思想&#xff1a;通过训练将每一个词映射成一个固定长度的向量&#xff0c;所有向量构成一个词向量空间&#xff0c;每一个向量&#xff08;单词)可以看作是向量空间中的一个点&#xff0c;意思越相近的单词距离越近。 如何把词转换为向量&#xff1f; 通常情况…