Mybatis中的懒加载

article/2025/8/23 23:24:01

目录

基本概念

懒加载的应用场景

如何配置懒加载

全局配置

局部配置

懒加载的工作原理

示例代码

一对一懒加载

一对多懒加载

懒加载的触发条件

懒加载的优缺点

优点:

缺点:

解决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.hkcw.cn/article/cEHbOkDrsW.shtml

相关文章

无人机桥梁3D建模的拍摄频率

无人机桥梁3D建模的拍摄频率 无人机桥梁3D建模的拍摄频率&#xff08;每秒拍摄照片数&#xff09;需根据建模精度、飞行速度、相机性能等因素综合确定。以下是专业级作业的详细参数分析&#xff1a; 1. 核心计算公式 拍摄频率&#xff08;fps&#xff09; \frac{飞行速度&…

AI安全挑战与全球应对:从ComfyUI漏洞谈起

目录 引言&#xff1a;ComfyUI漏洞的警示 一、ComfyUI漏洞 1.1 漏洞类型与影响 1.2 官方处置建议 二、更广泛的AI安全挑战 2.1 快速迭代与安全滞后 2.2 数据隐私与保护 2.3 攻击手段的智能化与规模化 2.4 人才缺口与攻防不均衡 三、全球应对AI安全的努力 3.1 政府与…

天洑软件响应“链主“集结令,亮相“宁工品推“助力南京市产业链协同发展

5月27日&#xff0c;南京市召开“宁工品推”市场拓展供需对接活动暨江宁经济技术开发区专场大会&#xff0c;天洑软件响应"链主"集结令&#xff0c;亮相"宁工品推"大会现场。 大会聚集了行业内多领域杰出代表&#xff0c;通过交流讨论&#xff0c;深度剖析…

重塑企业:迈向人类、智能体与下一代组织模式

“未来的工厂只需要两名员工&#xff1a;一个人和一只狗。人的工作是喂狗&#xff0c;狗的工作是防止人碰机器。” 人工智能不再只是后台工具&#xff0c;它正逐步成为前线的协作者。当自主智能体&#xff08;智能体&#xff09;越来越能分析、优化&#xff0c;甚至代表我们做出…

时间序列噪声模型分析软件推荐与使用经验

最近在论文大修2024年投稿的一篇文章&#xff0c;大修了2轮&#xff0c;最后一次还是重新投稿&#xff0c;其中有一个问题一直被审稿人怼&#xff0c;他认为我计算时间序列的趋势的时候&#xff0c;没有考虑时间的相关性&#xff0c;即对噪声模型的估计不合理&#xff0c;会影响…

并行智算云:打破时空边界的云计算平台,助力 AI 与科研的极速前行!

一、引言 在数字化浪潮中&#xff0c;算力已然成为推动科技创新与产业变革的核心驱动力。随着人工智能&#xff08;AI&#xff09;技术的迅猛发展以及科研领域对计算需求的指数级增长&#xff0c;传统计算模式逐渐难以满足复杂任务的高效处理要求。并行智算云应运而生&#xf…

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.5 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第5章析因设计引导5.7节思考题5.5 R语言解题。主要涉及方差分析&#xff0c;正态假设检验&#xff0c;残差分析&#xff0c;交互作用图。 dataframe <-data.frame( wrapc(17,20,12,9,…

野火教程/SDIO工作流程/SDIO笔记

本流程是根据野火官方提供的F407源码绘制而来,可将照片另存为到自己电脑上进行观看 SDIO&#xff08;Secure Digital Input Output&#xff09;是在SD存储卡标准基础上扩展出来的一种接口标准&#xff0c;主要用于连接除了存储卡以外的输入/输出设备&#xff08;如Wi-Fi卡、蓝牙…

Vert.x学习笔记-什么是Handler

Vert.x学习笔记 在Vert.x中&#xff0c;Handler是一个核心概念&#xff0c;用于处理异步事件和回调。它是Vert.x响应式编程模型的核心组件之一&#xff0c;通过函数式接口的方式简化了异步编程的复杂性。 1. Handler的定义 Handler是一个函数式接口&#xff0c;定义如下&#…

什么是系统调用

系统调用是一种编程方式&#xff0c;计算机程序通过这种方式向执行它的操作系统内核请求服务。系统调用是程序与操作系统交互的一种方式。计算机程序在请求操作系统内核时进行系统调用。系统调用通过应用程序接口&#xff08;API&#xff09;向用户程序提供操作系统的服务。系统…

