天天看點

懶加載與急加載FetchType.LAZY&FetchType.EAGER的差別和使用?

1、FetchType.LAZY:懶加載,加載一個實體時,定義懶加載的屬性不會馬上從資料庫中加載。2、FetchType.EAGER:急加載,加載一個實體時,定義急加載的屬性會立即從資料庫中加載。3、比方User類有兩個屬性,name跟address,登入後使用者名是需要顯示出來的,此屬性用到的幾率極大,要馬上到資料庫查,用急加載;而使用者位址大多數情況下不需要顯示出來,隻有在檢視使用者資料是才需要顯示,需要用了才查資料庫,用懶加載就好了。是以,并不是一登入就把使用者的所有資料都加載到對象中,于是有了這兩種加載模式。

我們來用一個典型的案例作對比

一個使用者有編号 使用者名 ......和

角色 ,正常情況下使用者登入後不需要查詢角色,但是現在我們想要查詢到角色 一個使用者可以有多個角色, 員工 是兩張表 ,一般我們在項目配置中都是配置延遲加載(懶加載)

<configuration>
<!-- 啟用延遲加載 -->
 <settings>
    <setting name="lazyLoadingEnabled" value="true" />
    <!--&lt;!&ndash;設定為false之後表示在通路many方的屬性(非關聯的對象的屬性)的時候不要觸發延遲加載&ndash;&gt;-->
    <setting name="aggressiveLazyLoading" value="false" />
    <!--&lt;!&ndash;當通路Object中的clone方法的時候觸發延遲加載&ndash;&gt;-->
    <setting name="lazyLoadTriggerMethods" value="clone" />
</settings>

</configuration>
           
懶加載與急加載FetchType.LAZY&amp;FetchType.EAGER的差別和使用?

延遲加載

我們在項目中有查詢角色的sql(根據員工編号查詢角色)

<collection property="roles" ofType="Role"
    select="com.jd.wms.mapper.RoleMapper.selectRolesByEmployeeId"
    column="id">
</collection>
           

調用RoleMapper裡的方法查詢角色

懶加載與急加載FetchType.LAZY&amp;FetchType.EAGER的差別和使用?

EmployeeMapper.xml

sql查詢出結果每一個使用者id編号對應的角色

<select id="selectRolesByEmployeeId" resultMap="base_mapper">
    select r.* from t_employees_roles er join t_role r on er.role_id=r.id 
    where er.employee_id = #{empId}
</select>
           
懶加載與急加載FetchType.LAZY&amp;FetchType.EAGER的差別和使用?

RoleMapper.xml

查詢出的結果是

懶加載與急加載FetchType.LAZY&amp;FetchType.EAGER的差別和使用?

查詢結果

我們明明寫了查詢語句但是卻沒有查詢到原因就是我們啟用了延遲加載

現在我們的需求是需要把

也顯示出來怎麼破?

這時我們就需要使用fetchType.eager(急加載)

添加一個屬性

fetchType="eager"

<collection property="roles" ofType="Role"   
 select="com.jd.wms.mapper.RoleMapper.selectRolesByEmployeeId"
 column="id" fetchType="eager">
</collection>
           
懶加載與急加載FetchType.LAZY&amp;FetchType.EAGER的差別和使用?

fetchType.eager

這時我們發送請求得到的結果就是

懶加載與急加載FetchType.LAZY&amp;FetchType.EAGER的差別和使用?