自定义映射resultMap

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

正常来说属性名和字段名不一致就不能正确赋值。
简单做法就是都改为一致,但是属性名有驼峰命名规则,字段有下划线_的命名规则。
若字段名和实体类中的属性名不一致,此时也可通过以下两种方式处理字段名和实体类中的属性的映射关系。

  1. 可以通过为字段起别名的方式,保证和实体类中的属性名保持一致。
    在这里插入图片描述
    字段名为emp_name,属性名为empName;
    在这里插入图片描述
    字段名为name,属性名为userName;
  2. 如果字段名符合数据库的规则(使用_),实体类中的属性名符合Java的规则(使用驼峰)可以在MyBatis的核心配置文件中设置一个全局配置信息mapUnderscoreToCamelCase,可以在查询表中数据时,自动将_类型的字段名转换为驼峰例如:字段名user_name,设置了mapUnderscoreToCamelCase,将_映射为驼峰,此时字段名就会转换为userName,mybatisplus自动开启了此功能。
  3. 若字段名和实体类中的属性名不一致,则可以通过resultMap设置自定义映射(resultType是字段名和实体类中的属性名一致时使用)用它来处理有点浪费,不推荐,正常是用来处理一对多或多对一
<!--
resultMap:设置自定义映射
属性:
id:表示自定义映射的唯一标识
type:查询的数据要映射的实体类的类型
子标签:
id:设置主键的映射关系
result:设置普通字段的映射关系
association:设置多对一的映射关系
collection:设置一对多的映射关系
属性:
property:设置映射关系中实体类中的属性名,必须是type属性所设置的实体类类型中的属性名
column:设置映射关系中表中的字段名,必须是sql语句查询出的字段名
-->
<resultMap id="userMap" type="User"><id property="id" column="id"></id><result property="userName" column="user_name"></result><result property="password" column="password"></result><result property="age" column="age"></result><result property="sex" column="sex"></result>
</resultMap><!--List<User> testMohu(@Param("mohu") String mohu);-->
<select id="testMohu" resultMap="userMap">
<!--select * from t_user where username like '%${mohu}%'-->
select id,user_name,password,age,sex from t_user where user_name like concat('%',#{mohu},'%')
</select>

2、多对一映射处理

查询员工信息以及员工所对应的部门信息

  1. 级联方式处理映射关系
<resultMap id="empDeptMap" type="Emp"><id column="eid" property="eid"></id><result column="ename" property="ename"></result><result column="age" property="age"></result><result column="sex" property="sex"></result><result column="did" property="dept.did"></result><result column="dname" property="dept.dname"></result>
</resultMap><!--Emp getEmpAndDeptByEid(@Param("eid") int eid);-->
<select id="getEmpAndDeptByEid" resultMap="empDeptMap">
select emp.*,dept.* from t_emp emp left join t_dept dept on emp.did =dept.did where emp.eid = #{eid}
</select>
  1. 使用association处理映射关系
<resultMap id="empDeptMap" type="Emp"><id column="eid" property="eid"></id><result column="ename" property="ename"></result><result column="age" property="age"></result><result column="sex" property="sex"></result><!--association:处理多对一的映射关系property:需要处理多对一映射关系的属性名javaType:该属性的类型--><association property="dept" javaType="Dept"><id column="did" property="did"></id><result column="dname" property="dname"></result></association>
</resultMap><!--Emp getEmpAndDeptByEid(@Param("eid") int eid);-->
<select id="getEmpAndDeptByEid" resultMap="empDeptMap">
select emp.*,dept.* from t_emp emp left join t_dept dept on emp.did =dept.did where emp.eid = #{eid}
</select>
  1. 分步查询(推荐
    1)查询员工信息
/**
* 通过分步查询查询员工信息
* @param eid
* @return
*/
Emp getEmpByStep(@Param("eid") int eid);
<resultMap id="empDeptStepMap" type="Emp"><id column="eid" property="eid"></id><result column="ename" property="ename"></result><result column="age" property="age"></result><result column="sex" property="sex"></result><!--select:设置分步查询,查询某个属性的值的sql的标识(namespace.sqlId)column:将sql以及查询结果中的某个字段设置为分步查询的条件(员工的did)--><association property="dept"select="com.atguigu.MyBatis.mapper.DeptMapper.getEmpDeptByStep"column="did"></association>
</resultMap><!--Emp getEmpByStep(@Param("eid") int eid);-->
<select id="getEmpByStep" resultMap="empDeptStepMap">
select * from t_emp where eid = #{eid}
</select>

2)根据员工所对应的部门id查询部门信息

