MyBatis 的 LazyLoad 以及 No-LazyLoad分别是什么含义?

MyBatis 的延迟加载(Lazy Load) 和 立即加载(No-Lazy Load)含义如下:

Lazy Load(延迟加载):

  • 只有在需要使用对象属性时,才执行加载数据的 SQL。
  • 它可以避免 IN 查询所有数据的性能问题。
  • 在 Association 和 Collection 配置中通过 fetchType=”lazy” 开启。

No-Lazy Load(立即加载):

  • 用户一旦加载对象,就会马上执行加载数据的 SQL,将所有数据映射到对象中。
  • 通常性能比 Lazy Load 慢一些。
  • 在 Association 和 Collection 配置中默认就是立即加载。

代码实例:

@Data
public class ITZhiMeiUser {

  private Integer id;
  private String name;  
  // 延迟加载
  @OneToMany(fetch = FetchType.LAZY)
  private List<Order> orders;
}
<association property="orders" column="uid" 
         javaType="Order" fetchType="lazy"/>

这里配置了 lazy fetchType ,表示延迟加载。

那么,当获取 user.getOrders() 时,Mybatis 才会执行加载 Order 数据的 SQL。

Lazy Load 的优势是:

只有在真正需要子对象时,才执行相应的 SQL,可有效降低初次加载对象的性能消耗。

No-Lazy Load 的优势是:

加载对象后,直接获取完整数据,程序逻辑更简单。

总的来说, 根据实际应用场景,选择合适的加载策略可以获得性能和易用性的平衡。