推遲加載又叫懶加載,也叫按需加載。也即是說先加載主消息,在須要的功夫,再去加載從消息。
在mybatis中,resultMap標(biāo)簽的association標(biāo)簽和collection標(biāo)簽具備推遲加載的功效。
1、正片jar包
推遲加載中查問出來的是一個(gè)代勞東西,不是真實(shí)的東西自己,可參考hibernate中的load本領(lǐng),運(yùn)用log4j將日記消息打字與印刷在遏制臺(tái)不妨很精確的看到,以是在運(yùn)用推遲加載時(shí),須要用到cglib包。
<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.2.6</version></dependency>2、擺設(shè)全部樹立
<!–全部樹立–>
<settings>
<!--翻開推遲加載的電門,默許為false,即非推遲加載--><settingname="lazyLoadingEnabled"value="true"/><!--將主動(dòng)加載改為失望加載--><settingname="aggressiveLazyLoading"value="true"/><!--兩個(gè)合在一道擺設(shè)即是,失望的推遲加載--></settings>
官方對(duì)這兩個(gè)屬性的證明是:
lazyLoadingEnabled全部起用或禁止使用推遲加載。當(dāng)禁止使用時(shí),一切關(guān)系東西城市立即加載。(能否推遲加載暫時(shí)東西的關(guān)系東西)
aggressiveLazyLoading當(dāng)起用時(shí),有推遲加載屬性的東西在被挪用時(shí)將會(huì)實(shí)足加載大肆屬性。要不,每種屬性將會(huì)按須要加載。(能否推遲加載暫時(shí)東西屬性的關(guān)系東西)
推遲加載會(huì)天生代勞東西
3、嘗試
/**
*嘗試推遲加載
*/
@TestpublicvoidtestLazyLoading(){SqlSessionsession=MyBatisUtil.getSqlSession();BlogMapperblogImpl=session.getMapper(BlogMapper.class);Blogblog=blogImpl.selectById(1);session.close();//默許是主動(dòng)加載的,須要在Config擺設(shè)文獻(xiàn)的全部中擺設(shè)System.out.println(blog.getId());//System.out.println(blog.getAuthor());}
按照MyBatis官方文書檔案中給出的案例,Blog類中關(guān)系了Author,此次嘗試,鑒于官方文書檔案中的案例
(1)什么都不擺設(shè),且只打字與印刷blog的id
不妨看出,當(dāng)什么都不擺設(shè)時(shí),默許為用一個(gè)從貫穿池中博得的貫穿實(shí)行兩個(gè)sql語句的查問,即非推遲,主動(dòng)的查問
(2)擺設(shè)<settingname=”lazyLoadingEnabled”value=”true”/>
aggressiveLazyLoading的默許值為false即只配lazyLoadingEnabled為true大概同聲擺設(shè)兩個(gè)為一true一false的截止溝通只有截止映照中擺設(shè)了association
則實(shí)行懶加載個(gè)性:不查問author的屬性,則不實(shí)行子查問。
當(dāng)惟有嘗試中的第一條輸入語句實(shí)行時(shí)截止如次圖:
不妨看到此時(shí)是懶加載。
當(dāng)嘗試中的兩條輸入語句都實(shí)行時(shí)截止如次圖:
不妨看出,此時(shí)為非主動(dòng)的推遲加載,惟有在須要查問author時(shí)才會(huì)實(shí)行查問author的sql語句。
(2)擺設(shè)<settingname=”lazyLoadingEnabled”value=”true”/>且
<settingname="aggressiveLazyLoading"value="true"/>此時(shí)為主動(dòng)的推遲加載當(dāng)惟有嘗試中的第一條輸入語句實(shí)行時(shí)截止如次圖:
不妨看出,此時(shí)的截止為固然只須要blog的id,然而author保持被查問,并且用到的是兩個(gè)貫穿查問。
當(dāng)嘗試中的兩條輸入語句都實(shí)行時(shí)截止如次圖:
不妨看到,此時(shí)兩個(gè)輸入語句打字與印刷的截止是貫穿在一塊的,也即是說在打字與印刷author消息之前,author仍舊被查問出來,而不是像上頭非主動(dòng)的推遲加載那么,用到author時(shí)才實(shí)行sql語句。
即使第一個(gè)樹立的不是true時(shí),第二個(gè)樹立是沒有意旨的,這個(gè)不妨看一下官方文書檔案上寫的,看完官方文書檔案就一覽無余了