Mybatis基于嵌套查询实现一对多、多对一关系

1,094 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第16天,点击查看活动详情

上篇文章介绍了使用assoication和collection实现多对一、一堆多的关系,本篇文章同样介绍这两种实现方式,不同的是使用嵌套查询来实现。

一、嵌套查询

1-1、实现一对多关系

同样使用之前的案例,部门和员工,一个部门对应多个员工,员工表中保存部门ID

1-1-1、首先修改EmpMapper.xml

准备好员工表的数据查询,条件是按照部门id查询 image.png

1-1-2、修改DeptMapper.xml

同样使用collection,但是不同的是添加了column属性,这个属性指向的是dept的id,属性select指向的是EmpMapper中< select> id值。 当期resultMap 需要使用extends 继承父类resultMap的映射关系,否者还得在当前resultMap中设置dept的映射关系

image.png

1-1-3、测试

如下图,完成了一对多的映射关系

image.png

1-1-4、嵌套查询实现原理

image.png 通过上图可以发现,实际上线查询的Dept,然后将Dept的id,通过迭代挨个传入的Emp,然后再对Emp进行查询,这种情况是分为多个sql,分步查询的。

另外实现过程为在Dept中查询所有的部门,在resultMap的collection中通过select指定嵌套的查询,通过column传入对应的条件(相当于将dept的id传入的emp查询语句的dept_id)。这与就完成了嵌套查询

1-1-5、嵌套查询的关联查询的区别

1-1-5-1、使用嵌套查询编写更麻烦

通过关联查询和嵌套查询,我们可以看出使用嵌套查询的代码量更多,因此相对关联查询来说略显麻烦

1-1-5-2、嵌套查询分页查询更优

1-1-5-2-1、使用collection联合查询分页

image.png 如上图,我们实际上想按照部门进行分页,每页查询5条,然后发现查询的数据也是5条,但是mybatis会自动根据deptid进行合并,最终处理后的数据dept只有两条,显然这样是不符合我们的需求的。

1-5-2-1、使用collection嵌套查询分页

image.png 如上图,我们查询5条,虽然后面3条件没有对应emp,但是也是按照我们想要的结果查出来了

小结

通过以上对比,我们知道用嵌套查询,更利于分页的实现。

1-2、懒加载(只在嵌套查询中生效)

1-2-1、修改mybatis配置

因为mybatis默认equals,clone,hashCode,toString是不进行懒加载的,因此我们需要先设置一下

image.png

1-2-2、配置DeptMapper中的collection懒加载

通过设置fetchType将Emp设置为懒加载 image.png

1-2-3、测试

如下:只有Dept被查询出来,Emp未进行查询 image.png

使用Emp查看懒加载执行过程

image.png 如上图,最开始打印处理只有Dept,然后在调用Dept中的Emps可以发现触发了新的查询。

1-2-4、设置所有嵌套查询懒加载

mybatis可以设置所有嵌套查询为懒加载,如下

image.png

当设置了此属性之后,又有某个嵌套查询不进行懒加载,就可以将嵌套查询中设置fetchType="eager",这样当前的嵌套查询就不会懒加载了

1-3、总结

img.jpg 三种关联guan关系都有两种关联查询的方式,嵌套查询,嵌套结果

*Mybatis的yanc延迟加载配置,在全局配置文件中加入下面代码

 <settings>
     <setting name=”lazyLoadingEnabled” value=”true” />
     <setting name=”aggressiveLazyLoading” value=”false”/>
 </settings>

在映射文件中,元素和元素中都已默认配置了延迟加载属性,即默认属性fetchType=”lazy”(属性fetchType=”eager”表示立即加载),所以在配置文件中开启延迟加载后,无需在映射文件中再做配置

1-3-1、一对一

使用元素进行一对一关联映射非常简单,只需要参考如下两种示例配置即可

20220413205834.png

1-3-2、一对多

元素中,包含了一个子元素,MyBatis就是通过该元素来处理一对多关联关系的

子元素的属性大部分与元素相同,但其还包含一个特殊属性–ofType

ofType属性与javaType属性对应,它用于指定实体对象中集合类属性所包含的元素类型。

元素的使用也非常简单,同样可以参考如下两种示例进行配置,具体代码如下:

20220413210029.png

1-3-3、多对多

多对多的关联关系查询,同样可以使用前面介绍的元素进行处理(其用法和一对多关联关系查询语句用法基本相同)