MyBatis七:自定义映射resultMap

2023-11-07

自定义映射resultMap

一、resultMap处理字段和属性的映射关系
  1. 为字段设置别名,是别名和属性名一致(方式一)
    <select id="getAllEmp" resultType="Emp">
        select eid, emp_name empName, age, sex, email from t_emp where eid = #{eid}
    </select>
    
  2. 在mybatis-config.xml中,使用setting标签设置全局变量(方式二)
    <settings>
        <!-- 将数据库中的带下划线的字段名映射为驼峰命名方式。如emp_name:empName -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    
  3. 使用resultMap设定(方式三)
    <mapper namespace="com.atguigu.mybatis.mapper.EmpMapper">
        <!--
            resultMap:设置自定义映射关系
            id:唯一标识,不能重复
            type:设置映射关系中的实体类类型
            子标签:、
            id:设置主键的关系
            result:设置普通字段的映射关系
            属性:
            property:设置映射关系中的属性名,且必须是type属性所设置的实体类类型中的属性名
            column:设置映射关系中的数据表中的字段名,
        -->
        <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>
       
        <select id="getAllEmp" resultMap="empResultMap">
            select * from t_emp where eid = #{eid}
        </select>
    </mapper>
    
二、多对一
  1. 表和表之间有对应关系,则与表相对应的实体类之间也有关系,故要在多对一关系中的多的实体类中创建一的实体类对象属性

    public class Emp{
        private Integer eid;
        private String empName;
        private Integer age;
        private Character sex;
        private String email;
        // 关系中一的对象属性
        private Dept dept;
        
        public Emp() {}
        // 全参构造器中没有对象属性	
        public Emp(Integer eid, String empName, Integer age, Character sex, String email) 
        {
            this.eid = eid;
            this.empName = empName;
            this.age = age;
            this.sex = sex;
            this.email = email;
        }
        
        // 以及各属性的get/set/toString方法
    }
    
  2. 使用级联属性赋值,解决多对一的映射问题(方式一)
    <!-- 处理多对一的映射关系方式一 -->
    <resultMap id="empAndDeptMapOne" 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>
    
    <select id="getEmpAndDept" resultMap="empAndDeptMapOne">
        select * from t_emp left join t_dept on t_emp.did = t_dept.did where t_emp.eid = #{eid}
    </select>
    
  3. 使用association标签,解决多对一的映射问题(方式二)
    javaType:一的实体类型
    <!-- 处理多对一的映射关系方式二 -->
    <resultMap id="empAndDeptMapTwo" 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>
    
    <select id="getEmpAndDept" resultMap="empAndDeptMapTwo">
        select * from t_emp left join t_dept on t_emp.did = t_dept.did where t_emp.eid = #{eid}
    </select>
    
  4. 使用分步查询,解决多对一的映射问题(方式三)
    第一步
    mapper接口
    public interface EmpMapper {
        // 分步查询员工及员工所对应的部门信息第一步
        Emp getEmpAndDeptByStepOne(@Param("eid") Integer eid);
    }
    
    mapper映射文件
    <resultMap id="empAndDeptByStepResultMap" type="Emp">
        <id property="eid" column="eid"/>
        <result property="empName" column="emp_name"/>
        <result property="age" column="age"/>
        <result property="sex" column="sex"/>
        <result property="email" column="email"/>
        <!-- 
    		property:关联的实体类属性		
    		select:是第二步中查询该实体类的sql语句对应的接口中的方法的全类名
    		column:第二步sql语句查询的条件					
    	-->
        <association property="dept"
                     select="com.atguigu.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
                     column="did"/>
    </resultMap>
    
    <select id="getEmpAndDeptByStepOne" resultMap="empAndDeptByStepResultMap">
        select * from t_emp where eid = #{eid}
    </select>
    
    第二步
    mapper接口
    public interface DeptMapper {
        // 分步获取部门以及部门中所有员工的信息
        Dept getDeptAndEmpByStepTwo(@Param("did") Integer did);
    }
    
    mapper映射文件
    <!-- 此处使用resultType就可以了 -->
    <select id="getEmpAndDeptByStepTwo" resultType="Dept">
        select * from t_dept where did  = #{did}
    </select>
    
