Mybatis中的延迟加载

延迟加载又叫懒加载,也叫按需加载。也就是说先加载主信息,在需要的时候,再去加载从信息。
在mybatis中,resultMap标签 的 association标签和collection标签具有延迟加载的功能。

1、拷贝jar包

延迟加载中查询出来的是一个代理对象,不是真正的对象本身,可参考hibernate中的load方法,利用log4j将日志信息打印在控制台可以很明确的看到,所以在使用延迟加载时,需要用到cglib包。

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.2.6</version>
</dependency>

2、配置全局设置
    <!-- 全局设置 -->
    <settings>
        <!-- 打开延迟加载的开关,默认为false,即非延迟加载 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 将积极加载改为消极加载 -->
        <setting name="aggressiveLazyLoading" value="true"/>
        <!--两个合在一起配置就是,消极的延迟加载-->
    </settings>
官方对这两个属性的解释是:
lazyLoadingEnabled 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。(是否延迟加载当前对象的关联对象)
aggressiveLazyLoading 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。(是否延迟加载当前对象属性的关联对象)
延迟加载会生成代理对象

3、测试
    /**
     * 测试延迟加载
     */
   
@Test
public void testLazyLoading(){
    SqlSession session = MyBatisUtil.getSqlSession();
    BlogMapper blogImpl = session.getMapper(BlogMapper.class);

    Blog blog = blogImpl.selectById(1);

    session.close();
    
    //默认是积极加载的,需要在Config配置文件的全局中配置
    System.out.println(blog.getId());
//System.out.println(blog.getAuthor());
}
  

根据MyBatis官方文档中给出的案例,Blog类中关联了Author,此次测试,基于官方文档中的案例


(1)什么都不配置,且只打印blog的id

可以看出,当什么都不配置时,默认为用一个从连接池中取得的连接完成两个sql语句的查询,即非延迟,积极的查询

(2)配置  <setting name="lazyLoadingEnabled" value="true" />
aggressiveLazyLoading的默认值为false 即只配 lazyLoadingEnabled为true或者同时配置
两个为一true一false的结果相同 
只要结果映射中配置了association
则执行懒加载特性:不查询author的属性,则不执行子查询。

当只有测试中的第一条输出语句执行时结果如下图:


可以看到此时是懒加载。


当测试中的两条输出语句都执行时结果如下图

可以看出,此时为非积极的延迟加载,只有在需要查询author时才会执行查询author的sql语句。


(2)配置 <setting name="lazyLoadingEnabled" value="true" />且

   <setting name="aggressiveLazyLoading" value="true"/>  此时为积极的延迟加载

当只有测试中的第一条输出语句执行时结果如下图:


可以看出,此时的结果为虽然只需要blog的id,但是author依旧被查询,而且用到的是两个连接查询。


当测试中的两条输出语句都执行时结果如下图


可以看到,此时两个输出语句打印的结果是连接在一块的,也就是说在打印author信息之前,author已经被查询出来,而不是像上面非积极的延迟加载那样,用到author时才执行sql语句。

如果第一个设置的不是true时,第二个设置是没有意义的,这个可以看一下官方文档上写的,看完官方文档就一目了然了




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值