MyBatis处理懒加载和预加载的实战详解

 更新时间:2026年02月02日 08:33:10   作者:java1234_小锋  
在Java开发中,MyBatis是一个广泛使用的持久层框架,它为开发者提供了灵活、强大的数据访问能力,两种常用的加载策略是懒加载和预加载,本文将介绍这两种加载方式的概念、适用场景以及MyBatis中的实现方式,需要的朋友可以参考下

引言

在Java开发中,MyBatis是一个广泛使用的持久层框架,它为开发者提供了灵活、强大的数据访问能力。两种常用的加载策略是懒加载(Lazy Loading)和预加载(Eager Loading)。本文将介绍这两种加载方式的概念、适用场景以及MyBatis中的实现方式,并通过代码示例进行说明。

懒加载(Lazy Loading)

懒加载是一种性能优化技术,它允许系统在需要使用某个对象时才加载该对象,而不是在一开始就将所有数据加载到内存中。在MyBatis中,懒加载可以减少不必要的数据库查询,提升应用性能。

要开启懒加载

在MyBatis的配置文件中,可以通过设置lazyLoadingEnabled属性来开启懒加载。如下所示:

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

示例代码

以下是一个使用懒加载的示例,假设我们有一个 User 类和一个 Order 类,一个用户可以有多个订单。

// User.java
public class User {
    private Integer id;
    private String name;
    private List<Order> orders; // 订单列表

    // getters and setters
}

// Order.java
public class Order {
    private Integer id;
    private String productName;
    
    // getters and setters
}

在对应的 MyBatis XML 映射文件中:

<mapper namespace="com.example.UserMapper">
    <resultMap id="userResultMap" type="User">
        <id property="id" column="user_id"/>
        <result property="name" column="user_name"/>
        <collection property="orders" column="user_id" select="com.example.OrderMapper.selectOrdersByUserId" fetchType="lazy"/>
    </resultMap>
</mapper>

OrderMapper 中定义子查询:

<mapper namespace="com.example.OrderMapper">
    <select id="selectOrdersByUserId" resultType="Order">
        SELECT * FROM orders WHERE user_id = #{userId}
    </select>
</mapper>

懒加载注意事项

  • 懒加载需要在代理对象中实现,因此需要将 User 类设定为 final
  • 懒加载的对象只在第一次访问时被加载,后续的针对同一对象的访问会直接使用已经加载的数据。

预加载(Eager Loading)

与懒加载相对,预加载是在查询主对象时就同时加载其关联的数据。虽然这减小了后续查询的数量,但可能会加载不必要的数据,从而导致性能开销。

要开启预加载

默认情况下,MyBatis会使用预加载,开发者可以适时地指定需要预加载的关联对象。使用 fetchType 属性可以控制加载方式。

示例代码

同样以 UserOrder 示例为基础,我们可以将 fetchType 设置为 eager 来实现预加载:

<collection property="orders" column="user_id" select="com.example.OrderMapper.selectOrdersByUserId" fetchType="eager"/>

在这种情况下,当我们查询用户时,其所有订单将会与用户信息一起加载。使用如下的代码:

User user = userMapper.selectUserById(1);
List<Order> orders = user.getOrders(); // 此时该列表已经被预加载

预加载注意事项

  • 应谨慎使用预加载,尤其是在处理大量数据时,可能导致不必要的性能损失。
  • 预加载特别适合于必要的、常用的关联数据。

总结

MyBatis为懒加载和预加载提供了灵活的配置选项。懒加载有助于提高性能,避免不必要的数据库访问,而预加载则在需要的时候确保高效访问数据。开发者应根据实际需求选择合适的加载策略,确保在性能和数据完整性之间取得良好的平衡。掌握这两种加载策略对Java开发者在高频面试题中尤为重要,是展示对MyBatis深入理解的关键。

以上就是MyBatis处理懒加载和预加载的实战详解的详细内容,更多关于MyBatis处理懒加载和预加载的资料请关注脚本之家其它相关文章!

相关文章

  • Eclipse新建web项目流程图解

    Eclipse新建web项目流程图解

    这篇文章主要介绍了Eclipse新建web项目流程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Java线程池中的工作线程Worker类源码解析

    Java线程池中的工作线程Worker类源码解析

    这篇文章主要介绍了Java线程池中的工作线程Worker类源码解析,线程池中的工作线程是通过内部类Worker表示的,Worker继承自AbstractQueueSynchronizer,可以实现同步器的功能,需要的朋友可以参考下
    2023-12-12
  • 使用maven依赖详解

    使用maven依赖详解

    本文主要介绍了Maven的基础知识,包括Maven的简介、仓库类型、常用命令、场景举例、指令总结、依赖范围、settings.xml说明等,同时,还详细讲解了Maven依赖的传递、手动声明optional、冲突解决等概念
    2025-02-02
  • Java统计接口耗时的六种常见方法

    Java统计接口耗时的六种常见方法

    有些小伙伴在工作中,可能经常遇到这样的场景:线上接口突然变慢,用户抱怨连连,你却一头雾水,不知道问题出在哪里,其实,这些问题都离不开一个基础技能如何准确统计接口耗时,所以本文就跟大家一起聊聊统计接口耗时的6种常见方法,需要的朋友可以参考下
    2025-10-10
  • 简单讲解Java设计模式编程中的单一职责原则

    简单讲解Java设计模式编程中的单一职责原则

    这篇文章主要介绍了Java设计模式编程中的单一职责原则,这在团队开发编写接口时经常使用这样的约定,需要的朋友可以参考下
    2016-02-02
  • maven资源过滤打包后文件变大的处理方法

    maven资源过滤打包后文件变大的处理方法

    maven目前在web上面的使用方式很普遍,而打包的方式也存在很多方式,下面这篇文章主要给大家介绍了关于maven资源过滤打包后文件变大的处理方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-07-07
  • Java @Accessors注解图文详解

    Java @Accessors注解图文详解

    @Accessors用于改变@Data生成的getter和setter方法的生成结果,下面这篇文章主要给大家介绍了关于Java @Accessors注解的相关资料,需要的朋友可以参考下
    2023-02-02
  • Java实现将PDF转换为Word的示例详解

    Java实现将PDF转换为Word的示例详解

    在日常的数据处理、文档编辑和系统集成工作中,将不可编辑的PDF文档转换为可编辑的Word文档是一项常见且重要的需求,下面我们就来看看如何使用java实现这一操作吧
    2025-08-08
  • SpringBoot如何集成Kafka低版本和高版本

    SpringBoot如何集成Kafka低版本和高版本

    这篇文章主要介绍了SpringBoot如何集成Kafka低版本和高版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Java中的StringUtils引入及使用示例教程

    Java中的StringUtils引入及使用示例教程

    这篇文章主要介绍了Java中的StringUtils引入及使用示例教程,本文结合示例代码给大家介绍的非常详细,介绍了java中StringUtils用法,感兴趣的朋友跟随小编一起看看吧
    2023-01-01

最新评论