三、延迟加载
  1. 分步查询的优点:就是可以**实现延迟加载

  2. lazyLoadingEnabled

    延迟加载的全局开关,默认关闭(false),开启后,所有关联对象都会延迟加载

    <!-- 在mybatis-config.xml中 -->
    <settings>
        <!-- 处理字段名和属性名对应的方法一:将数据库中的带下划线字段名映射为驼峰命名方式。如emp_name:empName -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!-- 开启延迟加载 -->
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>
    
  3. aggressiveLazyLoading

    开启时,任何方法的调用都会加载该对象的所有属性,即延时加载无效

    关闭时:每个属性会按需加载,即延时加载有效(默认)

  4. fetchType

    对单个映射功能是否延时加载进行单独设置

    <resultMap id="empAndDeptByStepResultMap" type="Emp">
        <id property="eid" column="eid"/>
        <result property="empName" column="emp_name"/>
        <result property="age" column="age"/>
        <result property="sex" column="sex"/>
        <result property="email" column="email"/>
        <!-- 
    		fetchType:用于在setting中设置了全局延迟加载后,对该映射功能是否延迟加载进行单独设置 
        	lazy表示延时加载(默认)
    		eager表示不延时加载
    	-->
        <association property="dept"
                     select="com.atguigu.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
                     column="did"
                     fetchType="lazy"/>
    </resultMap>
    
  5. 测试
    @Test
    public void empAndDeptMapByStepTest() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = mapper.getEmpAndDeptByStepOne(3);
        // 开启延时加载,如果只是获取empName属性,并不会执行第二步
        System.out.println(emp.getEmpName());
        System.out.println("+++++++++++++++++++++++++++++++++");
        System.out.println(emp.getDept());
    }
    

    在这里插入图片描述

四、一对多
  1. 在一对多关系中的一的实体类中创建多的实体类对象属性
    public class Dept {
        private Integer did;
        private String deptName;
        private List<Emp> emps;
    
        public Dept() {
        }
    
        public Dept(Integer did, String deptName) {
            this.did = did;
            this.deptName = deptName;
        }
        
        // 全部属性的get/set/toString方法
    }
    
  2. 使用collocation标签,解决一对多的映射问题(方式一)
    第一步
    mapper接口
    public interface DeptMapper {
        // 获取部门以及部门中所有员工的信息
        Dept getDeptAndEmp(@Param("did") Integer did);
    }
    
    mapper映射文件
    <!-- ofType:在列表中的类型 -->
    <resultMap id="DeptAndEmpResultMap" type="Dept">
        <id property="did" column="did"/>
        <result property="deptName" column="dept_name"/>
        <collection property="emps" ofType="Emp">
            <id property="eid" column="eid"/>
            <result property="empName" column="emp_name"/>
            <result property="age" column="age"/>
            <result property="sex" column="sex"/>
            <result property="email" column="email"/>
        </collection>
    </resultMap>
    
    <select id="getDeptAndEmp" resultMap="DeptAndEmpResultMap">
        select * from t_dept left join t_emp on t_dept.did = t_emp.did where t_dept.did = #{did}
    </select>
    
  3. 使用collocation标签,解决一对多的映射问题(方式一)
    第一步
    mapper接口
    public interface DeptMapper {
        // 分步获取部门以及部门中所有员工的信息
        Dept getDeptAndEmpByStepOne(@Param("did") Integer did);
    }
    
    mapper映射文件
    <resultMap id="DeptAndEmpResultByStepMap" type="Dept">
        <id property="did" column="did"/>
        <result property="dept_name" column="deptName"/>
        <collection property="emps"                	 												   select="com.atguigu.mybatis.mapper.EmpMapper.deptAndEmpResultByStepTwo"
                    column="did">
        </collection>
    </resultMap>
    
    <select id="getDeptAndEmpByStepOne" resultMap="DeptAndEmpResultByStepMap">
        select * from t_dept where did = #{did}
    </select>
    
    第二步
    mapper接口
    public interface DeptMapper {
        // 分步获取部门以及部门中所有员工的信息
        List<Emp> deptAndEmpResultByStepTwo(@Param("did") Integer did);
    }
    
    mapper映射文件
    <select id="deptAndEmpResultByStepTwo" resultType="Emp">
        select * from t_emp where did = #{did}
    </select>
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis七:自定义映射resultMap 的相关文章

