关于懒加载的问题:

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

Mapper映射文件:

MyBatis懒加载学习

数据库表:

MyBatis懒加载学习

Pojo类:

MyBatis懒加载学习


MyBatis懒加载学习


MyBatis懒加载学习


然后问题:

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

MyBatis懒加载学习

测试:

MyBatis懒加载学习

结果:

MyBatis懒加载学习

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

之前我一直认为MyBatis懒加载学习,看来我的理解还是不太对。

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

总算搞清楚了QAQ:

MyBatis懒加载学习

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

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

MyBatis懒加载学习

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

OrdersExtra类:

MyBatis懒加载学习

         Orders类:

 MyBatis懒加载学习

User类:

MyBatis懒加载学习

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

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

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

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

测试1:aggressiveLazyLoading=true时

测试代码1.1:

MyBatis懒加载学习

结果1.1:

MyBatis懒加载学习

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

测试二: aggressiveLazyLoading=false时

测试代码2.1:

MyBatis懒加载学习

结果2.1:

MyBatis懒加载学习

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


测试代码2.2:

MyBatis懒加载学习

测试结果2.2:

MyBatis懒加载学习

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

 




相关文章: