MyBatis 懶加載

 

懶加載的概念

MyBatis中的延遲加載,也稱爲懶加載,是指進行關聯查詢時,按需執行子查詢。數據庫

當程序須要獲取|使用關聯對象時,mybatis再執行子查詢,這樣能夠減輕數據庫的壓力。mybatis

 

 

懶加載的適用場景:app

當前業務只使用主加載對象的其餘屬性,或者暫時只使用主加載對象的其餘屬性,長時間之後才使用主加載對象的關聯對象屬性。fetch

 

 

懶加載只對關聯查詢起做用(一對1、一對多、多對多),且只對嵌套查詢方式起做用,由於嵌套結果、擴展類的方式都是一次查詢所需數據,不存在子查詢,也就不存在延遲加載的狀況。spa

MyBatis的延遲加載只是延遲執行子查詢,對於主加載對象的查詢都是直接執行的。

code

 

 


 

 

子查詢的執行時機(關聯對象的加載時機)

一共有三種:對象

  • 直接加載:執行完主加載對象的查詢,立刻執行子查詢。
  • 侵入式延遲: 先執行主加載對象的查詢,後續使用主加載對象的屬性時(調用getter方法)才執行子查詢。只要使用主加載對象的屬性,就執行子查詢。
  • 深度延遲:先執行主加載對象的查詢,後續使用主加載對象的關聯對象屬性時才執行子查詢。使用的屬性要是主加載對象的關聯對象屬性時,才執行子查詢。

 

懶加載一共有2種方式,按照懶的程度,分爲侵入式延遲、深度延遲。blog

 

 


 

 

配置方式

可在全局配置文件中進行配置,也能夠在映射文件中進行配置。ci

 

(1)直接加載

默認就是直接加載,什麼都不用配置,固然也能夠顯式配置:get

   <settings>
        <setting name="lazyLoadingEnabled" value="false"/>
    </settings>

 

 

(2)侵入式延遲

    <settings>
        <!-- 使用懶加載 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 使用侵入式延遲的懶加載 -->
        <setting name="aggressiveLazyLoading" value="true"/>
    </settings>

aggressive 咄咄逼人的、激進的、主動模式的、喜愛侵入的,一有機會就加載,故名侵入式延遲。

缺省aggressiveLazyLoading時,默認爲true——侵入式延遲。(聽說舊版本的默認值是false——深度延遲,我未去驗證。)

 

 

(3)深度延遲

 <settings>
        <!-- 使用懶加載 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 使用深度延遲的懶加載 -->
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

 

 

(4)也能夠在映射文件的<association>或<collection>中單獨配置某個關聯對象的加載方式

<collection property="goodsList" select="com.chy.mapper.GoodsMapper.queryGoodsByGoodsId" column="no" ofType="goods" fetchType="lazy"/>

有2個可選的值:

  • eager  直接加載,默認值。eager 飢渴的。
  • lazy  深度延遲。

此種方式不能指定爲侵入式延遲。

 

 

在全局配置文件中進行的配置是配置全部的,在映射文件中的配置是配置單個的。

若是在mybatis全局配置文件中顯式配置了懶加載,又在映射文件中配置了懶加載,衝突時以全局配置文件中的配置爲準。

相關文章
相關標籤/搜索