MyBatis 自定义映射 ResultMap:一对多映射关系处理

在 MyBatis 中处理一对多(或称为一对集合)的映射关系时,我们通常会使用 collection 标签或分布查询来定义这种关系。这种关系常见于一个部门有多个员工这样的场景。下面我们将详细探讨如何使用 MyBatis 的 resultMap 来处理这种一对多的关系。

实体类定义

首先,我们有两个实体类:Dept(部门)和 Emp(员工)。其中 Dept 类包含一个 List<Emp> 类型的 emps 属性,表示该部门下的所有员工。

public class Dept {  private Integer did;  private String deptName;  private List<Emp> emps;  // 省略构造器、getter 和 setter 方法  
}  
public class Emp {  private Integer eid;  private String empName;  private Integer age;  private String sex;  private String email;  // 省略构造器、getter 和 setter 方法  
}

使用 collection 标签

在 MyBatis 的映射文件中,我们使用 collection 标签来处理一对多的映射关系。ofType 属性指定了集合中元素的类型。

<resultMap id="DeptAndEmpResultMap" type="Dept"><id property="did" column="did"></id><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><!--Dept getDeptAndEmp(@Param("did") Integer did);-->
<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>

分步查询处理一对多映射

分步查询是一种更加灵活的方式,它允许我们先查询主对象(如部门),然后再根据主对象的信息去查询与之关联的子对象(如员工)。在 MyBatis 中,我们可以使用 collection 标签的 select 属性来指定子查询的 SQL 映射 ID。

  1. 首先查询部门信息
/*** 通过分步查询,查询部门及对应的所有员工信息* 分步查询第一步:查询部门信息* @param did * @return com.example.mybatis.pojo.Dept*/
Dept getDeptAndEmpByStepOne(@Param("did") Integer did);
<resultMap id="DeptAndEmpByStepOneResultMap" type="Dept"><id property="did" column="did"></id><result property="deptName" column="dept_name"></result><collection property="emps"select="com.exapmle.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo"column="did"></collection>
</resultMap><!--Dept getDeptAndEmpByStepOne(@Param("did") Integer did);-->
<select id="getDeptAndEmpByStepOne" resultMap="DeptAndEmpByStepOneResultMap">select * from t_dept where did = #{did}
</select>
  1. 再根据部门 id 查询部门中的所有员工
/*** 通过分步查询,查询部门及对应的所有员工信息* 分步查询第二步:根据部门id查询部门中的所有员工* @param did* @return java.util.List<com.exapmle.mybatis.pojo.Emp>*/
List<Emp> getDeptAndEmpByStepTwo(@Param("did") Integer did);
<!--List<Emp> getDeptAndEmpByStepTwo(@Param("did") Integer did);-->
<select id="getDeptAndEmpByStepTwo" resultType="Emp">select * from t_emp where did = #{did}
</select>

在分步查询中,主查询(getDeptAndEmpByStepOne)首先执行,然后对于主查询结果中的每个部门,都会执行一次子查询(getDeptAndEmpByStepTwo)来获取该部门下的所有员工。这种方式的好处是它可以减少一次性从数据库中加载的数据量,提高性能。但是,它也会增加数据库访问的次数。因此,在选择是否使用分步查询时,需要根据实际情况进行权衡。

总结

MyBatis 的 resultMap 提供了强大的自定义映射功能,可以灵活地处理各种复杂的数据关系。在处理一对多映射关系时,我们可以使用 collection 标签来定义这种关系,并通过设置 ofType 属性来指定集合中元素的类型。

此外,我们还可以使用分步查询的方式来优化性能。无论选择哪种方式,都需要根据实际需求进行权衡和选择。

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

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

相关文章

Nginx反向代理Kingbase数据库

本文适用于开发人员学习运维领域知识&#xff0c;主要内容为在个人理解的基础上对企业级开发中所使用的Nginx和数据库kingbase相关使用&#xff0c;并附上Nginx反向代理kingbase数据库的相关配置的操作方式&#xff0c;感谢阅读 为什么是nginx代理kingbase数据库服务端 生产环…

JAVA学习笔记DAY6——SSM_Spring

文章目录 技术体系结构单体架构分布式架构 框架 FrameworkSpringIoc容器和核心概念组件Spring管理组件优点Spring Ioc 容器和容器实现普通容器复杂容器SpringIoc容器具体接口和实现类SpringIoc 容器管理配置方式 SpringIoc Ioc DI Spring Ioc 实践和应用Spring Ioc创建步骤配置…

【VUE3学习手札】

VUE3学习手札 vue3成长之路学习笔记 文章目录 VUE3学习手札前言一、markRaw1.1 代码示例1.2 应用场景1.3 拓展&#xff08;toRaw&#xff09;1.4 实际应用 二、ref 和 reactive 前言 主要用于自己的一个备忘&#xff0c;对知识点的查缺补漏 一、markRaw 将一个对象标记为不可被…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 02:设计并使用断言

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

6spark期末复习

1)var a:Double5;var b:Int7;那么print(a*b) 2) var a:Int5; var bif(a>6) 7 println(b) 3)var a:Int16; var b:Int13; var cif(a>b) 5 else 7; println(c) 4. object TestDemo { print("B") def main(args: Array[String]): Unit { } } 5 def mai…

JeecgFlow排他网关演示

排他网关概念理解 排他网关&#xff0c;也称为异或(XOR)网关&#xff0c;用于流程中实现分支决策建模。排他网关需要搭配条件顺序流使用。 当流程流转到排他网关时&#xff0c;所有流程顺序流都是会顺序求解&#xff0c; 其中第一条条件为true的顺序流会被选中(当有多条顺序流都…

澳汰尔(Altair)3D 打印部件设计仿真——打造高效的增材制造设计

