MyBatis 源码拆解:一条 SQL 从 Java 代码到数据库经历了什么
引言 团队里新来的同学提了个问题:"MyBatis 里面写的接口都没实现类,方法怎么就能执行 SQL 了?"我让他用 IDEA 在 sqlSession.selectOne() 打个断点,F5 步入跟一层——十分钟后他回来,表情像打开了新世界:"原来插件能拦我 SQL、二级缓存影响我查询、还有一层参数和结果映射,全在这条调用链里。" 这个问题背后的能力,是面试和排障的分水岭: 面试问"MyBatis 插件原理",答不上 Plugin.invoke 和责任链,说明只停留在 API 层; 线上查"为什么这条 SQL 打了 SQL 日志却没走缓存"、"为什么驼峰映射突然失效",不懂 ResultSetHandler 和 TypeHandler 的分工就只能瞎猜; 写分页插件、慢 SQL 监控插件(比如 PageHelper),本质上都是在给这条调用链"加料"。 这篇文章以 sqlSession.selectOne("orderMapper.getOrder", 10086L) 为起点,沿着SqlSession → Executor(CachingExecutor 装饰)→ Stateme....