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

MyBatis 执行流程与延迟加载原理

MyBatis 面试里最核心的问题有两个:一是 SQL 到底怎么执行,二是关联对象为什么能延迟加载。它们其实在同一条链路上:MyBatis 先把配置和 SQL 映射解析成对象,执行查询时再完成参数映射、SQL 执行和结果封装。

MyBatis 执行流程总览

读取 mybatis-config
配置

解析 Mapper
映射文件

构建
SqlSessionFactory

创建
SqlSession

获取 Mapper
代理对象

调用 Mapper 方法

找到
MappedStatement

Executor
执行 SQL

参数映射
SQL 执行
结果映射

返回 Java 对象

一次查询大致会经过这些组件:

组件作用
mybatis-config.xmlMyBatis 全局配置文件
Mapper 映射文件保存 SQL、入参映射、结果映射等信息
SqlSessionFactory会话工厂,全局通常一个,用来创建SqlSession
SqlSession项目和数据库的一次会话,提供执行 SQL 的方法
Executor执行器,真正调度数据库操作,也负责缓存维护
MappedStatement封装一条 SQL 的映射信息

一条 SQL 是怎么执行的

可以按 6 步理解:

  1. 读取 MyBatis 全局配置和 Mapper 映射文件。
  2. 构建SqlSessionFactory
  3. 通过SqlSessionFactory创建SqlSession
  4. 通过SqlSession获取 Mapper 接口的代理对象。
  5. 调用 Mapper 方法,底层交给Executor执行。
  6. Executor根据MappedStatement完成参数映射、SQL 执行和结果映射。

典型代码如下:

SqlSessionsqlSession=sqlSessionFactory.openSession();UserMapperuserMapper=sqlSession.getMapper(UserMapper.class);Useruser=userMapper.selectById(1);sqlSession.close();

这里看起来是在调用接口方法,实际调用的是 MyBatis 创建的 Mapper 代理对象。代理对象会根据接口方法找到对应的MappedStatement,再交给执行器处理。

MappedStatement 封装了什么

Mapper XML 里的 SQL:

<selectid="selectById"parameterType="int"resultType="User">select id, name, age from user where id = #{id}</select>

最终会被解析成MappedStatement。它记录了:

  • SQL 语句。
  • 参数类型。
  • 返回值类型。
  • 结果映射规则。
  • 缓存配置。
  • statement 类型。

所以执行器执行 SQL 时,不是只拿一段字符串,而是拿到一份完整的 SQL 执行元数据。

什么是延迟加载

延迟加载就是:需要用到关联数据时再查询,不需要时就不查。

比如用户表和订单表是一对多关系。

查询用户时有两种策略:

加载方式行为
立即加载查询用户时,顺便把订单列表也查出来
延迟加载先只查用户,调用user.getOrderList()时再查订单

如果很多场景只需要用户基本信息,不需要订单列表,延迟加载可以减少不必要的 SQL。

MyBatis 支持一对一关联对象、一对多关联集合的延迟加载,但默认不开启,需要配置:

<settings><settingname="lazyLoadingEnabled"value="true"/></settings>

延迟加载底层原理

查询用户
基本信息

创建 User
代理对象

orderList
暂不查询

业务代码调用
getOrderList

进入代理拦截器

关联数据
是否已加载

执行查询
订单 SQL

结果设置到
orderList

直接返回
已有结果

返回订单列表

延迟加载的核心是代理对象。可以按下面流程理解:

  1. MyBatis 查询用户基本信息。
  2. 对用户对象创建代理对象。
  3. 订单列表属性一开始没有真正加载。
  4. 当调用user.getOrderList()时,进入代理对象的拦截逻辑。
  5. 拦截器发现订单列表还没加载,于是执行对应 SQL。
  6. 查询订单列表后,调用 setter 把结果设置回对象。
  7. 再继续返回getOrderList()的结果。

也就是说,延迟加载并不是字段自己会变出来,而是代理对象拦截了 getter 方法,在第一次访问关联属性时补了一次 SQL 查询。

延迟加载的优缺点

角度说明
优点不需要关联数据时少查 SQL,减少一次请求的初始成本
缺点访问关联属性时会额外发 SQL,容易出现 N+1 查询
适合关联数据不总是需要、且访问频率可控的场景
不适合列表页批量访问关联属性,容易一条主查询带出大量子查询

项目里不能一看到延迟加载就觉得高级。列表接口如果循环访问每个用户的订单列表,可能从 1 条 SQL 变成 1 + N 条 SQL。

