速发365网址是多少-苹果约彩365app下载-be365

MyBatis 延迟加载使用及原理

MyBatis 延迟加载使用及原理

一、延迟加载是什么?

延迟加载(Lazy Loading)又称“惰性加载”,指的是:

当查询一个对象时,不立即加载它的关联对象(如一对多、多对一关系),而是在第一次真正使用该关联对象时才去执行 SQL 查询加载它。

举个例子:

User user = userMapper.selectById(1);

// 此时只查了 user 表,不查 order 表

user.getOrders(); // 这一步才去执行查询 orders 的 SQL

这样可以避免一次性加载大量无关数据,提高查询性能。

二、如何开启延迟加载?

在 MyBatis 的mybatis-config.xml中配置:

aggressiveLazyLoading:

true(旧版本默认):访问任意属性时会触发所有懒加载属性;

false:只在访问对应属性时才加载(推荐,性能更好)。

然后在映射文件中配置关联关系:

select="selectOrdersByUserId"

column="id"/>

此时,当访问user.getOrders()时,才会触发对Order的查询。

lazyLoadingEnabled配置是全局开关,也可以在单个映射关系上通过属性fetchType="lazy"来开启懒加载:

fetchType="lazy"

select="selectOrdersByUserId"

column="id"/>

三、实现原理(源码层面)

延迟加载的核心为动态代理机制。

查询阶段:创建代理对象

MyBatis 在查询阶段会扫描每个ResultMap的映射字段,判断哪些字段需要懒加载,然后为结果对象创建代理。

在DefaultResultSetHandler.handleResultSets()里,MyBatis 读取 ResultSet 时会调用getRowValue():

这个方法会为每一行创建 Java 对象(例如User),并填充属性。注意其中的createResultObject方法和applyPropertyMappings方法,createResultObject创建了结果对象的动态代理对象:

注意createResultObject方法接收lazyLoader作为参数,此时lazyLoader内部是个空集合。

下一步applyPropertyMappings方法才在lazyLoader中添加用于加载不同属性(可能有多个关联属性)的ResultLoader:

这样返回的user实际上是一个代理对象,它的某些属性还没被真正赋值。

访问阶段:触发加载

当我们在 Java 代码中第一次调用:

user.getOrders();

其方法被代理,代理逻辑封装在EnhancedResultObjectProxyImpl,其intercept方法中,使用ResultLoaderMap lazyLoader加载了 Getter 方法所获取的属性:

ResultLoaderMap#load最终通过ResultLoader#loadResult加载属性值:

ResultLoader#loadResult通过Executor查询到结果:

这样,数据就在真正访问时被加载。

← 上一篇: 黄老邪为什么要关老顽童
下一篇: 从国家支柱产业到明令禁止,中国两千多年的“禁娼”运动有多难? →

相关推荐

Ferryscanner: 最优惠的渡轮票价

Ferryscanner: 最优惠的渡轮票价

2025-07-12 04:25:01 阅读: 2882
干锅的做法与步骤

干锅的做法与步骤

2025-06-27 20:50:26 阅读: 7854
竖弯钩 shùwānɡōuvertical curved hook

竖弯钩 shùwānɡōuvertical curved hook

2025-11-14 07:29:49 阅读: 210
剑网三纯阳PVP

剑网三纯阳PVP

2026-01-30 02:18:59 阅读: 5933
DNF十大最帅气职业盘点 大将军夺冠登顶

DNF十大最帅气职业盘点 大将军夺冠登顶

2025-09-24 10:17:13 阅读: 3922
转速的单位是什么

转速的单位是什么

2025-09-27 07:05:16 阅读: 6256
心到最急的急的意思

心到最急的急的意思

2025-10-11 22:13:13 阅读: 6841
实时高度表app最新版下载 v1.1.0 安卓版

实时高度表app最新版下载 v1.1.0 安卓版

2025-11-03 05:42:55 阅读: 1406