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