SqlSessionFactory
利用mybatis配置文件创建,工厂类,生产SqlSession
SqlSession
用户和数据库打交道的层面接口
Executor
真正执行SQL的组件,接口定义了对数据库的增删改查操作。
BaseExecutor: Executor的抽象实现类,定义了方法处理流程和通用逻辑
SimpleExecutor: 简单的实现类,实现了基本的增删改查
ReuseExecutor: 对JDBC的Statement对象进行了缓存,提升系统性能。
BatchExecutor: 对同一个Mapper的update,insert,delete操作,调用批量操作功能
CachingExecutor: 对以上3种进行装饰,为查询操作增加二级缓存功能(需要打开二级缓存)
MappedStatement
mybatis通过MappedStatement保存mapper文件或注解@select,@update等配置的SQL,
StatementHandler
组件封装了对MappedStatement的操作,有几种不同的实现类,如下图
ParameterHandler
对对象PrepareStatement,CallableStatement设置参数接口,方法如下:
public interface ParameterHandler {
Object getParameterObject();
void setParameters(PreparedStatement ps) throws SQLException;
}
该接口只有一个默认实现类DefaultParameterHandler
TypeHandler
定义了JDBC类型与Java类型的互相转换方法
void setParameter(PreparedStatement ps, int i, T javaType, JdbcType type) throws SQLException;
T getResult(ResultSet rs, String column) throws SQLException;
T getResult(ResultSet rs, int i) throws SQLException;
T getResult(CallableStatement cs, int i) throws SQLException;
mybatis在Configuration中使用TypeHandlerRegisty保存了Class-Java-JDBC类型之间的映射关系
ResultSetHandler
定义了对ResultSet的操作
public interface ResultSetHandler {
<E> List<E> handleResultSets(Statement var1) throws SQLException;
<E> Cursor<E> handleCursorResultSets(Statement var1) throws SQLException;
void handleOutputParameters(CallableStatement var1) throws SQLException;
}
只有唯一一个默认实现类DefaultResultSetHandler
,处理关键逻辑如下
List<Object> multipleResults = new ArrayList();
int resultSetCount = 0;
ResultSetWrapper rsw = this.getFirstResultSet(stmt);// wrapper封装
List<ResultMap> resultMaps = this.mappedStatement.getResultMaps();//获取结果集映射,一般只有一个
int resultMapCount = resultMaps.size();
this.validateResultMapsCount(rsw, resultMapCount);// 校验
while(rsw != null && resultMapCount > resultSetCount) {
ResultMap resultMap = (ResultMap)resultMaps.get(resultSetCount);
this.handleResultSet(rsw, resultMap, multipleResults, (ResultMapping)null);//核心
rsw = this.getNextResultSet(stmt);
this.cleanUpAfterHandlingResultSet();
++resultSetCount;
}
return this.collapseSingleResultList(multipleResults);