Mybatis执行流程-源码时序图
2021-03-22 23:24:24 18 举报
Mybatis执行流程源码时序图
作者其他创作
大纲/内容
ms.getCache()获取初始化解析xml时得到的Cache对象
映射
其他
执行流程: 1.加载配置并初始化 2.接收调用请求 3.处理操作请求 4.返回处理结果
mapperElement()
解析XML成Configuration对象
openSessionFromDataSource()
生成Cache对象并添加到Configuration中
获取标签内各种属性(其中flushCache、useCache),创建MappedStatement对象
BaseExecutor选择器器的实现类
new DefaultSqlSessionFactory(config)
XMLConfigBuilder.parse()
若一级缓存无,则查数据库反之直接返回
Resources
BaseExecutor: BatchExecutor:批量执行,批量操作 ReuseExecutor:可重用执行器,不会每一次调用都去创建一个 Statement 对象 , 而是会重复利用以前创建好 的 SimpleExecutor:普通执行器,普通就在于每一次执行都会创建 一个新的 Statement 对象CachingExecutor:支持二级缓存,如果开启了缓存就是这个
解析sqlMapConfig.xml上面各个XML标签,如: <environments />:数据库环境配置、事务配置等; <mappers />:映射xml路径相关; <settings /> <plugins /> <properties /> <typeAliases /> ......
二级缓存有则直接返回
SqlSessionFactoryBuilder.build()
byWHº
mapperParser.parse()
二级缓存没有则正常查询
StatementHandler.query()
Configuration
处理返回结果
根据execType选择Executor执行器
InputStream
doQuery()
configurationElement()
解析节点
sqlElement()(解析<sql />)
getResourceAsStream(读取配置文件sqlMapConfig.xml成字节输入流)
queryFromDatabase()
DefaultSqlSession.selectList()
当为select语句时: flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。 useCache默认为true,表示会将本条语句的结果进行二级缓存。当为insert、update、delete语句时: flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。 useCache属性在该情况下没有。
buildStatementFromContext()(解析crud标签)
事务
是否需要刷新缓存
resultMapElements()(解析<resultMap />)
CachingExecutor.query()
ResultMapResolver对象
XMLConfigBuilder.parseConfiguration(Node)
autoCommit=true开启事务
typeHandlerElement()
resultSetHandler.handleResultSets(statement)
executor.query()
Object
加载映射路径,解析mapper.xml
Transaction
cacheElement()(二级缓存)
flushCacheIfRequired(ms)
put in sqlFragments
SqlSession
解析XML
statement.execute(sql)
解析配置文件
BaseExecutor.query()
......
SqlSessionFactory
初始化解析xml时分析过每一个MappedStatement都有一个Cache对象
⼀个Mapper中有⼀个Cache,相同Mapper中的MappedStatement共⽤⼀个Cache
收藏
收藏
0 条评论
下一页