讲下 MyBatis 原理?

Java面试常见问题:Mybatis的工作原理 ORM框架是几乎所有Java应用都会用到的技术,大多数ORM框架都是将Java对象与数据表进行关联,Mybatis则是将Java方法和SQL语句进行了映射(Mapping)。这样不仅简化了ORM操作,同时也支持数据表关联查询、视图查询、存储过程调用等比较复杂的操作。本文就来分析一下MyBatis的工作原理,这也是Java面试中经常考察的内容。 Mybatis实现了方法与SQL语句之间的映射 MyBatis的操作主要有两个阶段: 初始化阶段: 完成MyBatis运行环境的准备工作,包括读取XML 阅读详情

最近有位朋友在模拟“加码高级工程师”面试时,被问到:“请介绍一下 MyBatis 的工作原理。”他当时有点懵,因为平时用得熟,但真要系统讲清楚,却不知从哪切入。这其实非常典型——用得多,但讲不透;写得快,但原理模糊。

而我在单体架构向高并发演进的过程中,恰恰靠对 MyBatis 的深度理解,避开了好几个“数据一致性粗放”和“异常处理失控”的坑。今天就以第一人称、真实场景、代码+原理结合的方式,和你复盘我是怎么回答这个问题的。


🌪️ 场景还原:面试官突然抛出 MyBatis 原理题

面试官:“你用 MyBatis 有 4、5 年了,能讲讲它是怎么工作的吗?”

我的第一反应不是背概念,而是锚定场景:

“在我负责的高并发订单系统里,所有数据库操作都通过 MyBatis 完成。它作为 ORM 框架,核心价值是解耦 SQL 与业务逻辑,提升数据操作的开发效率和可维护性——尤其是在我们坚持‘单体优先、异步解耦、幂等兜底’的架构策略下,MyBatis 的可控性反而成了优势。”

接着,我分三步展开,让原理“活”起来:


🔧 第一步:启动时——配置加载与工厂构建(“一启二解三封装”)

系统启动时,MyBatis 干了三件事:

  1. 加载全局配置文件(mybatis-config.xml)
  2. 解析 Mapper 映射文件(或注解)
  3. 封装成 Configuration 对象(你提到的“咖啡骨”其实是 Configuration)

这个 Configuration 是单例,包含所有环境、数据源、映射关系等元信息。

然后,通过 SqlSessionFactoryBuilder(建造者模式) 构建 SqlSessionFactory。

为什么用建造者?因为 SqlSessionFactory 创建过程复杂(要加载配置、初始化类型处理器、插件链等),建造者模式正好分离构建逻辑与使用逻辑,符合单一职责。

口诀:启配封,建工单
(启动 → 配置加载 → 封装 Configuration → 建造者构建 → 工厂单例)


🔄 第二步:请求时——会话创建与 SQL 执行(“两会两执一桥接”)

当一个 HTTP 请求进来(比如查询订单):

  1. 从 SqlSessionFactory 获取 SqlSession(会话,非线程安全,用完即关)
  2. 通过 SqlSession 调用方法,如:
    • selectList("com.example.mapper.OrderMapper.findById", id) → namespace + statementId 定位 SQL
    • 或通过 Mapper 接口代理(getMapper(OrderMapper.class))→ MyBatis 用 JDK 动态代理生成实现类,最终仍调用上述方式

底层执行靠 Executor(执行器):

  • SimpleExecutor:每执行一次就创建一个 Statement
  • ReuseExecutor:可复用 Statement
  • BatchExecutor:批量操作
  • 还有一层装饰器:CachingExecutor,用于二级缓存

最终,Executor 通过 JDBC 执行 SQL,再用 TypeHandler 做 Java 类型 ↔ JDBC 类型转换,ResultSetHandler 映射结果集。

口诀:会话启,代理桥,执行器跑,JDBC 底座牢


🧠 第三步:深入扩展——缓存 & 插件 & 分层架构

如果面试官眼神亮了,说明可以加码:

  • 一级缓存:SqlSession 级,同会话内相同查询不重复查 DB
  • 二级缓存:Mapper 级,跨会话,但必须谨慎——高并发下容易因缓存不一致引发数据错乱(我们系统就曾因此下线二级缓存,用 Redis + 版本号控制更稳)
  • 插件机制:基于 责任链 + 动态代理,可拦截 Executor、StatementHandler 等,实现分页、SQL 审计、慢查询监控
  • 三层架构:
    • 接口层:SqlSession、Mapper 接口
    • 核心处理层:配置解析、SQL 解析、执行器、缓存、事务管理
    • 基础支持层:反射、类型转换、日志、资源加载

