MyBatis懒加载学习

本文详细解析了MyBatis框架中懒加载(aggressiveLazyLoading)机制的工作原理及配置方式,通过具体示例对比了不同配置下对外部嵌套查询的影响,并验证了官方文档中的相关说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  关于懒加载的问题:

下面先是我写的相关的代码(最后面是问题):

Mapper映射文件:

数据库表:

Pojo类:





然后问题:

当SqlMapConfig.xml配置文件中的配置如下所示时:

测试:

结果:

在上述的查询结果中,只执行了一句select * from orders;,没有执行select * from user where id=#{arbitrary};说明即使aggressiveLazyLoading 设置为true,也会有懒加载。

之前我一直认为,看来我的理解还是不太对。

于是我又查阅了Mybatis官方文档:

总算搞清楚了QAQ:

在仔细阅读了mybatis的官方文档后,发现之前对于aggressiveLazyLoading的理解不太全面,

关键就是画红线的部分,下面还是使用前面的例子说明.

”upon a call to any of the lazy properties”这句话是一个在aggressiveLazzyLoading=true情况下会进行外部嵌套查询的一个条件.意思就是当aggressiveLazzyLoading=true时,只有当测试中调用pojo对象里的某个属性的时候才会执行外部嵌套查询,查询出整个这一条元组,在举的例子中,某个属性可以是任何一个属性,比如OrdersExtra中从Orders中继承的user_id属性,不一定非得是user属性

OrdersExtra类:

         Orders类:

 

User类:


而当aggressiveLazzyLoading=false时,只有当测试中用到OrdersExtra中的user属性时,才会执行外部嵌套查询

并且官方文档中也明确指出了”each property on demand” ,说明每一个属性只有在被需要时才会被加载

下面对于上述我个人对于官方文档的理解进行了测试,测试如下:

例子还是用的之前的例子,只是修改了测试类中的内容

测试1:aggressiveLazyLoading=true时

测试代码1.1:

结果1.1:

结论1.1:当aggressiveLazyLoading=true,只要测试代码中用到了外嵌套查询中的某个‘任意’属性,外部嵌套查询就会被执行一次

测试二: aggressiveLazyLoading=false时

测试代码2.1:

结果2.1:

结论2.1:在aggressiveLazyLoading=false时,虽然测试代码中用到了某个任意属性,但它不是外部嵌套查询查出的user属性,所以不会进行外部嵌套查询


测试代码2.2:


测试结果2.2:

结论2.2: 还是在aggressiveLazyLoading=false时,上述测试代码中用到了user属性,所以进行了一次外部嵌套查询.刚好与前面对于官方文档中的理解一致.

 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值