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