⚠️ 真实异常场景:别让 MyBatis 成为故障源

有一次线上慢查询,排查发现是二级缓存 + 分页插件冲突,导致缓存 key 未包含分页参数,大量脏数据返回。
我们立刻做了三件事:

  1. 下线二级缓存,改用业务层 Redis 缓存(带版本号)
  2. 强化 SQL 审计,通过 MyBatis 插件记录所有慢 SQL
  3. SqlSession 必须 try-with-resource,避免连接泄漏

这正印证了我们一直强调的:单体不是瓶颈,粗放才是原罪。


✅ 总结口诀(便于记忆 & 面试收尾)

“一启二解三封装,
两会两执一桥接;
缓存插件要慎用,
单体也能扛高并发!”


关注我,从零开始构建可观测、可降级、可修复的高并发系统。

—— 旷野说 · Spring Boot 开发者速查手册 + 高并发系统设计认知指南
定位:用最小改动,做最大韧性。拒绝盲目微服务,专注无状态化 + 数据一致性 + 异常闭环。

从BeanFactory入手,讲透Spring整合Mybatis的底层原理 在专栏Mybatis源码分析中笔者以学习Mybaits时接触的四行代码为例详细的分析Mybatis的内部工作原理,感兴趣的同学可前往专栏Mybatis源码分析进行查看。入门Mybatis的四行代码//<1> 加载配置文件//<2> 创建sessionFactory对象//<3> 获取sqlSession对象信息//<4> 构建映射器的代理对象// .....调用相关方法信息而本次我们主要探究的工作原理,即探究分析清楚Spring整合Mybatis背后故事。至此,其实我们也就分析清楚了。 阅读详情

相关推荐

第03讲:Mybatis 实现原理

本文主要内容: Mybatis工作流程 Mybatis工作流程可以大致分为四个步骤: 下面我们就来说说这四个步骤: 加载配置并初始化 触发条件:加载配置文件,比如:全局配置文件、XxxMapper.xml配置文件等。 配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。 接收调用请求 触发条件:调用Mybatis提供的API 传入参数:为SQL的ID和传入

田维常 261

MyBatis 详解(原理 + 使用 + 常见面试题)

MyBatis 是一个优秀的持久层框架,用于简化 Java 程序与数据库之间的交互。MyBatis 的主要作用:将 Java 对象与 SQL 语句进行映射,实现数据库操作。Java对象 ←→ SQL语句 ←→ 数据库MyBatis 通过XML 或注解来管理 SQL,使开发者可以更加灵活地控制 SQL。MyBatis 是 Java 后端开发中最常用的持久层框架之一。核心特点:SQL 与代码分离灵活控制 SQL与 Spring 生态兼容在实际项目中,MyBatis 常常与:Spring。

2301_79783364的博客 427

MyBatis第七讲:MyBatis动态SQL优雅实践与原理

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

Jet_qi的博客 786

讲一下Mybatis的底层原理

XML 中的 <if>、<where>等标签被解析为SqlNode对象(如IfSqlNode、WhereSqlNode),组成语法树。深入理解其原理,可避免开发中的常见坑点(如缓存误用、动态 SQL 性能陷阱),并基于插件机制定制企业级功能(如数据脱敏、分库分表)。XMLConfigBuilder解析配置,生成Configuration对象(存储所有配置信息,如数据源、Mapper 映射)。SQL 生成:SqlSource解析动态 SQL 标签(如<if>、<foreach>),结合参数生成最终 SQL。

tschen的博客 1246

第27讲:Mybatis-Spring框架实现原理

大家好,我是田哥 本文是MyBatis源码分析系列文章的第27篇,本文主要内容是MyBatis-Spring框架实现原理 我在使用Mybatis和Spring集成过程中一直有一个疑问,在前面的文章中我提到过,SqlSession和Mapper对象的声明周期是方法级别的,也就是每个请求的SqlSession和Mapper对象是不一样的,是一个非单例的Bean。 但是Mybatis与Spring集成后,为什么我们可以直接注入Mapper对象,如果通过直接注入的话Mapper对象却成了单例的了? 这个问题在技术群

田维常 1036

