1. 程式人生 > >Ibatis的延遲載入

Ibatis的延遲載入

我們知道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
property="zy_name" column="zy_name" />
        <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>
    <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語句。