MyBatis_延迟加载

Posted hoje

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis_延迟加载相关的知识,希望对你有一定的参考价值。

一、延迟加载

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

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

二、关联对象的加载时机

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

  • 直接加载:执行完对主加载对象的select语句,马上执行对关联对象的select查询。
  • 侵入式延迟加载:执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的详情时,就会马上执行关联对象的select查询,即对关联对象的查询执行,侵入到主加载对象的详情访问中。(将关联对象的详情侵入到了主加载对象的详情中,即将关联对象的详情作为主加载对象的详情一 部分出现)
  • 深度延迟加载:执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只要当真正访问关联对象的详情时,才会执行对关联对象的select查询。

 

示例:建立country和minister的DB表

 

直接加载示例:

<setting name="lazyLoadingEnabled" value="flase"/>

上面的语句,系统默认设置为“false”

输出:

深度延迟加载示例(只访问cname,就不查minister表,提高了效率)

<!--设置整个应用所使用的常量  -->
<settings>
 <setting name="lazyLoadingEnabled" value="true"/>//系统默认"aggressiveLazyLoading"为false
</settings>

"lazyLoadingEnabled"类似于开关功能。

@Test
    public void test01() {
        Country country = dao.selectCountryById(1);
        System.out.println(country.getCname());
    }

执行顺序如下(当前“aggressiveLazyLoading”为false):

侵入式延迟示例:

<settings>
 <setting name="lazyLoadingEnabled" value="true"/>
 <setting name="aggressiveLazyLoading" value="true"/>
</settings>

 

执行顺序如下:

 

总结:

 

以上是关于MyBatis_延迟加载的主要内容,如果未能解决你的问题,请参考以下文章

Java_myBatis_延迟加载

阶段3 1.Mybatis_11.Mybatis的缓存_4 mybatis一对多实现延迟加载

MYBATIS05_表结构关系一对一一对多多对多延迟加载

[mybatis]映射文件_select_resultMap_关联查询_association分步查询&延迟加载

阶段3 1.Mybatis_12.Mybatis注解开发_7 Mybatis注解开发一对多的查询配置

Mybatis的延迟加载