最近有位朋友在模拟“加码高级工程师”面试时,被问到:“请介绍一下 MyBatis 的工作原理。”他当时有点懵,因为平时用得熟,但真要系统讲清楚,却不知从哪切入。这其实非常典型——用得多,但讲不透;写得快,但原理模糊。
而我在单体架构向高并发演进的过程中,恰恰靠对 MyBatis 的深度理解,避开了好几个“数据一致性粗放”和“异常处理失控”的坑。今天就以第一人称、真实场景、代码+原理结合的方式,和你复盘我是怎么回答这个问题的。
🌪️ 场景还原:面试官突然抛出 MyBatis 原理题
面试官:“你用 MyBatis 有 4、5 年了,能讲讲它是怎么工作的吗?”
我的第一反应不是背概念,而是锚定场景:
“在我负责的高并发订单系统里,所有数据库操作都通过 MyBatis 完成。它作为 ORM 框架,核心价值是解耦 SQL 与业务逻辑,提升数据操作的开发效率和可维护性——尤其是在我们坚持‘单体优先、异步解耦、幂等兜底’的架构策略下,MyBatis 的可控性反而成了优势。”
接着,我分三步展开,让原理“活”起来:
🔧 第一步:启动时——配置加载与工厂构建(“一启二解三封装”)
系统启动时,MyBatis 干了三件事:
- 加载全局配置文件(mybatis-config.xml)
- 解析 Mapper 映射文件(或注解)
- 封装成 Configuration 对象(你提到的“咖啡骨”其实是 Configuration)
这个 Configuration 是单例,包含所有环境、数据源、映射关系等元信息。
然后,通过 SqlSessionFactoryBuilder(建造者模式) 构建 SqlSessionFactory。
为什么用建造者?因为
SqlSessionFactory创建过程复杂(要加载配置、初始化类型处理器、插件链等),建造者模式正好分离构建逻辑与使用逻辑,符合单一职责。
口诀:启配封,建工单
(启动 → 配置加载 → 封装 Configuration → 建造者构建 → 工厂单例)
🔄 第二步:请求时——会话创建与 SQL 执行(“两会两执一桥接”)
当一个 HTTP 请求进来(比如查询订单):
- 从
SqlSessionFactory获取 SqlSession(会话,非线程安全,用完即关) - 通过
SqlSession调用方法,如:selectList("com.example.mapper.OrderMapper.findById", id)→ namespace + statementId 定位 SQL- 或通过 Mapper 接口代理(
getMapper(OrderMapper.class))→ MyBatis 用 JDK 动态代理生成实现类,最终仍调用上述方式
底层执行靠 Executor(执行器):
SimpleExecutor:每执行一次就创建一个 StatementReuseExecutor:可复用 StatementBatchExecutor:批量操作- 还有一层装饰器:CachingExecutor,用于二级缓存
最终,Executor 通过 JDBC 执行 SQL,再用 TypeHandler 做 Java 类型 ↔ JDBC 类型转换,ResultSetHandler 映射结果集。
口诀:会话启,代理桥,执行器跑,JDBC 底座牢
🧠 第三步:深入扩展——缓存 & 插件 & 分层架构
如果面试官眼神亮了,说明可以加码:
- 一级缓存:
SqlSession级,同会话内相同查询不重复查 DB - 二级缓存:
Mapper级,跨会话,但必须谨慎——高并发下容易因缓存不一致引发数据错乱(我们系统就曾因此下线二级缓存,用 Redis + 版本号控制更稳) - 插件机制:基于 责任链 + 动态代理,可拦截
Executor、StatementHandler等,实现分页、SQL 审计、慢查询监控 - 三层架构:
- 接口层:
SqlSession、Mapper 接口 - 核心处理层:配置解析、SQL 解析、执行器、缓存、事务管理
- 基础支持层:反射、类型转换、日志、资源加载
- 接口层:
⚠️ 真实异常场景:别让 MyBatis 成为故障源
有一次线上慢查询,排查发现是二级缓存 + 分页插件冲突,导致缓存 key 未包含分页参数,大量脏数据返回。
我们立刻做了三件事:
- 下线二级缓存,改用业务层 Redis 缓存(带版本号)
- 强化 SQL 审计,通过 MyBatis 插件记录所有慢 SQL
- SqlSession 必须 try-with-resource,避免连接泄漏
这正印证了我们一直强调的:单体不是瓶颈,粗放才是原罪。
✅ 总结口诀(便于记忆 & 面试收尾)
“一启二解三封装,
两会两执一桥接;
缓存插件要慎用,
单体也能扛高并发!”
关注我,从零开始构建可观测、可降级、可修复的高并发系统。
—— 旷野说 · Spring Boot 开发者速查手册 + 高并发系统设计认知指南
定位:用最小改动,做最大韧性。拒绝盲目微服务,专注无状态化 + 数据一致性 + 异常闭环。
261



被折叠的 条评论
为什么被折叠?



