懒加载的概念

MyBatis中的延迟加载,也称为懒加载,是指进行关联查询时,按需执行子查询。

当程序需要获取|使用关联对象时,mybatis再执行子查询,这样可以减轻数据库的压力,在一定程度上可以降低程序运行消耗、提高查询效率。

懒加载的适用场景:

当前业务只使用主加载对象的其他属性,或者暂时只使用主加载对象的其他属性,长时间以后才使用主加载对象的关联对象属性。

懒加载只对关联查询起作用(一对一、一对多、多对多),且只对嵌套查询方式起作用,因为嵌套结果、扩展类的方式都是一次查询所需数据,不存在子查询,也就不存在延迟加载的情况。

MyBatis的延迟加载只是延迟执行子查询,对于主加载对象的查询都是直接执行的。


子查询的执行时机(关联对象的加载时机)

一共有三种:

  • 直接加载:执行完主加载对象的查询,马上执行子查询。
  • 侵入式延迟: 先执行主加载对象的查询,后续使用主加载对象的属性时(调用getter方法)才执行子查询。只要使用主加载对象的属性,就执行子查询。
  • 深度延迟:先执行主加载对象的查询,后续使用主加载对象的关联对象属性时才执行子查询。使用的属性要是主加载对象的关联对象属性时,才执行子查询。

懒加载一共有2种方式,按照懒的程度,分为侵入式延迟、深度延迟。


配置方式

可在全局配置文件中进行配置,也可以在映射文件中进行配置。

(1)直接加载

默认就是直接加载,什么都不用配置,当然也可以显式配置:

   <settings>
<setting name="lazyLoadingEnabled" value="false"/>
</settings>

(2)侵入式延迟

    <settings>
<!-- 使用懒加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 使用侵入式延迟的懒加载 -->
<setting name="aggressiveLazyLoading" value="true"/>
</settings>

aggressive 咄咄逼人的、激进的、主动模式的、喜好侵入的,一有机会就加载,故名侵入式延迟。

缺省aggressiveLazyLoading时,默认为true——侵入式延迟。(据说旧版本的默认值是false——深度延迟,我未去验证。)

(3)深度延迟

 <settings>
<!-- 使用懒加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 使用深度延迟的懒加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>

(4)也可以在映射文件的<association>或<collection>中单独配置某个关联对象的加载方式

<collection property="goodsList" select="com.chy.mapper.GoodsMapper.queryGoodsByGoodsId" column="no" ofType="goods" fetchType="lazy"/>

有2个可选的值:

  • eager  直接加载,默认值。eager 饥渴的。
  • lazy  深度延迟。

此种方式不能指定为侵入式延迟。

在全局配置文件中进行的配置是配置所有的,在映射文件中的配置是配置单个的。

如果在mybatis全局配置文件中显式配置了懒加载,又在映射文件中配置了懒加载,冲突时以全局配置文件中的配置为准。

最新文章

  1. Struts2 源码分析——配置管理之ContainerProvider接口
  2. Ext3文件系统mount选项和文件属性介绍
  3. Android 媒体存储服务(一)
  4. dhtmlxScheduler日程安排控件
  5. Netty的TCP粘包/拆包(源码二)
  6. DIRECTORY_SEPARATOR:PHP 系统分隔符常量
  7. asp登陆例子,asp,mssql,登陆
  8. mysql触发器使用实例
  9. 设置ul阴影效果和边框圆角
  10. SAN简介
  11. 远程安装实施时,如何配置远程服务器的本地 yum 安装源
  12. Setup a private http/nginx based GIT server
  13. Jdk1.6 JUC源码解析(7)-locks-ReentrantLock
  14. php中的数组遍历的几种方式
  15. Dynamics 365测试和启用邮箱时候一直显示“安排电子邮件配置测试”怎么办?
  16. C#中的反射解析及使用(转)
  17. Js 基本类型和引用类型
  18. 在Android源码中查找Java代码中native函数对应的C++实现
  19. 开关电源PCB设计中的布线技巧
  20. LeetCode: Minimum Depth of Binary Tree 解题报告

热门文章

  1. Photoshop 更换证件照底色
  2. 使用WebClient下载文件到本地目录
  3. Unity UGUI优化整理
  4. WIN10怎么查看端口,并杀死进程
  5. POJ 1284:Primitive Roots 求原根的数量
  6. App_显示图表内容
  7. cf 730J. Bottles
  8. 八、CI框架之输出URI路径,相当于GET
  9. 面试题(7)之 leetcode-003
  10. zset底层数据结构