- N+1问题:假设现在有N个关联关系完成了级联,那么只要再引入一个关联关系,就变成了N+1级联,所有级联的SQL都会被执行,显然会有很多我们不需要的数据被加载进来,这就造成了极大的资源浪费。
- 引入延迟加载的目的:为了处理N+1问题(级联加载的性能问题)
- MyBatis的配置文件中两个全局配置可以配置延迟加载 ,如下:
<settings>
<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。默认:true -->
<!-- <setting name="lazyLoadingEnabled" value="true"/> -->
<!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性 . 默认:true-->
<!-- <setting name="aggressiveLazyLoading" value="true"/> -->
</settings>
如果设置 lazyLoadingEnabled = false,则禁用延迟加载,会级联加载所有关联对象的数据
如果设置 lazyLoadingEnabled = true,默认情况下mybatis 是按层级延时加载的。
如果在设置了1.1 后,使用 aggressiveLazyLoading 可以按需加载。
aggressiveLazyLoading = true,mybatis 是按层级延时加载
aggressiveLazyLoading = false,mybatis 按需求加载。
- 有时全局配置不是那么的适合自己需求,mybatis 提供了局部延时加载功能。
在 collection 或 association 元素上加入属性值 fetchType 就可以了,他有两个取值 eager 和 lazy。