11.延迟加载

延迟加载

  MyBatis 中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟规则推 迟对关联对象的 select 查询。延迟加载可以有效的减少数据库压力。 

需要注意的是,MyBatis 的延迟加载只是对关联对象的查询有迟延设置,对于主加载对象都是直接执行查询语句的。

  

  关联对象加载时机

MyBatis 根据对关联对象查询的 select 语句的执行时机,分为三种类型:直接加载、侵 入式延迟加载与深度延迟加载。

    1.直接加载:执行完对主加载对象的select语句,马上执行对关联对象的select查询

    2.侵入式延迟加载:执行完主加载对象的查询时,不会马上执行对关联对象。但当要访问主加载对象的详情时,

    就会马上执行关联对象的select查询。即对关联对象的查询执行,侵入到了主加载对象的详情中

    即将关联对象的详情作为主加载对象详情的一部分出现了

    3.深度延迟加载:执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象 的详情时也不会执行关联对象的 select 查询。

    只有当真正访问关联对象的详情时,才会 执行对关联对象的 select 查询

 

需要注意的是,延迟加载的应用要求,关联对象的查询与主加载对象的查询必须是分别 进行的 select 语句,

不能是使用多表连接所进行的 select 查询。因为,多表连接查询,其实 质是对一张表的查询,

对由多个表连接后形成的一张表的查询。会一次性将多张表的所有信 息查询出来。

MyBatis 中对于延迟加载设置,可以应用到一对一、一对多、多对一、多对多的所有关 联关系查询中

 

 1 <!-- 三种加载方式:1.直接加载  2.侵入延迟加载   3.深度延迟加载  其中深度延迟加载最 lazy, 其次 是侵入延迟加载-->
 2     <settings>
 3         <!-- 延迟加载总开关-->
 4         <!-- 默认为false,不采用延迟加载,即采用直接加载 -->
 5         <!-- 直接加载:执行完主加载对象的 select 语句,马上执行关联对象的 select 语句 -->
 6         <!-- 因为侵入延迟加载 默认不开启,所以当开启延迟加载后,采用的 深度延迟加载(即用到了才去加载,发出SQL,在 hibernate 中是load方法 和 fetchType ,都是类似这种深度延迟加载 ) -->
 7         <setting name="lazyLoadingEnabled" value="true" />
 8         
 9         <!-- 侵入延迟加载的开关 默认为false,开启后,即采用侵入延迟加载 -->
10         <!-- 侵入延迟加载:该延迟策略使关联对象的数据侵入到了主加载对象的数据中,当主加载对象的数据被调用时,关联对象 随之被调用 ,即当对象中属性被使用后,就要发出SQL语句去加载关联对象-->
11         
12         <setting name="aggressiveLazyLoading" value="true"/>
13     </settings>

  延迟加载策略总结

原文地址:https://www.cnblogs.com/xuzekun/p/7424196.html