推迟加载又叫懒加载,也叫按需加载。也即是说先加载主消息,在须要的功夫,再去加载从消息。
在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时,第二个树立是没有意旨的,这个不妨看一下官方文书档案上写的,看完官方文书档案就一览无余了