mybatis执行流程思维导图
2021-07-02 10:21:55 19 举报
AI智能生成
这个是Mybatis整个执行流程的思维导图,包括了插件的植入,一级缓存、二级缓存等众多知识点
作者其他创作
大纲/内容
建造SqlSessionFactory
加载配置文件
初始化Configuration
为类型注册别名
配置文件解析<br>
解析configuration里所有子标签<br>
解析插件
解析数据源
解析mapper文件
保存到MapperRegistry,里面存的是Mapper接口和MapperProxyFactory的关联关系
保存MappedStatement
获取SqlSession
获取Configuration中的默认ExecutorType->SIMPLE(配置文件优先)
利用Configuration中的事务工厂创建事务
根据拿到的执行器类型和事务创建执行器Executor
(Executor) interceptorChain.pluginAll(executor)四大对象之一的Executor代理对象在此生成<br>
三个Executor的区别?看doUpdate()
SimpleExecutor:Statement用完就关闭<br>
ReuseExecutor:statementMap缓存sql和Statement的关系,重用Statement,Statement用完没关闭<br>
BatchExecutor:缓存currentSql和currentStatement,如果新来的sql和缓存的一样且statement一样就重用,批量提交,Statement也没关闭<br>
根据Mybatis的配置Configuration和执行器Executor等构建DefaultSqlSession
创建Mapper的代理对象
根据Mapper接口从MapperRegistry中拿到对应的MapperProxyFactory(Mapper代理工厂)
MapperProxyFactory创建Mapper接口的代理对象,代理对象本质是MapperProxy<br>
使用的是JDK动态代理
调用Mapper方法
本质就是调用代理对象的方法,入口是MapperProxy的invoke方法
组装MapperMethod<br>
SqlCommand<br>
MappedStatement的id<br>
例如:com.xxx.mapper.UserMapper.selectUserById<br>
SqlCommandType(SQL语句类型UNKNOWN, INSERT, UPDATE, DELETE, SELECT, FLUSH)<br>
MethodSignature方法签名<br>
主要存返回值的类型
普通方法调用PlainMethodInvoker.invoke(proxy, method, args, sqlSession)<br>
调用MapperMethod的execute方法<br>
SQL执行的真正起点<br>
INSERT/UPDATE/DELETE/FLUSH这些返回值比较简单,不做分析
SELECT<br>
selectMap
......
继续单独分析下DefaultSqlSession.selectList<br>
cacheEnabled=true(默认为true,也可xml配置,配置文件优先)
CachingExecutor.query<br>
获取SQL
创建CacheKey<br>
缓存key 6要素<br>
statement id<br>
rowBounds.offset<br>
rowBounds.limit<br>
sql语句
value<br>
environment id 也就是数据源id<br>
缓存比较主要是比较hash值
selectOne/selectForMany/selectList<br>
其实都是是调用的selectList
获取缓存<br>
命中
Mapper.xml配置flushCache="true"(select默认false)则清空一、二级缓存<br>
获取缓存中的值<br>
不为空<br>
直接返回结果
为空
调用BaseExecutor.query
将结果缓存至二级缓存中
未命中
调用BaseExecutor.query<br>
cacheEnabled=false
BaseExecutor.query
如果flushCache="true",即使是select也清空一级缓存
查询一级缓存
一级缓存存在,list=缓存
一级缓存不存在<br>
调用doQuery查询数据库
默认SimpleExecutor<br>
创建StatementHandler
StatementType<br>
SimpleStatementHandler
statement<br>
PreparedStatementHandler(默认)<br>
preparedStatement
创建ParameterHandler,可植入插件,interceptorChain.pluginAll()返回ParameterHandler的代理对象<br>
创建DefaultResultSetHandler,可植入插件,interceptorChain.pluginAll()返回ResultSetHandler的代理对象<br>
CallableStatementHandler
存储过程
可植入插件,interceptorChain.pluginAll(),返回StatementHandler的代理对象<br>
创建PreparedStatement,ParameterHandler.parameterize设置参数,并执行SQL<br>
ResultSetHandler处理返回结果
关闭PreparedStatement<br>
ReuseExecutor<br>
BatchExecutor<br>
将数据库查询结果存入一级缓存
如果本地缓存scope是STATEMENT(可通过xml配置),清空一级缓存(也是直接让一级缓存失效的原理)<br>
收藏
0 条评论
下一页