MyBatis中的延遲加載,也稱爲懶加載,是指進行關聯查詢時,按需執行子查詢。數據庫
當程序須要獲取|使用關聯對象時,mybatis再執行子查詢,這樣能夠減輕數據庫的壓力。mybatis
懶加載的適用場景:app
當前業務只使用主加載對象的其餘屬性,或者暫時只使用主加載對象的其餘屬性,長時間之後才使用主加載對象的關聯對象屬性。fetch
懶加載只對關聯查詢起做用(一對1、一對多、多對多),且只對嵌套查詢方式起做用,由於嵌套結果、擴展類的方式都是一次查詢所需數據,不存在子查詢,也就不存在延遲加載的狀況。spa
MyBatis的延遲加載只是延遲執行子查詢,對於主加載對象的查詢都是直接執行的。
code
一共有三種:對象
懶加載一共有2種方式,按照懶的程度,分爲侵入式延遲、深度延遲。blog
可在全局配置文件中進行配置,也能夠在映射文件中進行配置。ci
默認就是直接加載,什麼都不用配置,固然也能夠顯式配置:get
<settings> <setting name="lazyLoadingEnabled" value="false"/> </settings>
<settings>
<!-- 使用懶加載 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 使用侵入式延遲的懶加載 -->
<setting name="aggressiveLazyLoading" value="true"/>
</settings>
aggressive 咄咄逼人的、激進的、主動模式的、喜愛侵入的,一有機會就加載,故名侵入式延遲。
缺省aggressiveLazyLoading時,默認爲true——侵入式延遲。(聽說舊版本的默認值是false——深度延遲,我未去驗證。)
<settings>
<!-- 使用懶加載 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 使用深度延遲的懶加載 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<collection property="goodsList" select="com.chy.mapper.GoodsMapper.queryGoodsByGoodsId" column="no" ofType="goods" fetchType="lazy"/>
有2個可選的值:
此種方式不能指定爲侵入式延遲。
在全局配置文件中進行的配置是配置全部的,在映射文件中的配置是配置單個的。
若是在mybatis全局配置文件中顯式配置了懶加載,又在映射文件中配置了懶加載,衝突時以全局配置文件中的配置爲準。