# 延迟加载

如果一个对象关联另一个对象,那么在查询 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 对象。