码迷,mamicode.com
首页 > 其他好文 > 详细

MyBatis_延迟加载

时间:2017-12-26 14:33:00      阅读:360      评论:0      收藏:0      [点我收藏+]

标签:count   color   enabled   void   als   默认   body   设置   inf   

一、延迟加载

   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_延迟加载

标签:count   color   enabled   void   als   默认   body   设置   inf   

原文地址:https://www.cnblogs.com/hoje/p/8117129.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!