在上篇文章分享了MyBatis框架实现了一对一查询操作,但是在开发中一对多查询操作更为常用。其实在平时生活中一对多关系就有很多,就比如一个部门下面可以有多个员工,而其中的一个员工也属于一个部门等等。
接下来我们就来学习一下如何在项目中实现一对多的查询操作呢。
一对多查询与上一篇一对一查询的方式一致,但不同的是在mApper配置文件中一对一查询使用的是association标签,而一对多查询使用的是collection标签。
这里以部门和员工为例讲解一对多级联查询操作,一个部门下面关联着多个员工。
创建两张数据表,一个是部门表,一个是员工表,这两张表具有一对多的关联关系,在员工表添加外键dept_id字段去关联部门表的主键dept_id字段。
t_dept 部门表
t_employee 员工表
创建两张表对应的实体bean类。
Dept部门类
Employee员工类
现在让我们看看如何获取部门信息以及其所对应的员工列表信息。
其实和一对一映射一样,我们可以两种方式实现,分别是嵌套结果和分步查询两种方式,都可以实现一对多映射查询。
1.嵌套结果,执行一个SQL语句(类似于MySQL的连接查询)
我们可以使用嵌套结果resultMap方式获得部门及其员工信息,代码如下:
创建DeptMapper.xml配置文件,代码如下:
在mapper配置文件中,<collection>元素是用来将多行员工结果映射成一个部门Dept对象的一个List集合中。
创建数据操作接口DeptMapper,并在接口中定义getDeptInfo方法。
创建调用数据接口的DeptService类。
创建DeptOperTest测试类并测试。
junit测试之后输出的结果:
2.分步查询,执行两个select查询语句(类似于mysql的子查询)
我们可以使用嵌套Select语句方式获得部门及其员工信息,代码如下:
创建DeptMapper.xml配置文件
创建DeptMapper接口
创建DeptService类
创建DeptOperTest测试类
测试之后输出的结果:
注意:部门表和员工表的主键id字段名要唯一,例如不能都写id,如果一样的话,在查询的时候就会出现,关联查询出来的员工数据只有一条记录,查不到部门对应下面的所有员工。我之前就是将两张表的主键id字段名都写为id,导致测试结果查询出来的员工数据只有一条的情况。
好了,今天的分享就到这里了,希望对大家的学习有所帮助,也可以在下面留言交流。