博客
关于我
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五补充部分:SQL逻辑查询语句执行顺序
查看>>
mysql交互式连接&非交互式连接
查看>>
MySQL什么情况下会导致索引失效
查看>>
Mysql什么时候建索引
查看>>
MySql从入门到精通
查看>>
MYSQL从入门到精通(一)
查看>>
MYSQL从入门到精通(二)
查看>>
mysql以下日期函数正确的_mysql 日期函数
查看>>
mysql以服务方式运行
查看>>
mysql优化--索引原理
查看>>
MySQL优化之BTree索引使用规则
查看>>
MySQL优化之推荐使用规范
查看>>
Webpack Critical CSS 提取与内联教程
查看>>
mysql优化概述(范式.索引.定位慢查询)
查看>>
MySQL优化的一些需要注意的地方
查看>>
mysql优化相关
查看>>
MySql优化系列-优化版造数据(存储过程+函数+修改存储引擎)-2
查看>>
MySql优化系列-进阶版造数据(load data statment)-3
查看>>
MySql优化系列-造数据(存储过程+函数)-1
查看>>
MySQL优化配置详解
查看>>