BurpSuit在不同浏览器中配置代理

文章通过分享各大浏览器如何设置代理的知识,帮助初学者快速掌握代理配置相关技能。

北冥同学的成长记录笔记 1万+

讲一下Mybatis的插件原理

MyBatis 的插件机制是其核心扩展点之一,基于和实现,允许开发者在 SQL 执行的关键节点插入自定义逻辑(如性能监控、SQL 改写、数据加密等)。Executor:执行 SQL(增删改查、事务):处理 SQL 语法(预编译、参数设置):处理 SQL 参数:处理结果集映射插件通过代理对象拦截目标方法,在方法执行前后插入自定义逻辑。所有配置的插件存储在中,按配置顺序形成责任链。每个插件的plugin()方法调用Plugin.wrap()生成代理对象。

tschen的博客 1041

sentaurus学习笔记(HFET_pGate_GaN仿真)(五)

`(sdedr:define-constant-profile`和`(sdedr:define-constant-profile-region`命令用于定义并应用一个恒定的活性硼掺杂浓度剖面`"ndop_GaN_gate_const"`到氮化镓栅极层上,其值为`NpGaN_gate`。- `"Oxide"`指定了这一层的材料名称(在这里代表氧化层),而`"nucleation"`是这一层在仿真中的标识名称。- `"GaN"`指定了这一层的材料名称,而`"GaN_gate"`是这一层在仿真中的标识名称。

qq_52640792的博客 941

面试官:讲一讲Mybatis插件的原理及如何实现?

持续原创输出,点击上方蓝字关注我吧目录前言环境配置什么是插件?如何自定义插件?举个栗子用到哪些注解?如何注入Mybatis?测试插件原理分析如何生成代理对象?如何执行?总结分页插件的原理...

码猿技术专栏 1117

MTK Linux DRM分析(八)- KMS drm_crtc.c

CRTC 在 Linux DRM 子系统中是显示控制的核心,负责时序生成、模式设置和管线的调度。理解其工作原理和 API 对于进行底层图形开发、调试显示问题或 simply understanding how your graphics stack works 都至关重要。

iTom1900 1350

FPGA实现串口的任意字节数接收

基于FPGA的任意字节数(单字节、多字节)的串口(UART)接收,真的不来看看吗?

孤独的单刀 1万+

循环执行 mybatis_面试官:讲一讲Mybatis插件的原理及如何实现?

目录前言环境配置什么是插件?如何自定义插件?举个栗子用到哪些注解?如何注入Mybatis?测试插件原理分析如何生成代理对象?如何执行?总结分页插件的原理分析总结前言Mybatis的分页插件相信大家都使用过,那么可知道其中的实现原理?分页插件就是利用的Mybatis中的插件机制实现的,在Executor的query执行前后进行分页处理。此篇文章就来介绍以下Mybatis的插件机制以及在底层...

weixin_35993997的博客 81

# YOLOv11-seg改进系列 | 引入CVPR MetaFormer的C3k2_PoolingFormerCGLU模块,池化Token混合+CGLU门控MLP

本文引入 CVPR 2022 论文(MetaFormer/PoolFormer)提出的 MetaFormer 元架构设计,以Pooling Token 混合器 + ConvolutionalGLU(CGLU)MLP构成,将其封装为,用于替换 YOLOv11-seg 的 C3k2 块。对比维度C3k2(基线)C3k2_PoolingFormerCGLU(本文)参数量(n scale)2.46M≈2.49M9.6≈9.69.7(+1.0%)架构范式单阶段卷积MetaFormer 双阶段。

qq_44224801的博客 847

面试官:讲一下 Mybatis 初始化原理

优质文章,及时送达作者 |亦山原文 | https://urlify.cn/zaYRJv对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外。本章将通过以下几点详细介绍MyBatis的初始化过程。1. MyBatis的初始化做了什么2. MyBatis基于XML配置文件创建Configuration对象的过程3. 手动加载XML配置文件创建Configuration对象完...

公众号:Java后端 315

Unity-TextMeshPro如何扩展材质实现字体Face+Outline流光效果

前言 TexeMeshPro 是Unity的一个Text文本插件,实现了比UGUI的Text,更好看的效果,跟高效的性能,所以深受大家的喜欢,但是再好的插件,也不是万能的,比如我们的策划有个新需求,要我们的VIP的名字比普通玩家有更好看的效果,例如:字体流光,外发光颜色扰动,字体贴图等等。那我们就需要去扩展TextMeshPRo的shader功能了。如下图所示 本文,我就带大家一起来扩展一下:如何扩展TextMeshProUGUI TextMesh原始面板 扩展功能后的面板 扩展TextMeshPro