借助 Inspire Print3D&#xff0c;可加速创新、结构高效的 3D 打印部件的创建、优化和研究&#xff0c;提供快速准确的工具集&#xff0c;可用于实现选择性激光熔融 (SLM) 部件的设计和过程仿真。 工程师可以快速了解影响可制造性的工艺或设计变更&#xff0c;然后将部件和支撑…

JWT的优势

1、无状态&#xff1a; 2、有效避免了 CSRF 攻击&#xff1a;CSRF攻击&#xff0c;采用的是cookie进行攻击的&#xff1b;也避免XSS攻击&#xff0c;XSS采用的是js脚本进行攻击。 3、适合移动端应用&#xff1a;移动端没有cookie&#xff0c;jwt 4、单点登录友好&#xff1a…

SoC设计更重要的是IP管理

对于大多数片上系统&#xff08;SoC&#xff09;设计来说&#xff0c;最关键的任务不是RTL编码&#xff0c;甚至不是创建芯片架构。今天&#xff0c;SoC的设计主要使用来自多个供应商的各种IP块。这使得管理硅IP成为SoC设计过程中的主要任务。 一般来说&#xff0c;新编写的RTL…

Swift Combine — JUST Publisher

之前文章介绍的Publisher都是可以连续发送数据的&#xff0c;Subscriber也可以一直接收数据&#xff0c;除非收到了finished或者error而结束。而JUST Publisher则不同&#xff0c;它只向每个订阅者发送一次输出&#xff0c;然后结束。 一起来看一下下面的代码。 class JustVi…

从0到1:手动测试迈向自动化——手机web应用的自动化测试工具

引言&#xff1a; 在当今移动互联网时代&#xff0c;手机web应用已经成为人们生活中不可或缺的一部分。为了保证手机web应用的质量和稳定性&#xff0c;自动化测试工具变得十分重要。本文将介绍手机web应用自动化测试工具的选择和使用&#xff0c;提供一份超详细且规范的指南&a…

GPT3.5的PPO目标函数怎么来的:From PPO to PPO-ptx

给定当前优化的大模型 π \pi π&#xff0c;以及SFT模型 π S F T \pi_{SFT} πSFT​ 原始优化目标为: max ⁡ E ( s , a ) ∼ R L [ π ( s , a ) π S F T ( s , a ) A π S F T ( s , a ) ] \max E_{(s,a)\sim RL}[\frac{\pi(s,a)}{\pi_{SFT}(s,a)}A^{\pi_{SFT}}(s,a)] m…

力扣668.乘法表中第k小的数

力扣668.乘法表中第k小的数 二分查找 是否有k个比mid小的数 class Solution {public:int findKthNumber(int m, int n, int k) {auto check [&](int mid) -> bool{int res0;int row 1,col n;while(row < m){if(row * col < mid){res col;if(res > k) re…

软件测试全面指南:提升软件质量的系统流程

一、引言 随着软件行业的飞速发展&#xff0c;确保软件质量、稳定性和用户体验已成为企业竞争的关键。本文档旨在为测试团队提供一套全面的软件测试指南&#xff0c;通过规范测试用例管理、功能测试、接口测试、性能测试及缺陷管理等流程&#xff0c;助力测试团队实现高效、系统…

重构大学数学基础_week05_雅各比矩阵与雅各比行列式

这周来讲一下雅各比矩阵和雅各比行列式。 多元函数的局部线性属性 首先我们来回顾一下向量函数&#xff0c;就是我们输入一个向量&#xff0c;输出也是一个向量&#xff0c;我们假设现在有一个向量函数 这个函数意思就是在说&#xff0c;我们在原来的平面上有一个向量(x,y),经…

美团Meitu前端一面,期望27K

面经哥只做互联网社招面试经历分享&#xff0c;关注我&#xff0c;每日推送精选面经&#xff0c;面试前&#xff0c;先找面经哥 1、做的主要是什么项目&#xff0c;桌面端的吗&#xff1f; 2、用的主要是什么技术栈&#xff1f;vue有了解吗&#xff1f; 3、移动端开发一般怎么…

使用Ventoy制作U盘启动安装系统

简介 Ventoy是一个制作可启动U盘的开源工具。 无需反复地格式化U盘。你只要制作一次U盘启动盘&#xff0c;后面你只需要把 ISO/WIM/IMG/VHD(x)/EFI 等类型的系统镜像文件直接拷贝到U盘里面就可以启动了&#xff0c;无需其他操作。可以一次性拷贝很多个不同类型的镜像文件&…

vue+element-plus完美实现跨境电商商城网站

目录 一、项目介绍 二、项目截图 1.项目结构图 2.首页 3.中英文样式切换 4.金钱类型切换 5.商品详情 6.购物车 7.登录 ​编辑 8.注册 9.个人中心 三、源码实现 1.项目依赖package.json 2.项目启动 3.购物车页面 四、总结 一、项目介绍 本项目在线预览&am…

深入解析Python闭包:定义、实例与应用

深入解析Python闭包&#xff1a;定义、实例与应用 引言 在Python编程中&#xff0c;闭包&#xff08;Closure&#xff09;是一个强大而实用的概念。它允许函数记住并访问其词法作用域&#xff08;lexical scope&#xff09;&#xff0c;即使在函数执行完毕后&#xff0c;其内…

提拔你,还是干掉你,从来不是看技术

有读者问我&#xff0c;技术人员工作5~10年就逐渐拉开了差距&#xff0c;这背后的原因是什么&#xff1f;思考片刻后&#xff0c;我回答&#xff1a;是底层能力。 K哥有20年职场经验&#xff0c;从程序员到技术高管一路走来&#xff0c;我总结了技术人员最重要的一些认知和底层…