面试回答模板

可以这样回答:

MyBatis 启动时会读取全局配置文件和 Mapper 映射文件,构建SqlSessionFactory。执行 SQL 时,通过SqlSessionFactory创建SqlSession,再通过SqlSession获取 Mapper 接口代理对象。调用 Mapper 方法时,代理对象会找到对应的MappedStatement,里面封装了 SQL、参数映射、结果映射等信息,然后交给Executor执行器完成参数处理、SQL 执行、结果封装以及缓存维护。

延迟加载可以这样补充:

MyBatis 支持延迟加载,默认关闭。它的底层原理是为目标对象创建代理对象,当调用关联属性的 getter 方法时进入拦截器,如果发现关联数据还没有加载,就执行对应 SQL 查询,再把结果设置到对象属性中。

小结

MyBatis 的主线是:

配置文件 -> SqlSessionFactory -> SqlSession -> Mapper 代理 -> MappedStatement -> Executor -> 数据库 -> 结果映射。

延迟加载是在结果对象这一层做代理增强,真正访问关联属性时再补查 SQL。理解这条链路,MyBatis 的执行流程和延迟加载就能一起讲清楚。

http://www.jsqmd.com/news/855338/

相关文章:

  • 3岁孩子能不能喝花姐八珍粉?怎么控制用量?
  • SAP-ABAP:数据类型与数据对象(8篇) 第八篇:误区避坑篇——数据类型与对象操作的常见误区解析
  • 别再一个个置位了!博图PLC编程效率翻倍:SET_BF指令结合ARRAY的进阶玩法
  • FreeRTOS信号量实战:从同步互斥原理到嵌入式并发编程避坑指南
  • EtherCAT SDO通信慢?深入解析IgH主站的非实时读写机制与优化思路
  • 内存进化史:从SDRAM的‘单车道’到DDR的‘双车道’,聊聊那些被砍掉的功能(如全页突发)
  • 避坑指南:在UE里用蓝图做传送门,Actor旋转、碰撞检测这些细节千万别踩坑
  • eclipse数值模拟器并行计算
  • 保姆级教程:在Ubuntu 20.04上从零复现M3DM多模态异常检测(含DINO+Point_MAE权重)
  • 除了ModHeader,还有哪些HTTP头修改插件?离线安装全攻略与横向评测
  • 解析日本工程塑料厂家代理新日铁住金产品的核心价值与选型指南
  • 从RTL到GDS:STA工程师的一天,如何用DC工具修复时序违例(以Setup Violation为例)
  • 告别Vivado HLS!Vitis HLS 2021.1保姆级教程:从C++代码到FPGA IP核的完整流程
  • 全栈算力矩阵,全域智能赋能——视程空间六大产品系列,构建边缘智能完整生态
  • 聊天技巧资源合集
  • 初创团队如何利用Taotoken的Token Plan套餐有效控制AI开发成本
  • 【概念篇】传统 RPA 已死?一文看懂基于 Agentic Workflow 的下一代智能自动化
  • 手把手教你用STM32F103C8T6驱动DS18B20,附完整代码和LCD1602显示教程
  • 在i.MX6UL嵌入式Linux上部署ncnn:轻量级AI推理实践与优化
  • 2026年5月热门的上海代办德国子公司注册口碑推荐厂家推荐榜,全流程代办、法务税务合规、签证支持型厂家选择指南 - 海棠依旧大
  • 深度测评2026年日本工程塑料厂家最佳代理服务排行榜,解锁高精尖材料新选择
  • 手把手教你用PlatformIO给ESP32添加蓝牙HID功能(从库缺失到成功编译的全过程)
  • 合同系统业务功能
  • 从原始数据到实际物理量:手把手教你处理MPU6050的加速度和角速度数据
  • 用STM32F407的ADC+DMA,做个PS2摇杆的“读心术”,实时读取X/Y轴电压变化
  • 别再被C++的拷贝构造坑了!用移动语义和std::move让你的程序快起来(附实战避坑指南)
  • 深入ARM Cortex-M内核:除了性能参数,这些设计细节才是嵌入式稳定的关键
  • 2026年5月广西工程咨询公司哪家强?商业计划书编制机构推荐榜,可行性研究报告、项目建议书、资金申请报告厂家选择指南 - 海棠依旧大
  • TG电报登录收不到短信验证码?关于 SMS fee 我是这样搞定的!
  • 2026年绵阳育儿嫂机构评测:5家服务商核心实力对比 - 优质品牌商家