当前位置:首页 > 生活百科

mybatis懒加载原理(mybatis懒加载和延迟加载)

栏目:生活百科日期:2025-04-22浏览:0

延迟加载又叫懒加载,也叫按需加载。也就是说先加载主信息,在需要的时候,再去加载从信息。

在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、测试

/**

* 测试延迟加载

*/

@Testpublic 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时,第二个设置是没有意义的,这个可以看一下官方文档上写的,看完官方文档就一目了然了

“mybatis懒加载原理(mybatis懒加载和延迟加载)” 的相关文章

10种风衣蝴蝶结的打法(慢动作教你打蝴蝶结)

大衣腰带怎么系好看?漂亮的蝴蝶节怎么系?看似简单的蝴蝶节但做的漂亮平整可能还真的要一个小窍门,下面给大家介绍大衣腰带怎么系好看,不会的mm现在开始看仔细!大衣腰...

2020年全国笔记本电脑排名(全球排名前十的笔记本品牌)

买笔记本电脑,除了十大品牌外,还有许多新锐品牌实力强劲,性价比出色。新锐品牌不是杂牌,区别办法不是看销量,而是看这个牌子卖的配置,是老旧配置还是最新主流?如果您...

3d立体游戏有哪些(新推出的3d立体益智游戏)

《TapAway》(轻按)是由PopcoreGames推出的拆解积木题材益智免费手游。游戏通过简单趣味的玩法,实现了一款令人痴迷的休闲解谜游戏。尽管游戏的画面看...

世界十大名校最新排名大学(国内外最知名的10所大学)

2020年10月20日,U.S.News正式发布2021年世界大学排行榜,这是U.S.NEWS第七次公布世界大学排名。今年的榜单又有哪些变化?哪所大学获世界第一...

win10启动盘制作工具推荐(win10官方u盘安装教程)

相信微软的Windows10系统对于大家来说已经非常的熟悉了,我个人认为,针对上一代系统而言,Windows10在易用性和安全性有了绝对的提升,作为用户的我们来...

免费推广软件有哪些,如何选择

在现在的淘宝店铺推广里面,也有很多的能够帮助淘宝店铺进行免费推广的软件,如果这些软件能够利用的的好,也能够帮助淘宝店铺获得比较好的推广效果,那对于这些免费的淘宝...

上海市人均gdp是多少(简介人均GDP数值最高的十个城市)

人均国内生产总值是人们了解和把握一个国家或地区的宏观经济运行状况的有效工具,也就是人均GDP,常作为发展经济学中衡量经济发展状况的指标,是最重要的宏观经济指标之...

iphone云服务怎么关闭(iphone云服务关闭教程)

现在几乎所有的手机都在首次使用的时候会要求用户使用手机号码注册一个账号,有些手机甚至会自动使用用户的手机号码开通账号,比如苹果手机的iCloud账号,小米手机、...

u盘分区怎么合并(误删磁盘分区恢复方法)

硬盘是我们电脑中用来存储大量文件数据的硬件设备,有了它,我们的电脑才能够安装足以运行的电脑操作系统,有了它,我们才能在电脑上存储或者下载文件数据。这些操作方法都...

如何开通个人公众号留言,2019微信公众号留言功能

公众号留言功能取消之后,新公众号要如何开通留言功能呢?自从2018年3月份开始,新申请的公众号就不再有留言功能了,至于后续会不会重新开通,微信官方也没给准确说法...