/**
* 分步查询的第二步:根据员工所对应的did查询部门信息
* @param did
* @return
*/
Dept getEmpDeptByStep(@Param("did") int did);
<!--Dept getEmpDeptByStep(@Param("did") int did);-->
<select id="getEmpDeptByStep" resultType="Dept">select * from t_dept where did = #{did}
</select>

3、一对多映射处理

  1. collection
/*** 根据部门id查新部门以及部门中的员工信息* @param did* @return*/Dept getDeptEmpByDid(@Param("did") int did);
<resultMap id="deptEmpMap" type="Dept"><id property="did" column="did"></id><result property="dname" column="dname"></result><!--ofType:设置collection标签所处理的集合属性中存储数据的类型--><collection property="emps" ofType="Emp"><id property="eid" column="eid"></id><result property="ename" column="ename"></result><result property="age" column="age"></result><result property="sex" column="sex"></result></collection>
</resultMap><!--Dept getDeptEmpByDid(@Param("did") int did);-->
<select id="getDeptEmpByDid" resultMap="deptEmpMap">
select dept.*,emp.* from t_dept dept left join t_emp emp on dept.did =
emp.did where dept.did = #{did}
</select>
  1. 分步查询
    1)查询部门信息
/**
* 分步查询部门和部门中的员工
* @param did
* @return
*/
Dept getDeptByStep(@Param("did") int did);
<resultMap id="deptEmpStep" type="Dept"><id property="did" column="did"></id><result property="dname" column="dname"></result><collection property="emps"fetchType="eager"select="com.atguigu.MyBatis.mapper.EmpMapper.getEmpListByDid" column="did"></collection>
</resultMap><!--Dept getDeptByStep(@Param("did") int did);-->
<select id="getDeptByStep" resultMap="deptEmpStep">
select * from t_dept where did = #{did}
</select>

2)根据部门id查询部门中的所有员工

/**
* 根据部门id查询员工信息
* @param did
* @return
*/
List<Emp> getEmpListByDid(@Param("did") int did);
<!--List<Emp> getEmpListByDid(@Param("did") int did);-->
<select id="getEmpListByDid" resultType="Emp">select * from t_emp where did = #{did}
</select>

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iPhone 14四款机型电池容量详细参数揭秘

苹果推出的iPhone 14系列与2021系列的设计和外形尺寸相同&#xff08;仅缩小了几分之一毫米&#xff09;&#xff0c;所以这并不奇怪&#xff0c;但电池容量也大致相同。 虽然可能不足以对电池寿命产生可衡量的影响&#xff0c;但也存在微小的差异。不同的是&#xff0c;现在有…

探索Kubernetes的高可用性:单master集群和多master节点集群方案

一、单Master集群 k8s 集群是由一组运行 k8s 的节点组成的&#xff0c;节点可以是物理机、虚拟机或者云服务器。k8s 集群中的节点分为两种角色&#xff1a;master 和 node。 master 节点&#xff1a;master 节点负责控制和管理整个集群&#xff0c;它运行着一些关键的组件&…

【excel密码】excel文件加密方法总结:

