mybatis的延遲加載


延遲加載

1. 回顧:在Hibernate 中 many2one的時候會用到延遲加載

  1)從many方拿one方的時候回使用延遲加載的方式, 程序到many方的時候,只發送一條SQL,只有當真正使用many方對應的one方的時候,才會去發送SQL進行查詢

  2)什么是真正使用?  訪問one方的非主鍵屬性

  3)延遲加載的原理:動態代理:在Hibernate中,被動態代理的延遲對象是one方;many方還是第一個普通的一個對象;

2.mybatis中呢?

  1)在mybatis 中默認沒有使用延遲加載

  2)怎么使用延遲加載呢?

  

  在mybatis的配置中  配置一個setting的元素

1    <!-- setting中的配置都是針對mybatis的運行行為進行配置的 -->
2      <settings>
3          <setting name="lazyLoadingEnabled" value="true"/>
4      </settings>

  3)在mybatis中,延遲加載也是使用動態代理完成的,但是在mybatis中,被代理的對象不是one方,而是many方本身.所以,默認情況下一旦我訪問了這個延遲加載對象任何一個屬性,都會觸發這個延遲加載對象的加載(默認情況下e.getName();也會吃法dept的查詢),這不是我們想要的結果,我們想要的是在需要dept的時候,才去查詢dept對象.

1 <!-- setting中的配置都是針對mybatis的運行行為進行配置的 -->
2     <settings>
3         <setting name="lazyLoadingEnabled" value="true"/>
4         <!-- 默認為true,代表只要訪問延遲加載對象的任意一個屬性,都會導致這個延遲加載對象的完全加載,
5             設置為false,代表按需加載 -->
6         <setting name="aggressiveLazyLoading" value="false"/>
7     </settings>

3.在mybatis中,不管怎么設置,只要訪問到one方,one方就會被加載,Hibernate中到訪問one方的非主鍵屬性的時候才會被加載,這也是mybatis和Hibernate的區別之一

4.在mybatis中,默認情況下只要調用了equals,clone,hashCode,toString這幾個方法,都會對對象進行完全加載

 

 

 

那么我們在打印對象的時候,即使不打印dept屬性,也會對這個對象進行完全加載,因為toString方法

<!-- 改變默認配置,使只有調用clone方法的時候才會觸發完全加載 -->
<setting name="lazyLoadTriggerMethods" value="clone"/>

1 <!-- setting中的配置都是針對mybatis的運行行為進行配置的 -->
2     <settings>
3         <setting name="lazyLoadingEnabled" value="true"/>
4         <!-- 默認為true,代表只要訪問延遲加載對象的任意一個屬性,都會導致這個延遲加載對象的完全加載,
5             設置為false,代表按需加載 -->
6         <setting name="aggressiveLazyLoading" value="false"/>
7         <!-- 改變默認配置,使只有調用clone方法的時候才會觸發完全加載 -->
8         <setting name="lazyLoadTriggerMethods" value="clone"/>
9     </settings>

這樣就可以提高性能了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM