MyBatis 执行链路详解
MyBatis 是如何把 XML 中的
<select>标签变成一行 JDBC 查询的?本文从源码角度追踪完整链路。
一、MyBatis 核心架构
- 1.1 四大核心对象:SqlSession / Executor / StatementHandler / ResultSetHandler
- 1.2 架构分层图——接口层 → 数据处理层 → 基础支撑层
二、SqlSession——与 MyBatis 交互的门面
- 2.1
SqlSessionFactory→SqlSession的创建 - 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 在每个环节可以被插件拦截
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!