MyBatis 的延迟加载?

发布于

一、定义

关联查询时,只在真正用到关联对象时才执行查询加载,避免一次性加载所有数据。

二、配置

<settings>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="aggressiveLazyLoading" value="false"/>
</settings>

三、原理

  • MyBatis 为关联对象创建 CGLIB 动态代理。
  • 调用代理对象的方法时,触发二次查询加载数据。
  • aggressiveLazyLoading=false 时,只有访问关联属性才加载。

四、注意

  • 需在 SqlSession 关闭前访问关联对象,否则无法加载。
  • 延迟加载减少首次查询数据量,但 N+1 问题需评估。