# 延迟加载
如果一个对象关联另一个对象,那么在查询 A 对象的时候,会去关联查询 B 对象。
何时查询(加载)B 对象分为三种时机:
- 立即加载
- 激进式延迟加载
- 延迟加载
# 立即加载
MyBaits 默认是立即加载,即在查询 A 对象的时候,会立即查询其关联的 B 对象。如果,B 对象也有关联对象,例如 C 对象,那么还会立即查询 C 对象,... 因此类推,直到把所有有关联关系的数据全部查询出来。
# 激进式延迟加载
通过设置,可以启用延迟加载:
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
启用延迟加载之后,Mybatis 又是默认的激进地延迟加载。
Mybatis 内部会进行某种规则判断,从而使得激进式的延迟加载,有时候等同于立即加载,有时候等同于普通的延迟加载。
# 真-延迟加载
可以再通过配置关闭掉激进地延迟加载,从而进入普通的延迟加载:
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
普通的延迟加载只会在你真正用到 A 对象的 B 属性时,再去查询/加载 B 对象。