解决各个系统报错TDengine:no taos in java.library.path问题

windows 系统解决办法 在本地上安装一个TD的Windows客户端&#xff0c;注意安装的客户端版本一定要和服务端TD版本完全一致。&#xff08;或者将 C:\TDengine\driver\taos.dll 拷贝到 C:\Windows\System32\ 目录下&#xff09; 客户端各个历史版本下载链接&#xff1a;TDengin…

《100天精通Python——基础篇 2025 第22天:Python 多进程编程入门与实战详解》

目录 一、进程相关概念回顾二、多进程初体验2.1 使用multiprocessing模块创建进程2.2 使用Process子类创建进程2.3 使用进程池Pool创建进程2.4 concurrent.futures包 三、进程通信3.1 Pipe类3.2 进程队列3.2.1 队列简介3.2.2 多进程队列的使用 四、多进程优化图片下载器各个模块…

Spring boot集成milvus(spring ai)

服务器部署Milvus Run Milvus with Docker Compose (Linux) milvus版本可在docker-compose.yml中进行image修改 启动后&#xff0c;docker查看启动成功 spring boot集成milvus 参考了这篇文章 Spring AI开发RAG示例&#xff0c;理解RAG执行原理 但集成过程中遇到了一系列…

2人因经济拮据竟偷盗老房子金属门环!

2人因经济拮据竟偷盗老房子金属门环。近日,广东揭阳周田派出所连续接报多起住宅门环被盗案件,民警初步判断很可能是同一批人所为。经侦,警方成功抓获犯罪嫌疑人陈某忠、陈某晓,并查获被盗门环一批。经查,两名嫌疑人因经济拮据,专挑无人老房子盗窃。目前,案件进一步办理中…

[Dify] 如何应对明道云API数据过长带来的Token超限问题

在集成明道云与大型语言模型(LLM)如ChatGPT或本地部署的Dify时,开发者经常会面临一个核心问题:API获取的数据太长,超出LLM支持的Token数限制,导致无法直接处理。本文将深入探讨这个问题的成因,并提供几种可行的解决方案,包括分段处理、外部知识库构建等策略。 明道云AP…

周奇:藏海是庄之行生命中的光!

周奇:藏海是庄之行生命中的光。周奇在《藏海传》中饰演的庄之行与藏海关系复杂,藏海对其成长影响深远。庄之行从无忧无虑的公子到后期经历家庭变故、练武从军,角色跨度大。在这个熙熙攘攘的娱乐圈中,多少年轻的生命如繁星般闪烁,却也让人分不清哪个是珍珠,哪个是泥沙。然…

3D拟合测量水杯半径

1&#xff0c;目的。 测量水杯的半径 如图所示&#xff1a; 2&#xff0c;原理。 对 3D 点云对象 进行圆柱体拟合&#xff0c;获取拟合后的半径。 3&#xff0c;注意事项。 在Halcon中使用fit_primitives_object_model_3d进行圆柱体拟合时&#xff0c;输出的primitive_para…

数据可视化(第4、5、6次课)

Matplotlib 折线图 import numpy as np import matplotlib.pyplot as plt import matplotlib # 配置中文格式——保证图中出现中文的时候不会乱码 matplotlib.rcParams[font.sans-serif][SimHei] matplotlib.rcParams[axes.unicode_minus]False # 绘图 x np.linspace(0,2*np…

SpringBoot(五)--- 异常处理、JWT令牌、拦截技术

目录 一、异常处理 1. 问题分析 2. 全局异常处理器 二、登录校验技术 1.会话技术 1.1 Cookie 1.2 Session 2. JWT令牌 2.1 介绍 2.2 生成与校验 2.3 登录时下发令牌 3. 过滤器Filter 3.1 概述 3.2 登录校验过滤器 3.3 Filter详解 4. 拦截器interceptor 4.1 令…

springboot面试题

SpringBoot注解 SpringBootApplication EnableAutoConfiguration springboot自动配置原理 SpringBootApplication 是一个复合注解&#xff0c;结合了以下三个核心注解的功能&#xff0c;用于简化 Spring Boot 应用的启动类配置&#xff1a; SpringBootConfiguration Enabl…