TxNet 9690

基于Abaqus的横向各向同性线弹性理想塑性材料模型的umat子程序实现——以Fortran为例,带您揭秘弹性塑性模型编程之道

通过以上步骤,我们已经在Abaqus中使用Fortran实现了横向各向同性线弹性理想塑性材料模型的umat子程序。在实际应用中,我们需要根据具体的材料特性和加载条件来调整模型参数和计算过程。尽管我在这篇文章中尽力提供了详细的教程,但由于我自身的知识限制和经验不足,可能会有误解或错误。我希望大家在学习过程中能多思考,多实践,多交流,以更好地理解和掌握这个主题。

qq_38334677的博客 1690

free mybatis 不生效_面试官:讲一讲Mybatis插件的原理及如何实现?

前言Mybatis的分页插件相信大家都使用过,那么可知道其中的实现原理?分页插件就是利用的Mybatis中的插件机制实现的,在Executor的query执行前后进行分页处理。此篇文章就来介绍以下Mybatis的插件机制以及在底层是如何实现的。环境配置本篇文章讲的一切内容都是基于Mybatis3.5和SpringBoot-2.3.3.RELEASE。什么是插件?插件是Mybatis中的最重要的功能...

weixin_30737899的博客 313

流体动力学仿真软件:SU2_(3).SU2的网格生成技术

设置网格的大小、密度等参数。

kkchenjj的博客 1032

mybatis 拦截器_面试官:讲一讲Mybatis插件的原理及如何实现?

前言Mybatis的分页插件相信大家都使用过,那么可知道其中的实现原理?分页插件就是利用的Mybatis中的插件机制实现的,在Executor的query执行前后进行分页处理。此篇文章就来介绍以下Mybatis的插件机制以及在底层是如何实现的。环境配置本篇文章讲的一切内容都是基于Mybatis3.5和SpringBoot-2.3.3.RELEASE。什么是插件?插件是Mybatis中的最重要的功能...

weixin_39717367的博客 110

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SSM第四讲 Mybatis原理及开发流程(转载)

Mybatis原理及开发流程 Mybatis介绍 原理及开发流程 log4j日志操作 三种操作方式CRUD 总配置文件说明 mapping映射文件说明 一、MyBatis介绍 1.什么是MyBatis MyBatis 本是apache的一个开源项目iBatis, 2010年 迁移到了google code,并且改名为MyBatis 。是一个基于Java的持久层ORM关系映射框架 MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手

forest_tree的博客 211

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【死磕JVM】给同事讲了一遍GC后,mybatis工作原理图

1. 引用计数法 会给对象中添加一个引用计数器,每当有一个地方引用它的时候,计数器的值就 +1 ,当引用失效时,计数器值就 -1 ,计数器的值为 0 的对象不可能在被使用,这个时候就可以判定这个对象是垃圾。 当图中的数值变成0时,这个时候使用引用计数算法就可以判定它是垃圾了,但是引用计数法不能解决一个问题,就是当对象是循环引用的时候,计数器值都不为0,这个时候引用计数器无法通知GC收集器来回收他们,如下图所示: 这个时候就需要使用到我们 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频

澎湖Java架构师的博客 251

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

你真的会用MyBatis吗?:从零讲透注解与XML共存的底层原理

掌握MyBatis的灵活开发之道,深入解析注解与XML混合使用场景及底层原理。涵盖映射优先级、动态SQL处理与配置冲突解决方案,提升项目可维护性与性能。适用复杂业务中灵活切换两种模式,值得收藏。

PixelIsle的博客 854

MyBatis中association如何实现延迟加载?一文讲透底层原理与配置细节

掌握MyBatis association的延迟加载,提升查询性能。本文解析其底层原理与配置方法,涵盖适用场景、代理机制与性能优势,助你精准优化关联查询。配置简单,效果显著,值得收藏。

InitPulse的博客 946
上一篇: 如何用 Redpanda + 本地事务,实现“发消息 + 写 DB” 的强一致性!
下一篇: 为什么 MyBatis 原生二级缓存“难以修复”?
旷野说
博客等级 码龄9年 361粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值