MyBatis中的延迟加载,也称为懒加载,是指进行关联查询时,按需执行子查询。 当程序需要获取|使用关联对象时,mybatis再执行子查询,这样可以减轻数据库的压力,在一定程度上可以降低程序运行消耗、提高查询效率。 懒加载的适用场景: 当前业务只使用主加载对象的其他属性,或者暂时只使用主加载对象的其他属性,长时间以后才使用主加载对象的关联对象属性。 懒加载只对关联查询起作用(一对一、一对多、多对多),且只对嵌套查询方式起作用,因为嵌套结果、扩展类的方式都是一次查询所需数据,不存在子查询,也就不存在延迟加载的情况。 MyBatis的延迟加载只是延迟执行子查询,对于主加载对象的查询都是直接执行的。 一共有三种: 懒加载一共有2种方式, 按照懒的程度,分为侵入式延迟、深度延迟。 可以在全局配置文件中进行配置,也可以在映射文件中进行配置。 默认就是直接加载,什么都不用配置,当然也可以显式配置: aggressiveLazyLoading = true,mybatis 是按层级延时加载 aggressive 咄咄逼人的、激进的、主动模式的、喜好侵入的,一有机会就加载,故名侵入式延迟 aggressiveLazyLoading = false,mybatis 按需求加载。默认为false 有2个可选的值: 此种方式不能指定为侵入式延迟。 在全局配置文件中进行的配置是配置所有的,在映射文件中的配置是配置单个的。如果在mybatis全局配置文件中显式配置了懒加载,又在映射文件中配置了懒加载,冲突时以全局配置文件中的配置为准 参考文章地址: https://www.cnblogs.com/chy18883701161/p/12158924.html https://www.cnblogs.com/goloving/p/14854902.html懒加载的概念
子查询的执行时机(关联对象的加载时机)
配置方式
(1)直接加载
<settings>
<setting name="lazyLoadingEnabled" value="false"/>
</settings>
(2)侵入式延迟
<settings>
<!-- 使用懒加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 使用侵入式延迟的懒加载 -->
<setting name="aggressiveLazyLoading" value="true"/>
</settings>
(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"/>
<association property="user" column="uid" javaType="User" select="cn.ideal.mapper.UserMapper.findById"></association>