博客
关于我
2021-04-11 MyBatis运行流程-02
阅读量:169 次
发布时间:2019-02-28

本文共 3048 字,大约阅读时间需要 10 分钟。

文章目录

获取SqlSession对象

具体操作

  1. openSession()
  2. openSessionFromDataSource()
  3. 获取一些信息,创建事物管理器tx
  4. newExecutor()
  5. 根据Executor在全局配置中的类型,创建出SimpleExecutor/ReuseExecutor/BatchExecutor
  6. 如果有二级缓存配置开启,创建CachingExecutor(executor)
  7. 使用每一个拦截器重新包装executor并返回
  8. 创建DefaultSqlSession,包含ConfigurationExecutor
  9. 返回DefaultSqlSession

源码分析

1. openSession()

SqlSession openSession = sqlSessionFactory.openSession();

2. openSessionFromDataSource()

configuration中拿到默认的Executor类型。Executor类型的类型有三种:SIMPLE/REUSE/BATCH

@Override  public SqlSession openSession() {       return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);  }

3. 获取一些信息,创建事物管理器tx

private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {       Transaction tx = null;    try {       //从全局配置中获取环境等信息      final Environment environment = configuration.getEnvironment();      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);      //创建事务      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);      final Executor executor = configuration.newExecutor(tx, execType);      return new DefaultSqlSession(configuration, executor, autoCommit);    } catch (Exception e) {         closeTransaction(tx); // may have fetched a connection so lets call close()      throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);    } finally {         ErrorContext.instance().reset();    }  }

4. newExecutor()

传入的参数为事务管理器和Executor的类型,根据传入的类型来创建ExecutorExecutor是一个接口,是用来增删改查的。

final Executor executor = configuration.newExecutor(tx, execType);

5. 根据Executor在全局配置中的类型,创建出SimpleExecutor/ReuseExecutor/BatchExecutor

public Executor newExecutor(Transaction transaction, ExecutorType executorType) {       executorType = executorType == null ? defaultExecutorType : executorType;    executorType = executorType == null ? ExecutorType.SIMPLE : executorType;    Executor executor;    if (ExecutorType.BATCH == executorType) {         executor = new BatchExecutor(this, transaction);    } else if (ExecutorType.REUSE == executorType) {         executor = new ReuseExecutor(this, transaction);    } else {         executor = new SimpleExecutor(this, transaction);    }    //看全局配置中是否配置了二级缓存,如果有用CachingExecutor包装    if (cacheEnabled) {         executor = new CachingExecutor(executor);    }    //使用拦截器包装executor    executor = (Executor) interceptorChain.pluginAll(executor);    return executor;  }

6. 如果有二级缓存配置开启,创建CachingExecutor(executor)

对二级缓存的具体操作:

public CachingExecutor(Executor delegate) {       this.delegate = delegate;    delegate.setExecutorWrapper(this);  }

7. 使用每一个拦截器重新包装executor并返回

pluginAll具体实现:拿到所有的拦截器,调用每一个拦截器的plugin方法。

public Object pluginAll(Object target) {       for (Interceptor interceptor : interceptors) {         target = interceptor.plugin(target);    }    return target;  }

8.创建DefaultSqlSession,包含ConfigurationExecutor

在这里插入图片描述

9.返回DefaultSqlSession

总结:

DefaultSqlSessionsqlSession的实现类,里面包含了ExecutorConfigurationExecutor在这一步会被创建。

转载地址:http://mpwc.baihongyu.com/

你可能感兴趣的文章
mysql -存储过程
查看>>
mysql /*! 50100 ... */ 条件编译
查看>>
mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
查看>>
mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
查看>>
mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
查看>>
mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
查看>>
MySQL 8.0 恢复孤立文件每表ibd文件
查看>>
MySQL 8.0开始Group by不再排序
查看>>
mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
查看>>
multi swiper bug solution
查看>>
MySQL Binlog 日志监听与 Spring 集成实战
查看>>
MySQL binlog三种模式
查看>>
multi-angle cosine and sines
查看>>
Mysql Can't connect to MySQL server
查看>>
mysql case when 乱码_Mysql CASE WHEN 用法
查看>>
Multicast1
查看>>
mysql client library_MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法...
查看>>
MySQL Cluster 7.0.36 发布
查看>>
Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
查看>>
MySQL Cluster与MGR集群实战
查看>>