myBatis源码
手写流程已经全部写完了,接下来我们可以带着手写的思路去看下mybatis官方源码:
下面这个mybatis官方源码,加上了中文注释,有需要的可以自行下载,阅读:mybatis中文注释源码
图就不截了,直接简单写下调用链,重要的还是需要自己去探索:
解析流程:
【SqlSessionFactoryBuilder】#build
|–【XMLConfigBuilder】#new
|–【XMLConfigBuilder】#parse
|–parseConfiguration
|—…
|—environmentsElement
|—mapperElement
|–【XMLMapperBuilder】#new
|–【XMLMapperBuilder】#parse
|–configurationElement
|–…
|–buildStatementFromContext 解析select|insert|update|delete标签
|–【XMLStatementBuilder】#new
|–【XMLStatementBuilder】#parseStatementNode
|–【XMLLanguageDriver】#createSqlSource
|–【XMLScriptBuilder】#new
|–【XMLScriptBuilder】#parseScriptNode
|—parseDynamicTags 解析子节点
|—DynamicSqlSource#new 根据是否包含动态节点选择创建
|—RawSqlSource#new 根据是否包含动态节点选择创建
|–【MapperBuilderAssistant】#addMappedStatement:使用助手封装MappedStatement
|-- build 接受Configuration对象
|-- 【DefaultSqlSessionFactory】#new
执行流程:
【SqlSessionFactory】#openSession
|-- openSessionFromDataSource
【Configuration】#getEnvironment
【Configuration】#newExecutor
【TransactionFactory】#newTransaction
【DefaultSqlSession】#new
【SqlSession】#selectList
|-- 【Configuration】#getMappedStatement
|-- 【CachingExecutor】#query
|–【BaseExecuto】#query
|-- queryFromDatabase
|–【SimpleExecutor】#doQuery
|–【Configuration】#newStatementHandler
|–【StatementHandler】#newStatementHandler
|– prepareStatement
|–【BaseStatementHandler】#prepare
|–【PreparedStatementHandler】#instantiateStatement
|–【PreparedStatementHandler】#parameterize
|–【DefaultParameterHandler】#setParameters
|–【PreparedStatementHandler】#query
|–【PreparedStatement】#execute
|–【DefaultResultSetHandler】#handleResultSets
mybatis源码中包含的设计模式:
- NodeHandler 策略模式
- MixedSqlNode 组合模式
- SqlSessionFactoryBuilder 构建者模式
- SqlSessionFactory 工厂方法模式
- BaseExecutor 抽象模板方法模式
- MapperProxyFactory 工厂模式
- MapperProxy 动态代理模式
- …
可以看到我们手写的基本和源码类名都一样,职责也是一样的。
总结
至此想讲的已经全部讲完了,下面是整理的思维导图
思维导图链接: https://pan.baidu.com/s/1rBUfmW-saQJ4JL5hYTcfGQ 提取码: bw5p
Github手写源码:Github手写源码