MyBatis 是如何把 XML 中的 <select> 标签变成一行 JDBC 查询的?本文从源码角度追踪完整链路。

一、MyBatis 核心架构

  • 1.1 四大核心对象:SqlSession / Executor / StatementHandler / ResultSetHandler
  • 1.2 架构分层图——接口层 → 数据处理层 → 基础支撑层

二、SqlSession——与 MyBatis 交互的门面

  • 2.1 SqlSessionFactorySqlSession 的创建
  • 2.2 DefaultSqlSession ——selectOne / selectList / insert / update / delete
  • 2.3 openSession() 执行器类型——SIMPLE / REUSE / BATCH

三、Executor——SQL 执行的调度中心

  • 3.1 BaseExecutor——一级缓存、延迟加载
  • 3.2 SimpleExecutor——每次开启新的 Statement
  • 3.3 ReuseExecutor——复用 Statement
  • 3.4 BatchExecutor——批量操作
  • 3.5 CachingExecutor——二级缓存的装饰器

四、StatementHandler——与 JDBC 交互

  • 4.1 RoutingStatementHandler——根据 StatementType 路由
  • 4.2 prepare()——创建 Statement 并设置参数
  • 4.3 parameterize()——ParameterHandler 参数设置
  • 4.4 query() / update()——执行 SQL

五、ResultSetHandler——结果映射

  • 5.1 handleResultSets()——处理 ResultSet
  • 5.2 handleRowValues()——行数据映射
  • 5.3 createResultObject()——根据映射规则创建对象
  • 5.4 嵌套结果映射——association / collection

六、插件机制

  • 6.1 四大对象的拦截链
  • 6.2 @Intercepts / @Signature 注解
  • 6.3 动态代理的责任链模式

七、一条 SQL 的完整链路图

  • 7.1 SqlSession → Executor → StatementHandler → ParameterHandler → JDBC → ResultSetHandler → 返回对象
  • 7.2 在每个环节可以被插件拦截