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 的优势是:
加载对象后,直接获取完整数据,程序逻辑更简单。
总的来说, 根据实际应用场景,选择合适的加载策略可以获得性能和易用性的平衡。