随机推荐

  • 什么是模块化?模块化的好处?

    什么是模块化 模块化就是将js文件按照功能分离 根据需求引入不同的文件中 源于服务器端 模块化好处 1 解耦 对业务进行模块化拆分后 为了使各业务模块间解耦 因此各个都是独立的模块 它们之间是没有依赖关系 2 复用 每个模块负责的功能不同
  • Element UI更改下拉菜单el-dropdown-menu样式

    Element UI更改下拉菜单el dropdown menu样式 源代码
  • [网络安全自学篇] 八十一.WHUCTF之WEB类解题思路WP(文件上传漏洞、冰蝎蚁剑、反序列化phar)

    这是作者网络安全自学教程系列 主要是关于安全工具和实践操作的在线笔记 特分享出来与博友们学习 希望您喜欢 一起进步 前文分享了WHUCTF部分题目 包括代码审计 文件包含 过滤绕过 SQL注入 这篇文章将讲解Easy unserialize
  • 接口文档生成工具ApiPost挺好用

    作为一名程序员我深知一款好用的软件工具对工作效率的提升意味着什么 相信不少程序员还在依靠老外们做的软件处理手头工作 曾经我也是其中一员 不过现在我已经开始迷上了国产软件 国外的自然后他的优势 但国产软件工具也吸引了不少程序员开始尝试 虽然他
  • tensorflow2学习笔记

    目录 Tensorflow2 0特性 构架 TensorflowDemo AlexNet 过拟合 卷积后矩阵尺寸大小的计算 代码地址 VGG 感受野 网络结构 代码地址 GoogLeNet GoogLeNet网络结构 参数 Inceptio
  • [机器学习笔记-3]识别服饰图像的神经网络

    目录 1 安装tensorflow数据集 命令行输入 导入依赖 2 导入Fasion MINST数据集 3 处理数据 4 构建模型 5 训练模型 6 评估准确度 7 预测数据 8 图表显示数据 jupyter notebook中运行注意事项
  • 2020年最新的PHP面试题(附答案)

    684 PHP究竟是不是最好的语言 一直以来是程序员最大的 争议 但毋庸置疑的是 PHP绝对是最有前途和力量的变成语言 也是你入门最值得学习的语言 为什么这么说呢 不妨来了解一下 为什么学PHP 语言入门简单 容易掌握 程序建设性好 开发者
  • javaWeb的项目路径问题(对servlet路径和form表单请求路径的一些归纳)

    javaWeb项目的路径问题 这篇文章大神将路径问题讲的很透彻 我想说的是几点小细节 博主说的很清楚 如果这里的deployment下面的application context中不单单仅是一个 后面加的有其他字符的话 在form表单中我们填
  • 深聊测开领域之:Testcase中资源泄露

    1 引言 2 何为资源泄露 2 1 资源泄露定义 2 2 TestCase 中资源泄露 3 避免资源泄露 3 1 如何避免资源泄露 3 2 自动化执行顺序 1 引言 执行测试时离不开测试用例 测试用例辅佐执行测试 这就好比皇帝与宰相 需要的
  • jekyll网站上传服务器,jekyll 高效搭建个人博客之完整流程

    jekyll png 原创精选来自我的博客文章 目录 说在前面的话 作为一个和电脑 代码打交道的我 一直都想拥有自己的博客 一切都显得那么高 zhuang 大 bi 上 yong 在下定决心之后就在网上到处查找资料 最终发现一般用的就三种
  • 定时任务之Springboot整合Quartz详解

    文章目录 一 什么是Quartz 二 为什么使用Quartz 1 为什么要用定时任务 2 为什么使用Quartz 三 常见开源定时任务的框架的异同 四 Quartz的组件 五 Quartz持久化 1 为什么要持久化 2 Quartz提供了两
  • 解决openwrt ipk missing dependencies libpthread librt

    新版本的trunk有在ipk打包的过程中的bug 他不能自动识别SDK中已经变异的动态链接库 比如libpthread libboost这些 解决方案是修改与pakage里同级的makefile的内容 可以修改如下 主要是添加DEPENDS
  • JavaScprit---基础代码

    var text Hello World document write p text indexOf Hello p document write p text indexOf World p document write p text i
  • MySQL中Select+Update并发的更新问题

    小知识补充 首先 我们要知道在mysql中update操作都是线程安全的 mysql引擎会update的行加上 排他锁 其他对该行的update操作需要等到第一个update操作提交成功或者回滚 才能获取这个 排他锁 从而对该行进行操作 例
  • 程序员如何进行职业规划?

    本文来自作者 王俊生 在 GitChat 上分享 程序员如何进行职业规划 阅读原文 查看交流实录 文末高能 编辑 哈比 一直以来程序员这一职业都给人高薪资的印象 近年来随着互联网行业的快速发展 程序员更是人满为患 然而很多人关注的却是程序员
  • MOS管电源开关电路的软启动

    https mp weixin qq com s 5W8rveh69XVzJoRX XrSfgbeizhu 仅用于标注 适用于我这样的硬件小白
  • React你应该学会的开发技巧【总结】!

    关注公众号 前端人 回复 加群 添加无广告优质学习群 干净的代码不仅仅是工作代码 简洁的代码易于阅读 易于理解并且井井有条 在本文中 我们将研究六种编写更简洁的React代码的方法 在阅读这些建议时 请务必记住它们的实质 相信这些实践对我们
  • 链表两数相和 (2)--Leetcode

    题目描述 给出两个 非空 的链表用来表示两个非负的整数 其中 它们各自的位数是按照 逆序 的方式存储的 并且它们的每个节点只能存储 一位 数字 如果 我们将这两个数相加起来 则会返回一个新的链表来表示它们的和 您可以假设除了数字 0 之外
  • 通过在线游戏练习flex布局和各种css选择器

    懒是一个很好的托辞 说的好像你勤奋了就能干成大事一样 序言 不知道身为后端程序员的你写不写前端代码 反正我是经常写 调布局和样式着实有点费劲 一般像我这样的后端开发都不会系统的去学一些前端知识 都是遇到了就百度 然后复制粘贴一下 再不停的让
  • MyBatis七:自定义映射resultMap

    自定义映射resultMap 一 resultMap处理字段和属性的映射关系 为字段设置别名 是别名和属性名一致 方式一