一、四大组件
1、Executor(执行器)
Executor:*接口
CacheingExector:处理二级缓存
BaseExector:处理一级缓存(抽象类,具体实现由子类实现)
SimpleExector:执行简单的JDBC代码(日常用的都是这个)
BatchExcetor:批处理执行JDBC代码
ReuseExcetor:可重用statement执行JDBC代码
2、StatementHandler
StatementHandler:*接口
RoutingStatementHandler:路由,确定由哪个StatementHandler实现
BaseStatementHandler:抽象类,具体实现由子类实现
SimpleStatementHandler:简单StatementHandler,注入了RoutingStatementHandler属性,实现路由分配
PrepareStatementHandler:预处理statementHandler(日常都是用的这个)
CallableStatementHandler:存储过程statementHandler
3、ParameterHandler
ParameterHandler 译为参数处理器,负责为 PreparedStatement 的 sql 语句参数动态赋值
4、ResultSetHandler
ResultSetHandler接口就是将ResultSet结果集映射为Bean、List、Map等Java中的对象或者集合。
二、执行流程
SqlSession#selectList
|—CachingExecutor#query:从二级缓存中获取查询结果
|—MappedStatement#getBoundSql:获取执行的sql语句
|—CachingExecutor#createCacheKey:生成sql语句的缓存
|—CachingExecutor#query:从二级缓存中查找,对应的数据如果有则返回,没有则向一级缓存查找
|—BaseExecutor#query:从一级缓存中查找,若有则返回,没有则查询数据库
|—BaseExecutor#queryFromDatabase:将当前的sql语句缓存到一级缓存中
|—SimpleExecutor#doQuery:真正的查询数据库的方法
|—Configuration#newStatementHandler:获取StatementHandler对象,即StatementHandler的创建入口
|—SimpleExecutor#prepareStatement:给StatementHandler对象设置参数
|—RoutingStatementHandler#query:路由StatementHandler,确认到底真正干活的是PreparedStatementHandler
|—PreparedStatementHandler#构造方法
|—Configuration#newParameterHandler:初始化ParameterHandler,即ParameterHandler的创建入口
|—Configuration#newResultSetHandler:初始化ResultSetHandler,即ResultSetHandler的创建入口
|—PreparedStatementHandler#query:执行jdbc操作,即真正的和数据库底层操作
|—DefaultResultSetHandler#handleResultSets:处理查询出来的结果集