MyBatis的延迟加载(懒加载)
2023-12-22 22:47:18
MyBatis 中的延迟加载是指在需要时才加载对象的某些属性或关联对象,而不是在初始查询时就加载所有数据。这对于性能优化和减少不必要的数据库查询非常有用。
1. 基于配置文件的延迟加载
在 MyBatis 的 XML 映射文件中,你可以使用 lazyLoadingEnabled
和 aggressiveLazyLoading
属性来配置延迟加载的行为。
-
lazyLoadingEnabled
:设置为 true 启用延迟加载,默认为 false。当设置为 true 时,MyBatis 将延迟加载对象的属性。 -
aggressiveLazyLoading
:设置为 true 时,MyBatis 会在任何可能的情况下延迟加载对象的属性。默认为 false。
开启方式
- 方式1:全局设置,在mybatis-config.xml中进行开启
<!-- MyBatis 配置文件 -->
<configuration>
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
</configuration>
- 方式2:局部设置,<association>和<collection>有个fetchType属性可以覆盖全局的懒加载状态:eager表示这个级联不使用懒加载要立即加载,lazy表示使用懒加载。
?
2. 关联关系的延迟加载
在映射文件中,可以使用 <association>
或 <collection>
标签设置延迟加载。这样,在查询主对象时,关联对象的数据不会立即加载,只有在需要访问关联对象时才会执行额外的查询获取数据。
<!-- 用户表映射文件 UserMapper.xml -->
<select id="getUserWithOrders" resultMap="userWithOrders" parameterType="int">
SELECT * FROM users WHERE id = #{userId}
</select>
<resultMap id="userWithOrders" type="User">
<id property="id" column="id" />
<!-- 其他用户属性 -->
<collection property="orders" ofType="Order" lazyLoad="true">
<id property="orderId" column="order_id" />
<!-- 其他订单属性 -->
</collection>
</resultMap>
3. 使用注解实现延迟加载
在 MyBatis 中也可以使用注解来实现延迟加载,例如使用 @Lazy
注解标注关联对象或集合。
public class User {
private int id;
private String username;
@Lazy
private List<Order> orders;
// Getters and setters
}
注意事项
- 延迟加载可以减少不必要的数据库查询,但如果不谨慎使用,可能会导致 N+1 查询问题(执行大量额外的查询)或者产生潜在的性能问题。
- 使用延迟加载时,需要留意 Session 的生命周期。在对象加载时 Session 必须仍然处于打开状态,否则延迟加载可能会引发异常。
延迟加载是一个强大的特性,但需要根据实际情况谨慎使用,以确保在性能和数据一致性之间取得平衡。
文章来源:https://blog.csdn.net/qq_57570052/article/details/135161706
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!