配置延迟加载有两种方式:
全局配置。整个项目所有N+1位置都生效。
局部配置。只配置某个N+1位置。
两种方式需要选择其中一种,如果两种方式都使用了,局部配置方式生效。
全局配置方式
官方文档全局设置属性说明
属性名 | 解释说明 | 可取值 | 默认值 |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 | true | false | false |
aggressiveLazyLoading | 开启时,任一方法的调用都会加载该对象的所有延迟加载属性。 否则,每个延迟加载属性会按需加载(参考 lazyLoadTriggerMethods)。 | true | false | false (在 3.4.1 及之前的版本中默认为 true) |
根据上面说明:从3.4.1版本开始需要在MyBatis全局配置文件里面配置lazyLoadingEnabled=true即可在当前项目所有N+1的位置开启延迟加载。
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
局部配置方式
局部配置方式需要在collection或association标签中配置fetchType属性。fetchType可取值:lazy(延迟加载)和eager(立即加载)。
当配置了fetchType属性后,全局settings的配置被覆盖,对于当前标签以fetchType属性值为准。
<resultMap id="addMap" type="Address">
<id column="id" property="id"></id>
<result column="province" property="province"/>
<result column="city" property="city"/>
<result column="address" property="address"/>
<association property="customer" javaType="Customer"
select="com.xu.mapper.CustomerMapper.selectById"
column="{id:customer_id}"
fetchType="lazy">
</association>
</resultMap>