Ibatis的延遲載入
阿新 • • 發佈:2019-01-03
我們知道Hibernate中有get()和load()兩種方法,load()採用的是延遲載入的機制,同樣的對於Ibatis也有著自己的延遲載入機制,
什麼是延遲載入呢,就是將暫時不需要的物件不真正的載入記憶體,而是在記憶體中為該物件建立一個代理物件,當我們使用到該物件的時候再去載入該物件。
為什麼要使用延遲載入呢,舉個例子說明一下,全國有1000個學校,每個學校有1000個專業 ,每個專業有1000個學生
<resultMap class="xueyuan" id="xueyuan_result"><result property="xy_id" column="xy_id"
<result property="xy_name" column="xy_name" />
<result property="zhuanye" column="xy_id" select="getZhuanYe" />
</resultMap>
<resultMap class="zhuanye" id="zhuanye_result">
<result property="zy_id" column="zy_id" />
<result
<result property="xy_id" column="xy_id"/>
<result property="xuesheng" column="zy_id" select="getXueSheng" />
</resultMap>
<select id="getXueYuan" resultMap="xueyuan_result" >
select xy_id,xy_name from xy
</
<select id="getZhuanYe" resultMap="zhuanye_result" parameterClass="string" >
select zy_id,zy_name ,xy_id where xy_id=#xy_id#
</select>
<select id="getXueSheng" resultClass="xuesheng" parameterClass="string" >
select xs_id,xs_name,zy_id from xs where zy_id=#zy_id#
</select>
根據上面的程式碼我們知道,我們在呼叫的getXueYuan時候會執行1+1000*1000+1000*1000*1000條sql語句,建立了1000+1000*1000+1000*1000*1000個物件,我們會瘋掉的。
所以我們需要配置延遲載入,也就是在sqlMapConfig中的setting元素中配置:
<settings lazyLoadingEnabled="true" enhancementEnabled="true"/>
enhancementEnabled設定為true的時候是使用位元組碼增強機制,可以優化延遲載入機制,也就是對延遲載入機制有所加強。
設定完延遲載入後,我們再呼叫getXueYaun方法的時候就會只執行一條sql語句 建立1000個物件,而下屬的專業、學生物件都是在記憶體中建立了一個代理物件,並沒有被載入到記憶體當中。 當用到他們的時候才會執行select語句。