MyBatis 懶加載


 

懶加載的概念

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

當程序需要獲取|使用關聯對象時,mybatis再執行子查詢,這樣可以減輕數據庫的壓力,在一定程度上可以降低程序運行消耗、提高查詢效率。

 

 

懶加載的適用場景:

當前業務只使用主加載對象的其他屬性,或者暫時只使用主加載對象的其他屬性,長時間以后才使用主加載對象的關聯對象屬性。

 

 

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

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

 

 


 

 

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

一共有三種:

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

 

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

 

 


 

 

配置方式

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

 

(1)直接加載

默認就是直接加載,什么都不用配置,當然也可以顯式配置:

   <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全局配置文件中顯式配置了懶加載,又在映射文件中配置了懶加載,沖突時以全局配置文件中的配置為准。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM