MyBatis
1.    SqlSessionFactoryBuilder
通过build方法去解析xml配置文件  通过调用XMLConfigBuilder的parse方法将配置文件封装成一个Configuration对象
 MyBatis框架及原理分析

MyBatis框架及原理分析
 
Xml节点解析
 MyBatis框架及原理分析
封装好Configuration对象,回到build方法
 MyBatis框架及原理分析
进入到这个build创建SqlSessionFactory接口的默认实现类
 MyBatis框架及原理分析
下一步OpenSession
 MyBatis框架及原理分析
1.    获取数据源环境Environment
2.    获取事务工厂TransactionFactory
3.    获取JdbcTransaction    newTransaction方法
4.    创建Executor执行器(Sql实际是通过Executor执行,Executor对应的是对Statement的封装)

  1. newExecutor创建  1 批处理执行器  2 可重复执行器 3 简单执行器
  2. 创建3选一个执行器
  3. 检测缓存是否开启,如果开启那么使用缓存执行器
  4. MyBatis框架及原理分析

 
进入简单执行器执行
1.    获取封装的配置Configuration对象
2.    创建StatementHandler对象

  1. 创建路由功能的StatementHandler对象根据MappedStatement中的StatementType创建
  2.  MyBatis框架及原理分析

3.    设置参数
4.    执行设置好参数的sql
 MyBatis框架及原理分析
5.    如果开启了缓存呢?
a)    那么就进入CachingExecutor创建一个缓存执行器,创建后具体是怎么执行的呢?

  1. 先获取到绑定的sql语句
  2. 生成缓存的Key值
  3. MyBatis框架及原理分析

 
b)    Query的执行流程
1.    先获取二级缓存
2.    二级缓存不为空的情况下
3.    刷新二级缓存
4.    从二级缓存中查询数据
5.    如果二级缓存没有查询到数据,则查询数据库
6.    如果没有查到数据那么委托给BaseExecutor数据库处理器
7.    如果有查询到数据,那么直接返回数据
 MyBatis框架及原理分析
c)    再来看看委托给BaseExecutor处理器是怎么做的
1.    先查询一级缓存里是否存在数据、
2.    如果存在那么直接拿,不存在直接从数据库里拉取数据

MyBatis框架及原理分析
 
直接拉取数据

MyBatis框架及原理分析

到这里应该是漏了一个东西,发现没有
 MyBatis框架及原理分析
这个东西,在实际的过程中你的dao是怎么被调用的
这里呢是通过MapperProxy动态代理了dao
 MyBatis框架及原理分析
再进去
 MyBatis框架及原理分析
 MyBatis框架及原理分析
 MyBatis框架及原理分析
上面拿到了MapperProxy,每个MapperProxy对应一个dao接口
下面就看看接下来的流程
MapperProxy在执行的时候会触发这个方法
 MyBatis框架及原理分析
检测CRUD类型,根据类型去选执行哪个SqlSession的中的哪个方法
 MyBatis框架及原理分析
跑了一圈又回到SqlSession再从头看
其实也可以直接理解为四大组件的执行流程
Executor  
 –> StatementHandler 
–> ParameterHandler 
–> ResultSetHandler

1.    Executor执行器根据接口,定义Update(更新或插入),query(查询),commit(提交事务)。rollback(回滚事务)
2.    CachingExecutor 缓存执行器,支持结果缓存的SQL执行器,该类中,会持有Executor的一个委托对象,CachingExecutor关注与缓存特定的逻辑,其最终的SQL执行由其委托对象来实现,委托对象为BaseExecutor的实现类
3.    BaseExecutor  Executor的基础实现类,该类是抽象类,关于查询更新具体的实现是由子类来实现的,以下四个
4.    SimpleExecutor  简单执行器
5.    BatchExecutor 支持批量执行的执行器
6.    ClaseExecutor 表示已经关闭Executor
7.    ReuseExecutor 支持重复使用Statement,以SQL为键,缓存Statement对象

1.StatementHandler 其方法

  1.     Statement prepare(Connection connection)创建Satement对象,该方法会通过Connection创建Statement对象
  2.     void parameterize(Statement statement) 对Statement对象参数化,特别是PreapreStatement对象
  3.     void batch(Statement statement) 批量执行SQL
  4.     int update(Statement statement) 更新操作
  5.     <E> List<E> query(Statement statement,ResultHandler resultHandler) 查询操作
  6.     BoundSql getBoundSql() 获取SQL语句
  7.     ParameterHandler getParameterHandler() 获取对应的参数处理器

2.    BaseStatementHandler 是StatementHandler的抽象实现类,SimpleStatementHandler,PrepareSattementHandler,CallableStatementHandler是其子类
3.    SimpleStatementHandler 具体的StatementHandler实现器,java.sql.Statement对象创建处理器
4.    PrepareStatementHandler  java.sql.PrepareStatement对象的创建处理器
5.    CallableStatementHandler  java.sql.CallableStatement对象创建处理器,可用来执行存储过程调用的Statement
6.    RoutingStatementHandler StatementHandler的适配器,去适配以上三个处理器
ParameterHandler
创建ParameterHandler
 MyBatis框架及原理分析
ResultSetHandler
创建ResultSetHandler
 MyBatis框架及原理分析

over

相关文章:

  • 2021-08-16
  • 2021-08-04
  • 2021-09-16
  • 2021-07-21
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-09-02
相关资源
相似解决方案