Mybatis框架实现一对多查询两种不同的实现方式


Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 
在上篇文章分享了Mybatis框架实现了一对一查询操作,但是在开发中一对多查询操作更为常用 。其实在平时生活中一对多关系就有很多,就比如一个部门下面可以有多个员工,而其中的一个员工也属于一个部门等等 。
接下来我们就来学习一下如何在项目中实现一对多的查询操作呢 。
一对多查询与上一篇一对一查询的方式一致,但不同的是在mApper配置文件中一对一查询使用的是association标签,而一对多查询使用的是collection标签 。
这里以部门和员工为例讲解一对多级联查询操作,一个部门下面关联着多个员工 。
创建两张数据表,一个是部门表,一个是员工表,这两张表具有一对多的关联关系,在员工表添加外键dept_id字段去关联部门表的主键dept_id字段 。
t_dept 部门表
Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 
t_employee 员工表
Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 
创建两张表对应的实体bean类 。
Dept部门类
Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 

Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 
Employee员工类
Mybatis框架实现一对多查询两种不同的实现方式

文章插图
【Mybatis框架实现一对多查询两种不同的实现方式】 

Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 
现在让我们看看如何获取部门信息以及其所对应的员工列表信息 。
其实和一对一映射一样,我们可以两种方式实现,分别是嵌套结果和分步查询两种方式,都可以实现一对多映射查询 。
1.嵌套结果,执行一个SQL语句(类似于MySQL的连接查询)
我们可以使用嵌套结果resultMap方式获得部门及其员工信息,代码如下:
创建DeptMapper.xml配置文件,代码如下:
Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 

Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 
在mapper配置文件中,<collection>元素是用来将多行员工结果映射成一个部门Dept对象的一个List集合中 。
创建数据操作接口DeptMapper,并在接口中定义getDeptInfo方法 。
Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 
创建调用数据接口的DeptService类 。
Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 
创建DeptOperTest测试类并测试 。
Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 
junit测试之后输出的结果:
Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 

Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 
2.分步查询,执行两个select查询语句(类似于mysql的子查询)
我们可以使用嵌套Select语句方式获得部门及其员工信息,代码如下:
创建DeptMapper.xml配置文件
Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 

Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 
创建DeptMapper接口
Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 
创建DeptService类
Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 

Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 
创建DeptOperTest测试类
Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 
测试之后输出的结果:
Mybatis框架实现一对多查询两种不同的实现方式

文章插图
 
注意:部门表和员工表的主键id字段名要唯一,例如不能都写id,如果一样的话,在查询的时候就会出现,关联查询出来的员工数据只有一条记录,查不到部门对应下面的所有员工 。我之前就是将两张表的主键id字段名都写为id,导致测试结果查询出来的员工数据只有一条的情况 。
好了,今天的分享就到这里了,希望对大家的学习有所帮助,也可以在下面留言交流 。


推荐阅读