Mybatis【20】-- Mybatis延迟加载怎么处理?
注:代码已托管在GitHub
上,地址是:https://github.com/Damaer/Mybatis-Learning
,项目是mybatis-16-lazyload
,需要自取,需要配置maven环境以及mysql
环境(sql
语句在resource
下的test.sql
中),觉得有用可以点个小星星。
docsify
文档地址在:https://damaer.github.io/Mybatis-Learning/#/
mybatis
的懒加载,也称为延迟加载,是指在进行关联查询的时候,按照设置延迟规则推迟对关联对象的select
查询,延迟加载可以有效的减少数据库压力。延迟加载只对关联对象有延迟设置,主加载对象都是直接执行查询语句的
关联对象加载类型
mybatis的关联对象的查询select语句的执行时机,可以分为3类,直接加载,侵入式加载与深度延迟加载。
1.直接加载
执行完主加载对象的select语句,马上就会执行关联对象的select语句。
2.侵入式延迟加载
执行对主加载对象的查询时,不会执行关联对象的查询,但是当访问主加载对象的详情时,就会马上执行关联对象的select查询,也就是说关联对象的查询执行,侵入到了主加载对象的详情访问中,可以理解为,将关联对象的详情侵入到主加载对象的详情中,作为它的一部分出现了。
3.深度延迟加载
执行对主加载对象的查询的时候,不会执行对关联对象的查询,访问主加载对象的详情的时候,也不会执行关联对象的select查询,只有当真正的访问关联对象的详情的时候,才会执行对关联对象的select查询。
注意:延迟加载的最基本要求,关联对象的查询与主加载对象的查询必须是分别放在两个语句中的,不能使用多表连接查询,因为多表连接查询相当于把多张表连接成一张表的查询,无法做到分开查询,会一次性将表的内容查询出来。
延迟加载,可以应用到一对多,一对一,多对一,多对多的关联查询中。
举个例子:我们使用上一个demo
,查询minister
与country
之间的关系,数据库如下:
与之对应的实体类:Country.class
Minister.class
:领导人实体类
主配置文件mybatis.xml
:
mapper.xml
文件:
与之对应的sql
接口:
使用到的工具类:
直接加载查询
关于懒加载的配置,我们只需要在mybatis.xml
文件里面使用<settings></settings>
就可以了,懒加载有一个总开关,lazyloadingEnabled
,只要置为false
就可以将延迟加载关掉,那就是直接加载查询了。配置在<properties></properties>
与<typeAliases></typeAliases>
之间。
当单元测试是直接査country
对象的时候:
结果是,我们可以看到两条sql
,除了查询country
之外,连同minister
关联对象也一起查询了,这就是直接加载,简单粗暴,不管是否使用,都会先将关联查询加载:
侵入式延迟加载
需要将延迟加载开关开启(true
),同时也需要将侵入式加载开关开启(true
)
1.当我们只查询country
的时候,只会执行country
的查询,不会执行关联查询minister
:
结果如下,只有一条sql:
当我们查询country
的属性,但是不查询minister
属性的时候:
结果如下,会加载到关联对象minister
,这就是侵入式延迟加载:
深度延迟加载
需要将延迟加载开关lazyLoadingEnabled
开启(true
),同时需要将侵入式加载开关aggressivelazyLoading
关闭(false
)
1.当我们只查询出country
的时候,只会查询country
,而不会查询minister
:
单元测试代码:
2.当我们访问country
的属性的时候,也不会加载关联查询的minister
:
结果同样是:
3.当我们查询country
属性minister的时候:
我们可以看到结果,执行了minister
的查询,这个时候才是真正的加载minister
查询
加载方式 | lazyLoadingEnabled | aggressiveLazyLoading |
---|---|---|
直接加载 | 必须是false,默认是false | 不管是什么,只要lazyLoadingEnabled是false就是直接加载 |
侵入式延迟加载 | 必须是true | 必须是true |
深度延迟加载 | 必须是true | 必须是false,默认是false |
【作者简介】:
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。个人写作方向:Java源码解析,JDBC,Mybatis,Spring,redis,分布式,剑指Offer,LeetCode等,认真写好每一篇文章,不喜欢标题党,不喜欢花里胡哨,大多写系列文章,不能保证我写的都完全正确,但是我保证所写的均经过实践或者查找资料。遗漏或者错误之处,还望指正。
平日时间宝贵,只能使用晚上以及周末时间学习写作,关注我,我们一起成长吧~
__EOF__

本文链接:https://www.cnblogs.com/Damaer/p/14433910.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库