MyBatis的延迟加载(懒加载)

MyBatis 中的延迟加载是指在需要时才加载对象的某些属性或关联对象,而不是在初始查询时就加载所有数据。这对于性能优化和减少不必要的数据库查询非常有用。

1. 基于配置文件的延迟加载

在 MyBatis 的 XML 映射文件中,你可以使用 lazyLoadingEnabledaggressiveLazyLoading 属性来配置延迟加载的行为。

  • 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表示使用懒加载。
    <resultMap id="getUserById2Result" type="com.by.pojo.User">
                ... ...
                <!--
                    property="accountList":pojo的属性
                    ofType="account":集合的泛型
                    select="com.by.mapper.AccountMapper.selectAccountByUid":要调用的select标签的id
                    column="id":传递的参数
                    fetchType="lazy":局部开启延迟加载
                -->
                <collection property="accountList"
                            ofType="account"
                            select="com.by.mapper.AccountMapper.selectAccountByUid"
                            column="id"
                            fetchType="lazy">
                </collection>
            </resultMap>
    
            <select id="getUserById2" parameterType="int" resultMap="getUserById2Result">
                select * from user where id=#{id}
            </select>

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 必须仍然处于打开状态,否则延迟加载可能会引发异常。

延迟加载是一个强大的特性,但需要根据实际情况谨慎使用,以确保在性能和数据一致性之间取得平衡。

相关推荐

  1. MyBatis延迟

    2023-12-23 23:00:04       45 阅读
  2. MyBatis延迟与分步查询总结

    2023-12-23 23:00:04       7 阅读
  3. React

    2023-12-23 23:00:04       22 阅读
  4. 同步、异步延迟、预区别

    2023-12-23 23:00:04       41 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-23 23:00:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-23 23:00:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-23 23:00:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-23 23:00:04       20 阅读

热门阅读

  1. SpringBoot整合Mybatis遇到的常见问题及解决方案

    2023-12-23 23:00:04       44 阅读
  2. 点云分割--基于PatchWork++的地面点云分割

    2023-12-23 23:00:04       46 阅读
  3. vue2与vue3的区别

    2023-12-23 23:00:04       33 阅读
  4. 7-9 装箱问题

    2023-12-23 23:00:04       42 阅读
  5. C++面向对象(OOP)编程-位运算详解

    2023-12-23 23:00:04       36 阅读
  6. <ctype.h> 头文件:C 语言字符处理函数详解

    2023-12-23 23:00:04       36 阅读