延迟加载又叫懒加载,也叫按需加载。换句话说先加载主信息,在必须的情况下,再去加载从信息。
在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\"/> <!--2个合在一起配备便是,消沉的延迟加载-->
</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
可以看得出,当任何东西都不配备时,默认设置为用一个从数据库连接池中得到的联接进行2个sql语句的查看,即非延迟,积极主动的查看
(2)配备 <setting name=”lazyLoadingEnabled” value=”true” />
aggressiveLazyLoading的初始值为false 即只配 lazyLoadingEnabled为true或是与此同时配备 2个为一true一false的效果同样
只需結果投射中配备了association
则实行懒加载特点:不查看author的特性,则不实行子查询。
当仅有检测中的第一条輸出句子实行时結果如下图:
能够看见这时是懒加载。
当检测中的两根輸出句子都实行时結果如下图:
可以看得出,这时为非积极主动的延迟加载,仅有在必须查看author时才会执行查询author的sql语句。
(2)配备 <setting name=”lazyLoadingEnabled” value=”true” />且
<setting name=\"aggressiveLazyLoading\" value=\"true\"/> 这时为充分的延迟加载
当仅有检测中的第一条輸出句子实行时結果如下图:
可以看得出,这时的效果为尽管只必须blog的id,可是author依然被查看,并且使用的是2个连接查询。
当检测中的两根輸出句子都实行时結果如下图:
能够看见,这时2个輸出句子打印出的結果是联接在一块的,换句话说在打印出author信息以前,author早已被查看出去,而不是像上边非积极主动的延迟加载那般,使用author时才实行sql语句。
假如第一个设定的并不是true时,第二个设定是没有意义的,这一可以看一下官方网文本文档上写的,看了官方网文本文档就一目了然了
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。