MyBatis如何处理懒加载和预加载?

大家好,我是锋哥。今天分享关于【MyBatis如何处理懒加载和预加载?】**面试题。**希望对大家有帮助;

MyBatis如何处理懒加载和预加载?

超硬核AI学习资料,现在永久免费了!

在 MyBatis 中,懒加载(Lazy Loading)和预加载(Eager Loading)是两种不同的查询策略,用于控制关联对象的加载时机和方式。具体处理方式如下:

1. 懒加载(Lazy Loading)

懒加载是指在查询时,只加载需要的主对象,关联的其他对象则在需要时才被加载。懒加载的优点是能减少数据库的查询次数和内存的使用,但可能会导致 N+1 查询问题。

如何启用懒加载:

  • 默认情况下,MyBatis 支持懒加载。如果需要启用懒加载,需要在 MyBatis 的配置文件中启用懒加载功能:

  • lazyLoadingEnabled: 启用懒加载。默认为 false,设为 true 时启用懒加载。

  • aggressiveLazyLoading: 默认情况下,如果访问延迟加载的属性,MyBatis 会立即执行 SQL 查询。如果该属性设为 false,则只有在实际访问时才加载关联的对象,避免了无意义的查询。

懒加载的使用: 懒加载通常用在 resultMapassociationcollection 等关联映射中,例如:

复制代码
<resultMap id="userMap" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <association property="address" column="address_id" javaType="Address" select="selectAddressById"/>
</resultMap>

在上面的例子中,address 字段是一个懒加载属性,它会在第一次访问时才会通过 selectAddressById 查询。

2. 预加载(Eager Loading)

预加载是指在查询时,关联对象会和主对象一并加载,通常在数据库查询时一次性将关联的所有数据加载出来。

如何启用预加载:

  • 默认情况下,MyBatis 的关联对象是采用懒加载策略的。如果想要使用预加载,可以通过 fetchType 属性设置为 EAGER

  • fetchType 可以设置为 LAZYEAGER,默认值为 LAZY。设置为 EAGER 时,关联的对象会被立即加载,而不是延迟加载。

预加载的使用:

复制代码
<resultMap id="userMap" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <association property="address" column="address_id" javaType="Address" fetchType="EAGER"/>
</resultMap>

在这个例子中,address 字段是采用预加载策略,在查询 User 时,Address 会立即被加载出来。

总结

  • 懒加载 :关联的对象不会立即加载,只有在访问该对象时才会执行 SQL 查询。这有助于提高性能,但可能导致 N+1 查询问题。需要通过 lazyLoadingEnabledfetchType 设置来控制。
  • 预加载 :在查询主对象时,所有关联的对象会一并加载,通常会带来性能损失,因为需要加载更多数据,但避免了懒加载可能导致的额外查询。可以通过 fetchType 设置为 EAGER 来启用。

在使用时,可以根据具体场景决定是否启用懒加载或预加载,尤其在设计复杂的关联查询时,需要权衡性能与查询次数。

相关推荐
咩咩啃树皮16 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
灯澜忆梦17 小时前
GO_并发编程---定时器
开发语言·后端·golang
鱟鲥鳚17 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
-银雾鸢尾-17 小时前
C#中的StringBuilder相关方法
开发语言·c#
-银雾鸢尾-17 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
大模型码小白18 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司19 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地20 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
憧憬成为web高手20 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
wuqingshun31415920 小时前
TCP超时重传机制是为了解决什么问题?
java