Mybatis实现一对多映射处理
一、概述
一对多关系表示一个实体对象(一)可以拥有多个关联对象(多)。
例如,一个用户可以有多个订单,或者一个部门可以有多个员工。
在数据库中,一对多关系通常通过外键来实现。
二、创建数据模型
定义实体类:定义主表实体类和从表实体类,主表实体类 中包含 从表实体类 的List集合属性。
现在我们以此来创建面向对象语言的对象数据模型:
Dept.java
public class Dept { private Integer did; private String deptName; private List<Emp> emps;//用于表示数据库一对多的关系 // 省略构造函数和getter/setter方法 }
Emp.java
public class Emp { private Integer eid; private String empName; private Integer age; private String sex; private String email; // 省略构造函数和getter/setter方法 }
三、问题
假设我们现在又两张表,一张员工表,一张部门表,现在我们要获取部门以及该部门中所有的员工信息
四、解决方案
1、方案一:collection(嵌套结果)
嵌套结果:使用嵌套结果的方式,可以在查询主实体对象的同时,通过嵌套的方式将关联实体对象的属性嵌套到主实体对象的属性中。这种方式的实现需要在Mapper.xml
文件中定义一个SQL语句,使用嵌套的方式将关联实体对象的属性映射到主实体对象的属性中。在定义映射关系时,需要使用resultMap
标签来定义主实体对象和关联实体对象的映射关系,使用collection
标签来嵌套关联实体对象的属性。
DeptMapper.java
/** * @description:获取部门以及部门中所有的员工信息 * @author: Hey * @date: 2022/7/4 10:46 * @param: [did] * @return: com.ir.mybatis.pojo.Dept **/ Dept getDeptAndEmp(@Param("did") Integer did);
DeptMapper.xml
<resultMap id="deptAndEmpResultMap" type="Dept"> <id property="did" column="did"></id> <result property="deptName" column="dept_name"></result> <!-- collection:处理一对多的映射关系 ofType:表示该属性所对应的集合中存储数据的类型 --> <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 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>
ResultTest.java
/** * @description:获取部门以及部门中所有的员工信息 * @author: Hey * @date: 2022/7/4 10:54 * @param: [] * @return: void **/ @Test public void testGetDeptAndEmp(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); DeptMapper mapper = sqlSession.getMapper(DeptMapper.class); Dept dept = mapper.getDeptAndEmp(1); System.out.println(dept); /** * Dept{ * did=1, deptName='A', * emps=[ * Emp{eid=1, empName='喜羊羊', age=34, sex='男', email='123@qq.com'}, * Emp{eid=4, empName='沸羊羊', age=23, sex='男', email='123@qq.com'} * ] * } */ }
2、方案二:分步查询(嵌套查询)
嵌套查询:使用嵌套查询的方式,可以在查询主实体对象的同时,通过查询关联实体对象的方式获取相关联的多个实体对象。这种方式的实现需要在Mapper.xml
文件中定义两个独立的SQL语句,一个用于查询主实体对象,另一个用于查询关联实体对象。在查询主实体对象时,通过使用select
标签的子标签来执行关联实体对象的查询,并将查询结果映射到主实体对象的属性中。
DeptMapper
/** * @description:通过分步查询查询部门以及部门中所有的员工信息 * 分步查询第一步:查询部门信息 * @author: Hey * @date: 2022/7/4 12:31 * @param: [did] * @return: com.ir.mybatis.pojo.Dept **/ Dept getDeptAndEmpByStepOne(@Param("did") Integer did);
DeptMapper.xml
<resultMap id="deptAndEmpByStepResultMap" type="Dept"> <id property="did" column="did"></id> <result property="deptName" column="dept_name"></result> <collection property="emps" select="com.ir.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo" column="did" fetchType="eager"> </collection> </resultMap> <select id="getDeptAndEmpByStepOne" resultType="deptAndEmpByStepResultMap"> select * from t_dept where did = #{did} </select>
EmpMapper
/** * @description:通过分步查询查询部门以及部门中所有的员工信息 * 分步查询第二步:根据did查询员工信息 * @author: Hey * @date: 2022/7/4 12:36 * @param: [did] * @return: java.util.List<com.ir.mybatis.pojo.Emp> **/ List<Emp> getDeptAndEmpByStepTwo(@Param("did") Integer did);
EmpMapper.xml
<select id="getDeptAndEmpByStepTwo" resultType="Emp"> select * from t_emp where did = #{did} </select>
ResultTest
/** * @description:通过分步查询查询部门以及部门中所有的员工信息 * @author: Hey * @date: 2022/7/4 12:40 * @param: [] * @return: void **/ @Test public void testGetDeptAndEmpByStep(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); DeptMapper mapper = sqlSession.getMapper(DeptMapper.class); Dept dept = mapper.getDeptAndEmpByStepOne(1); System.out.println(dept.getDeptName()); }
无论是使用嵌套查询还是嵌套结果的方式,都需要在Mapper.xml文件中定义相应的SQL语句和映射关系。同时,为了提高查询性能,可以使用Mybatis的延迟加载机制来减少查询次数,提高数据访问效率。
到此这篇关于Mybatis实现一对多映射处理的文章就介绍到这了,更多相关Mybatis映射内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring Cloud下基于OAUTH2认证授权的实现示例
这篇文章主要介绍了Spring Cloud下基于OAUTH2认证授权的实现示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-03-03Spring Cloud Ribbon实现客户端负载均衡的方法
本篇文章主要介绍了Spring Cloud Ribbon实现客户端负载均衡的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-05-05一篇文章带你解决 IDEA 每次新建项目 maven home directory 总是改变的问题
这篇文章主要介绍了一篇文章带你解决 IDEA 每次新建项目 maven home directory 总是改变的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-09-09用Java集合中的Collections.sort方法如何对list排序(两种方法)
本文通过两种方法给大家介绍java集合中的Collections.sort方法对list排序,第一种方式是list中的对象实现Comparable接口,第二种方法是根据Collections.sort重载方法实现,对collections.sort方法感兴趣的朋友一起学习吧2015-10-10
最新评论