当前位置: 首页 > backend >正文

Mybatis中的懒加载

目录

基本概念

懒加载的应用场景

如何配置懒加载

全局配置

局部配置

懒加载的工作原理

示例代码

一对一懒加载

一对多懒加载

懒加载的触发条件

懒加载的优缺点

优点:

缺点:

解决N + 1查询问题的方法

注意事项

示例

对应sql语句

当只需输出Tname时

当输出全部信息时


懒加载(Lazy Loading)是 MyBatis 提供的一种优化数据加载的策略,它可以在需要时才加载关联数据,而不是在查询主对象时就立即加载所有关联数据。

基本概念

懒加载也称为延迟加载,它的核心思想是:只有在真正需要使用关联数据时才会执行查询,这样可以减少不必要的数据库查询,提高系统性能。

懒加载的应用场景

  1. 一对一关联查询(<association>)
  2. 一对多关联查询(<collection>)
  3. 多对多关联查询

如何配置懒加载

全局配置

在Mybatis配置文件中启用懒加载:

<settings><!-- 启用懒加载 --><setting name="lazyLoadingEnabled" value="true"/><!-- 设置积极加载为false,按需加载 --><setting name="aggressiveLazyLoading" value="false"/>
</settings>

局部配置

在映射文件中为特定关联配置懒加载:

<association property="teacher" javaType="Teacher" column="t_id" select="getTeacher" fetchType="lazy"/> <!-- 显式指定懒加载 -->

懒加载的工作原理

  1. 当查询主对象时,Mybatis只执行主查询SQL
  2. 返回的代理对象中包含关联对象的引用
  3. 当代码第一次访问关联对象时,Mybatis才会执行关联查询SQL
  4. 查询结果被填充到关联对象中

示例代码

一对一懒加载

<resultMap id="studentMap" type="Student"><id property="id" column="id"/><result property="name" column="name"/><!-- 懒加载teacher --><association property="teacher" javaType="Teacher" column="teacher_id" select="getTeacherById" fetchType="lazy"/>
</resultMap><select id="getStudent" resultMap="studentMap">SELECT * FROM student WHERE id = #{id}
</select><select id="getTeacherById" resultType="Teacher">SELECT * FROM teacher WHERE id = #{teacher_id}
</select>

一对多懒加载

<resultMap id="teacherMap" type="Teacher"><id property="id" column="id"/><result property="name" column="name"/><!-- 懒加载students --><collection property="students" ofType="Student" column="id" select="getStudentsByTeacherId" fetchType="lazy"/>
</resultMap><select id="getTeacher" resultMap="teacherMap">SELECT * FROM teacher WHERE id = #{id}
</select><select id="getStudentsByTeacherId" resultType="Student">SELECT * FROM student WHERE teacher_id = #{id}
</select>

懒加载的触发条件

懒加载的触发条件是访问关联对象的属性。例如:

Student student = studentMapper.getStudent(1);
// 此时还未加载teacherSystem.out.println(student.getTeacher().getName()); 
// 此时才会执行teacher的查询

懒加载的优缺点

优点:

  1. 减少不必要的查询:只加载需要的数据
  2. 提高性能:减少数据库访问次数
  3. 节省内存:避免加载大量不使用的数据

缺点:

  1. N + 1查询问题:如果遍历多个主对象并访问关联对象,会导致多次查询
  2. 调试复杂性:由于加载时机不明确,可能增加调试难度
  3. 可能引发异常:如果在Session关闭后访问懒加载对象会抛出异常

解决N + 1查询问题的方法

  1. 使用批量加载(Batch Loading)
  2. 在特定场景下关闭懒加载,使用联合查询
  3. 使用Mybatis的@Lazy注解控制加载行为

注意事项

  1. Session生命周期:懒加载需要在Session未关闭时使用,否则会抛出异常
  2. 序列化问题:懒加载对象序列化后再反序列化会失去懒加载特性
  3. 性能监控:需要监控实际使用中的性能,避免过度使用导致性能下降

懒加载是Mybatis中一个强大的特性,合理使用可以显著提高应用性能,但也需要根据实际场景谨慎使用

示例

https://blog.csdn.net/qq_52331401/article/details/148306528?spm=1001.2014.3001.5502

我在上面文章中写了一对多查询demo,下面写一个方法测试懒加载的效果

对应sql语句

select teacher.*, student.* from student right join teacher on student.t_id = teacher.id;

当只需输出Tname时

可以看到控制台只查询了Tname

当输出全部信息时

可以看到整条sql语句都被执行了

http://www.xdnf.cn/news/9792.html

相关文章:

  • 高密爆炸警钟长鸣:AI为化工安全戴上“智能护盾”
  • 基于MATLAB实现SFA(Slow Feature Analysis,慢特征分析)算法
  • Java八股-Java优缺点,跨平台,jdk、jre、jvm关系,解释和编译
  • Java 微服务架构设计:服务拆分与服务发现的策略
  • 信息学奥赛一本通 1551:维护序列
  • 为什么在我的Flask里面有两个路由,但是在网页里有一个却不能正确访问到智能体
  • JDBC 核心执行流程详解
  • 如何在矩池云实例上开启应用服务的访问端口
  • 测试策略:AI模型接口的单元测试与稳定性测试
  • ADQ108-1通道8bit 6~7G USB2.0 PXIe cPCIe采集
  • 【大模型面试每日一题】Day 31:LoRA微调方法中低秩矩阵的秩r如何选取?
  • 解决matlab两个库文件名冲突的问题
  • 据传苹果将在WWDC上发布iOS 26 而不是iOS 19
  • 第一章 Linux的例行性工作(计划任务)
  • 大模型深度学习之双塔模型
  • 从 “金屋藏娇” 到 自然语言处理(NLP)
  • 汽车EPS系统的核心:驱动芯片的精准控制原理
  • 高校大数据采集平台产品特色
  • Linux系统管理与编程24:基础条件准备-混搭“本地+阿里云”yum源
  • 替代 WPS 的新思路?快速将 Word 转为图片 PDF
  • Spring Boot 集成 Elasticsearch怎样在不启动es的情况下正常启动服务
  • VR视角下,浙西南革命的热血重生​
  • 打卡day39
  • OpenCV CUDA模块结构分析与形状描述符------在 GPU 上计算图像的原始矩(spatial moments)函数spatialMoments()
  • Python自动化之selenium语句——元素点击、输入、清空和八大元素定位方法
  • 【保姆级教程】Windows部署LibreTV+cpolar实现远程影音库访问全步骤
  • PaddleOCR本地部署 (Python+Flask)
  • 【机器学习基础】机器学习入门核心算法:集成学习(Ensemble Learning)
  • 【.net core】SkiaSharp 如何在Linux上实现
  • ArkUI(方舟UI框架)介绍