INDEX · MyBatis

MyBatis 源码分析索引

阅读方法:每篇一个 Java 代码块:真实 MyBatis 3.5.x 源码 + 行内注释,聚焦一条机制。 按顺序读:先看接口调用怎么变成 SQL,再看 SQL 交给谁执行、缓存挂在哪。

核心机制

篇目一句话
01-Mapper 动态代理接口无实现类,JDK 动态代理运行期生成代理,MapperProxy 把调用翻译成 SQL
02-SqlSession 与缓存SqlSession 是门面,Executor 真执行;一级缓存(session 内)、二级缓存(namespace 跨 session)
03-配置解析与ConfigurationXMLConfigBuilder 逐节点解析,Configuration 是全局注册中心
04-Executor 执行链selectList 到 JDBC PreparedStatement 全链路;SIMPLE/REUSE/BATCH 三种 Executor

与其他笔记的关系

  • Mapper 代理和 AOP 动态代理 是同一套 JDK 动态代理,区别:AOP 代理有实现的类做增强,MyBatis 代理纯接口翻译成 SQL
  • MyBatis 由 Spring 管理时,Mapper 被注册成 bean、SqlSession 交给 Spring 事务管控,见 @Transactional 原理 的连接绑 ThreadLocal
  • 底层仍是 JDBC,连接来自连接池

一次查询的完整链路

代码块PLAINTEXT · 9 行收起展开
userMapper.selectById(1)
  → MapperProxy.invoke           // 动态代理拦截
  → MapperMethod.execute         // 按 namespace.方法名 定位 SQL
  → SqlSession.selectOne
  → CachingExecutor.query        // 探二级缓存(若开)
  → BaseExecutor.query           // 探一级缓存
  → SimpleExecutor.doQuery       // 未命中,真查
  → StatementHandler             // JDBC:建 Statement、设参、执行
  → ResultSetHandler             // ResultSet 映射成 Java 对象