mybatis原理之手写mybatis框架(四)源码与总结

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手写源码

猜你喜欢

转载自blog.csdn.net/weixin_41947378/article/details/104542399
今日推荐