延遲加載
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>
這樣就可以提高性能了