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