想要给Excel文件进行加密&#xff0c;方法有很多&#xff0c;今天分享三种Excel加密方法给大家。 打开密码 设置了打开密码的excel文件&#xff0c;打开文件就会提示输入密码才能打开excel文件&#xff0c;只有输入了正确的密码才能打开并且编辑文件&#xff0c;如果密码错误…

SpringCloud(34):Nacos服务发现

1 从单体架构到微服务 1.1单体架构 Web应用程序发展的早期,大部分web工程师将所有的功能模块打包到一起并放在一个web容器中运行,所有功能模块使用同一个数据库,同时,它还提供API或者UI访问的web模块等。 尽管也是模块化逻辑,但是最终它还是会打包并部署为单体式应用,这…

SM5202 是一款完整的采用恒定电流/恒定电压的单节锂电池线性充电器

简介&#xff1a; SM5202 是一款完整的采用恒定电流/恒定电压的单节锂电池线性充电器&#xff0c;并带有锂电池正负极反接保护功能&#xff0c;可以保护芯片和用户安全。由于采用了内部 PMOSFET 架构&#xff0c;加上防倒充电路&#xff0c;所以不需要外部检测电阻和隔离二极管…

递归算法学习——N皇后问题,单词搜索

目录 ​编辑 一&#xff0c;N皇后问题 1.题意 2.解释 3.题目接口 4.解题思路及代码 二&#xff0c;单词搜索 1.题意 2.解释 3.题目接口 4.思路及代码 一&#xff0c;N皇后问题 1.题意 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上…

使用docker搭建owncloud Harbor 构建镜像

1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 2、安装搭建私有仓库 Harbor 3、编写Dockerfile制作Web应用系统nginx镜像&#xff0c;生成镜像nginx:v1.1&#xff0c;并推送其到私有仓库。具体要求如下&#xff1a; &#xff08;1&#xff09;基于centos基础…

QT/C++获取电脑系统,主板型号,CPU型号,硬盘型号,内存大小等相关信息(二)通过Windows Server (WMI)查询

Qt/C调用windows Api库通过wmi的方式查询电脑能获取更多详细信息&#xff0c;也更加合理有技术性。 建议使用MSCV编译器&#xff0c;如MSCV 2017 ,Qt版本 : 5.13.1 目录导读 关于 WMI示例&#xff1a;创建 WMI 应用程序示例&#xff1a;打印Wmi执行的查询项的所有属性头文件引用…

基于缓冲原理计算轨迹相似度

目录 前言预备知识思路与核心代码优缺点分析数值实验参考文献 前言 接上文&#xff0c;我们已经知道如何利用夹角余弦来计算两条轨迹的相似度&#xff0c;也知道其中优势和劣势&#xff0c;夹角余弦方法作为一个基础的baseline有其存在的价值&#xff0c;很多学者也提出了各式…

【autodesk】浏览器中渲染rvt模型

使用Forge完成渲染 Forge是什么 为什么能够渲染出来rvt模型 Forge是由Autodesk开发的一套云端开发平台和工具集。在Forge平台中&#xff0c;有一个名为"Model Derivative"的服务&#xff0c;它可以将包括RVT&#xff08;Revit&#xff09;在内的多种BIM&#xff08…

学习笔记二十:Pod生命周期-启动钩子、停止钩子

Pod生命周期-启动钩子、停止钩子 Pod生命周期pod在整个生命周期的过程中总会处于以下几个状态&#xff1a;pod生命周期的重要行为&#xff1a;容器探测三种探针用于Pod检测 容器的重启策略定义是否重启Pod对象pod的终止过程 Init容器初始化容器与主容器区别是:初始化容器使用 P…

人工智能客服:是跨境电商未来的趋势吗?

随着跨境电商的快速发展&#xff0c;客户服务成为了商家们越来越关注的焦点。而在客户服务领域中&#xff0c;人工智能客服正逐渐崭露头角。那么&#xff0c;人工智能客服是否是跨境电商未来的趋势呢&#xff1f;本文将探讨这个问题&#xff0c;并揭示人工智能客服的潜力和优势…