01|架构设计
- 接口层:对外提供操作数据库数据的API,MyBatis提供了两种方式与数据库进行交互:
- 基于Statement ID
- 基于Mapper代理接口
- 核心层:负责具体SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作
基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理等
02|执行流程
- 加载配置并初始化
- 接收调用请求
- 处理操作请求
- 根据SQL的ID查找对应的MappedStatement对象
- 根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数
- 获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果
- 根据MappedStatement对象中的结果映射配置对得到的结果执行进行转换处理,并得到最终的处理结果
- 释放连接资源
- 处理操作请求
Executor:执行器顶层接口,定义了update、query、commit、rollback等方法
- BaseExecutor:是使用模版设计模式对Executor的基础实现类,定义了doUpdate、doQuery等抽象方法交由子类实现
- SimpleExecutor:默认使用的执行器
- ReuseExecutor:可重用的执行器,可重用的对象为Statement,在执行器内部提供一个Map映射,执行SQL作为key,value为Statement
- BatchExecutor:批量提交的执行器
- CachingExecutor:支持结果缓存的SQL执行器,其内部持有Executor对象(可以是具体执行器的任意一个)作为具体执行器
StatementHandler
StatementHandler是mybatis创建Statement的处理器,负责Statement的创建工作。
- BaseExecutor:是使用模版设计模式对Executor的基础实现类,定义了doUpdate、doQuery等抽象方法交由子类实现
SimpleStatementHandler:对应java.sql.Statement对象的处理,处理不带动态参数运行的SQL
- PrepareStatementHandler:对应java.sql.PrepareStatement对象的处理,处理SQL中的占位符动态参数赋值操作
- CallableStatementHandler:处理存储过程的执行
RoutingStatementHandler:依据MappedStatement的StatementType属性选择对应的Handler
public RoutingStatementHandler(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
switch (ms.getStatementType()) {
case STATEMENT:
delegate = new SimpleStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);
break;
case PREPARED:
delegate = new PreparedStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);
break;
case CALLABLE:
delegate = new CallableStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);
break;
default:
throw new ExecutorException("Unknown statement type: " + ms.getStatementType());
}
}
ParameterHandler
mybatis提供的参数处理器,用于PreparedStatement参数解析时使用
ResultSetHandler
负责处理Statement返回的结果,根据定义返回类型进行封装返回