MyBatis如何处理延迟加载?
大家好,我是锋哥。今天分享关于【MyBatis如何处理延迟加载?】面试题。希望对大家有帮助;
MyBatis如何处理延迟加载?
1000道 互联网大厂Java工程师 精选面试题-Java资源分享网
MyBatis 支持 延迟加载(Lazy Loading),允许在需要数据时才从数据库加载,而不是在查询结果第一次返回时就立即加载所有数据。这种方式可以优化性能,减少不必要的数据库查询,提高应用的响应速度和资源利用效率。
延迟加载的原理
延迟加载的核心思想是,将关联对象或集合的加载推迟到真正需要时才进行加载,而不是在主查询时一次性加载。这可以通过两种主要方式实现:
- 延迟加载单个关联对象(如:查询时只加载主对象,关联对象在访问时才加载)
- 延迟加载集合属性(如:查询时不加载集合,只有在访问集合时才进行查询)
MyBatis 通过代理模式(代理对象)和懒加载机制来实现延迟加载。以下是 MyBatis 如何处理延迟加载的详细信息:
1. 开启延迟加载
MyBatis 默认开启延迟加载机制,但你需要在配置文件中指定相关配置。
在 mybatis-config.xml
配置文件中:
<settings><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/><setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode"/>
</settings>
lazyLoadingEnabled
:开启延迟加载,默认为true
,启用后,MyBatis 会对关联的对象进行延迟加载。aggressiveLazyLoading
:是否强制加载所有的延迟加载属性。默认为false
,即延迟加载会在实际访问时才加载。lazyLoadTriggerMethods
:定义了触发延迟加载的 Java 方法,通常是equals
、hashCode
或clone
等方法。当调用这些方法时,MyBatis 会检查是否需要延迟加载关联对象。
2. 延迟加载的配置
在 MyBatis 中,可以通过以下几种方式配置延迟加载:
2.1 使用 resultMap
配置延迟加载
延迟加载通常与映射关系中的关联对象一起使用。例如,当你在 resultMap
中映射一个对象时,可以通过 fetchType
来指定加载策略。
<resultMap id="orderResultMap" type="Order"><id property="id" column="order_id"/><result property="user" column="user_id" fetchType="lazy"/>
</resultMap>
fetchType="lazy"
:表示该属性(关联对象)采用延迟加载,只有在访问时才会从数据库加载。fetchType="eager"
:表示该属性(关联对象)采用立即加载,查询时就会一起加载。
fetchType
是 @Many
和 @One
注解的属性,控制关联对象的加载方式。
2.2 使用 @One
和 @Many
注解进行延迟加载
如果使用注解方式进行映射,可以使用 @One
和 @Many
注解来指定加载策略:
public class Order {private int id;private String name;@One(fetchType = FetchType.LAZY)private User user; // 延迟加载 User 对象
}
在这种配置下,user
关联对象会在访问时触发延迟加载。
2.3 在查询时设置延迟加载
在某些情况下,你可能希望通过在查询方法中控制延迟加载。你可以在 Mapper
中使用 @Select
注解来控制:
@Select("SELECT * FROM orders WHERE id = #{id}")
@Results({@Result(property = "user", column = "user_id", one = @One(select = "com.example.mapper.UserMapper.selectUser", fetchType = FetchType.LAZY))
})
Order selectOrderById(int id);
此时 user
关联对象会被延迟加载。
3. 如何触发延迟加载
延迟加载是通过代理对象实现的。当你访问被延迟加载的关联对象时,MyBatis 会触发数据库查询。
例如,假设有一个 Order
对象,它有一个关联的 User
对象,在访问 Order
对象时,User
不会立即加载,只有当你访问 Order.getUser()
时,MyBatis 才会执行 SQL 查询,加载 User
数据。
Order order = orderMapper.selectOrderById(1);
User user = order.getUser(); // 此时会触发延迟加载,查询 User 数据
4. 延迟加载的代理机制
为了支持延迟加载,MyBatis 在内部使用 代理模式 来创建一个代理对象。当你访问延迟加载的属性时,代理对象会触发实际的数据库查询,并将查询结果赋给原始对象。代理对象会在数据库查询后进行填充,并返回给调用者。
- JDK 动态代理:当延迟加载的对象实现了接口时,MyBatis 会使用 JDK 动态代理来延迟加载。
- CGLIB 动态代理:当延迟加载的对象没有实现接口时,MyBatis 会使用 CGLIB 动态代理来实现。
5. 注意事项
-
性能问题:虽然延迟加载有助于减少不必要的数据库查询,但过度使用延迟加载也可能导致 N+1 查询问题。例如,如果你有一个包含多个订单的列表,每个订单的用户都是延迟加载的,那么可能会触发多次数据库查询(一次查询订单表,之后每个订单查询一次用户表)。可以通过
<fetchType="eager">
或<join fetch>
等优化策略来避免此问题。 -
事务问题:延迟加载通常需要在同一个事务范围内进行。如果在关闭事务后访问延迟加载的属性,可能会抛出
LazyInitializationException
异常。为了避免这种问题,可以使用 OpenSessionInView 模式,确保事务在视图渲染期间保持开启。
总结
MyBatis 提供了强大的延迟加载功能,它通过代理模式、fetchType
配置以及延迟加载触发机制来实现数据的按需加载。配置合理的延迟加载能够优化性能,减少不必要的数据库查询,但也需要小心处理 N+1 查询问题 和 事务管理。
相关文章:

MyBatis如何处理延迟加载?
大家好,我是锋哥。今天分享关于【MyBatis如何处理延迟加载?】面试题。希望对大家有帮助; MyBatis如何处理延迟加载? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MyBatis 支持 延迟加载(Lazy Loading&am…...

前端网络之【浏览器跨域问题分析与解决方案】
文章目录 同源策略同源与异源跨域的限制场景解决方案 CORS 请求分类 简单请求预检请求 注意点一 【关于Cookie】注意点二 【关于跨域获取响应头】 JSONP 基本流程 代理服务器 如何选择对应方案 同源策略 **同源策略是一套浏览器的安全策略机制,当一个源的文档和脚…...

LeetCode:3218. 切蛋糕的最小总开销 I(贪心 Java)
目录 3218. 切蛋糕的最小总开销 I 题目描述: 实现代码与解析: 贪心 原理思路: 3218. 切蛋糕的最小总开销 I 题目描述: 有一个 m x n 大小的矩形蛋糕,需要切成 1 x 1 的小块。 给你整数 m ,n 和两个数…...

前端下载后端文件流,文件可以下载,但是打不开,显示“文件已损坏”的问题分析与解决方案
目录 场景还原 相关代码开发者工具 - 网络请求记录 问题排查 定位改bug 总结 场景还原 我在前端使用axios接收后端xlsx表格文件流并下载,xlsx文件能够下载成功,但是打开却显示文件无法打开 相关代码 请求API封装:Content–Type以及responseType经核…...

PageRank Web页面分级算法 HNUST【数据分析技术】(2025)
1.理论知识 算法原理PageRank 通过网络浩瀚的超链接关系来确定一个页面的等级。 Google 把从 A 页面到 B 页面的链接解释为A页面给B页面投票, Google 根据投票来源(甚至来源的来源, 即链接到A页面的页面)和投票目标的等级来决定新…...

数字IC前端学习笔记:脉动阵列的设计方法学(四)
相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 引言 脉动结构(也称为脉动阵列)表示一种有节奏地计算并通过系统传输数据的处理单元(PEs)网络。这些处理单元有规律地泵入泵出数据以保持规则…...

对话 Project Astra 研究主管:打造通用 AI 助理,主动视频交互和全双工对话是未来重点
Project Astra 愿景之一:「系统不仅能在你说话时做出回应,还能在持续的过程中帮助你。」 近期,Google DeepMind 的 YouTube 频道采访了 Google DeepMind 研究主管格雷格韦恩 (Greg Wayne)。 格雷格韦恩的研究工作为 DeepMind 的诸多突破性成…...
NetApp 存储设备巡检作业指导书
NetApp 存储设备巡检作业指导书 一、目的 本指导书旨在指导管理员通过 SSH 或 Console 登录 NetApp FAS2552 存储系统,切换节点并进行日常管理操作。 二、适用范围 适用于基于 NetApp ONTAP 操作系统的 FAS2552 存储环境。 三、前提条件 网络和权限要求࿱…...
adb无法连接到安卓设备【解决方案】报错:adb server version (40) doesn‘t match this client (41);
下载老版本Platformtoolshttps://dl.google.com/android/repository/platform-tools_r28.0.2-windows.zip?hlzh-cn 替换原来的platform-tools文件夹即可。 问题原因分析:电脑端adb client版本(41)和安卓端adb …...
每天五分钟机器学习:核函数
本文重点 在学习支持向量机算法之前,我们要继续学习一些数学基础,本文我们将学习核函数的概念。当数据线性不可分的时候,此时就需要核函数出场了,它可以将低维不可分的数据映射到高维可分数据,此时就可以完成数据分类了。 核函数的定义 核函数K(x, y)定义为两个数据点x…...

Word窗体联动Excel实现级联组合框
在Word中的使用用户窗体(UserForm)定制界面如下图所示,其中控件如下(忽略Label控件): CompanyName 组合框Attention 组合框CommandButton1 按钮 现在需要实现级联组合框效果,即用户在 CompanyN…...

RAG实战:构建基于本地大模型的智能问答系统
RAG实战:构建基于本地大模型的智能问答系统 引言 在当今AI快速发展的时代,如何构建一个既智能又可靠的问答系统是一个重要课题。本文将介绍如何使用RAG(检索增强生成)技术,结合本地大模型,构建一个高效的智…...

Docker 部署 plumelog 最新版本 实现日志采集
1.配置plumelog.yml version: 3 services:plumelog:#此镜像是基于plumelog-3.5.3版本image: registry.cn-hangzhou.aliyuncs.com/k8s-xiyan/plumelog:3.5.3container_name: plumelogports:- "8891:8891"environment:plumelog.model: redisplumelog.queue.redis.redi…...
TCP/IP 邮件
TCP/IP邮件是互联网通信中非常重要的应用之一。当我们发送电子邮件时,我们实际上并没有直接使用TCP/IP协议,而是通过电子邮件程序,例如微软的Outlook、莲花软件的Notes或Netscape Communicator等来实现。这些电子邮件程序背后使用了不同的TCP…...
FreeSql
官网 实体特性 Ado 它包括所有对 SQL 操作的封装,提供 ExecuteReader、ExecuteDataSet、ExecuteDataTable、ExecuteNonQuery、ExecuteScalar 等方法,使用起来和传统 SqlHelper 一样。 1、安装包 Install-Package FreeSql Install-Package FreeSql.Prov…...
记一次前端Vue项目国际化解决方案
背景 有一个vue项目,要实现国际化功能,能够切换中英文显示,因为该项目系统的用户包括了国内和国外用户。 需求 1、页面表单上的所有中文标签要国际化,包括表单属性标签、表格列头标签等, title“数量”;…...
JS进阶-手写Promise
一、什么是Promise 在Promise A规范中规定,Promise是一个有一个符合规范的then方法的对象或者函数。 1.关于then then接收onFulfilled和onRejected两个可选参数;then必须返回一个新的Promise对象;如果onFulfilled是一个函数 在状态切换为f…...

PCL点云库入门——PCL库点云滤波算法之直通滤波(PassThrough)和条件滤波(ConditionalRemoval)
0、滤波算法概述 PCL点云库中的滤波算法是处理点云数据不可或缺的一部分,它们能够有效地去除噪声、提取特征或进行数据降维。例如,使用体素网格滤波(VoxelGrid)可以减少点云数据量,同时保留重要的形状特征。此外&#…...
ioctl回顾
一、ioctl协议的命令组成 cmd本质为一个32位的数字,共分为四段: [31-30]:读写方向dir,分为无数据(_IO)、读数据(_IOR)、写数据(_IOW)、读写数据(_IOWR)四种模式; [29-16]:传递数据的大小size,一般利用其宏_IO、_IOR…...

jquery-validate在前端数据校验中的应用以及remote异步调用实践-以若依为例
目录 前言 一、关于Jquery Validate组件 1、validate是什么 2、内置验证方式及触发方式 3、自定义验证规则 二、基本验证实战以及Remote验证 1、基本验证实现 2、remote校验方式 三、总结 前言 随着技术的不断演进,在我们的日常开发过程中,大家一…...

Redisson学习专栏(二):核心功能深入学习(分布式锁,分布式集合,原子操作与计数器,事件与监听)
本文是“Redisson学习专栏”第二篇,聚焦其核心分布式功能实现原理与最佳实践 文章目录 前言:分布式系统核心能力实践一、分布式锁:高并发下的守卫者1.1 可重入锁 (Reentrant Lock)1.2 公平锁 (Fair Lock)1.3 联锁 (MultiLock)1.4 红锁 (RedLo…...

Win10秘笈:两种方式修改网卡物理地址(MAC)
Win10秘笈:两种方式修改网卡物理地址(MAC) 在修改之前,可以先确定一下要修改的网卡MAC地址,查询方法有很多种,比如: 1、在设置→网络和Internet→WLAN/以太网,如下图所示。 2、在控…...

Python实现P-PSO优化算法优化BP神经网络回归模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在当今数据驱动的时代,回归分析作为预测和建模的重要工具,在科学研究和工业应用中占据着重要…...

解决8080端口被占问题
文章目录 1. 提出问题2. 解决问题2.1 查看占用8080端口的进程2.2 杀死占用8080端口的进程2.3 测试问题是否已解决3. 实战小结1. 提出问题 运行Spring Boot项目,报错8080端口被占 2. 解决问题 2.1 查看占用8080端口的进程 执行命令:netstat -ano | findstr :8080 2.2 杀死占用…...
C# 关于闭包与多线程结合使用
开头先看一篇文章:【转】编写高质量代码改善C#程序的157个建议——建议75:警惕线程不会立即启动 - 指间的徘徊 - 博客园d 摘抄: static int _id 0; static void Main() { for (int i 0; i < 10; i, _id) { Thread t new Thread…...

使用Mathematica绘制随机多项式的根
使用ListPlot和NSolve直接绘制: (*返回系数为r和s之间整数的n次随机多项式*) eq[n_, r_, s_] : RandomInteger[{r, s}, {n}] . Array[Power[x, # - 1] &, n] (*返回给定随机多项式的根所对应的笛卡尔坐标*) sol[n_, r_, s_] : {Re[#], Im[#]} & / (x /.…...

SpringBoot+Vue+微信小程序校园自助打印系统
概述 校园自助打印系统是现代化校园建设中不可或缺的一部分,基于SpringBootVue微信小程序开发的免费Java源码项目,包含完整的用户预约、打印店管理等功能模块。 主要内容 系统功能模块 登录验证模块:…...

图论回溯
图论 200.岛屿数量DFS 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外ÿ…...
HarmonyOS DevEco Testing入门教程
一、DevEco Testing体系架构 分层测试框架 单元测试层:支持JS/TS/ArkTS语言的JUnit风格测试 UI测试层:基于XCTest框架扩展的视觉化测试工具 云测平台:集成华为云真机调试实验室 核心测试能力 分布式测试引擎:支持跨设备协同测…...

【android bluetooth 案例分析 04】【Carplay 详解 3】【Carplay 连接之车机主动连手机】
1. 背景 在前面的文章中,我们已经介绍了 carplay 在车机中的角色划分, 并实际分析了 手机主动连接车机的案例。 感兴趣可以 查看如下文章介绍。 【android bluetooth 案例分析 04】【Carplay 详解 1】【CarPlay 在车机侧的蓝牙通信原理与角色划分详解】…...