Mybatis的解析和运行原理中构建SqlSession过程

在上一章节讲述了Mybatis的解析和运行原理中构建SqlSessionFactory过程​​​​​​​,本章节就主要讲述构建SqlSession的过程

(二)、构建SqlSession过程

SqlSession sqlSession = sessionFactory.openSession();

sessionFactory.openSession()主要调用默认实现类DefaultSqlSessionFactory的openSession()方法,返回SqlSession的默认实现类DefaultSqlSession

@Override
public SqlSession openSession() {
    return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
}
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
    Transaction tx = null;
    try {
        // 获取Configration全局配置中的environment的配置
        final Environment environment = configuration.getEnvironment();
        // 通过environment配置构建transactionFactory对象
        final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
        // 从工厂中获取一个事务实例
        tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
        // 构建执行器
        final Executor executor = configuration.newExecutor(tx, execType);
        // 返回SqlSession的默认实现类DefaultSqlSession
        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();
    }
}

其中不了解Configuration类的可以查看上一章节构建SqlSessionFactory过程进行了解:Configuration封装了全局配置信息

SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit)中传入的参数解析:

1、ExecutorType :执行器类型,它是一个枚举类型

public enum ExecutorType {
  SIMPLE, REUSE, BATCH
}

知道了执行器类型,那我们就来了解一下执行器Executor:

它是SqlSession中真正来执行java与数据库交互的对象,提供了查询(query)、更新(update)等方法,主要有三种类型:

1、SIMPLE:简易执行器,如果不配置类型,就是默认执行器

2、REUSE:能过执行重用预处理语句的执行器

扫描二维码关注公众号,回复: 6544562 查看本文章

3、BATCH:执行器重用语句和批量更新,批量专用的执行

通过代码解析Mybatis中如创建执行器Executor:

Executor executor = configuration.newExecutor(tx, execType);
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 {    
        // 如果没有配置,默认就为SimpleExecutor
        executor = new SimpleExecutor(this, transaction);
    }
    if (cacheEnabled) {
        executor = new CachingExecutor(executor);
    }
    executor = (Executor) interceptorChain.pluginAll(executor);
    return executor;
}

其中要注意这一条代码:

executor = (Executor) interceptorChain.pluginAll(executor);

注意:这个就是Mybatis中的插件,它将构建一层层的代理对象,我们可以在执行真正的Executor的方法前,执行配置插件的方法,这就是插件的原理

2、TransactionIsolationLevel :事务隔离级别类,它是一个枚举类型

public enum TransactionIsolationLevel {
  NONE(Connection.TRANSACTION_NONE),
  READ_COMMITTED(Connection.TRANSACTION_READ_COMMITTED),
  READ_UNCOMMITTED(Connection.TRANSACTION_READ_UNCOMMITTED),
  REPEATABLE_READ(Connection.TRANSACTION_REPEATABLE_READ),
  SERIALIZABLE(Connection.TRANSACTION_SERIALIZABLE);

  private final int level;

  private TransactionIsolationLevel(int level) {
    this.level = level;
  }

  public int getLevel() {
    return level;
  }
}

默认五种隔离级别:

  1. NONE(Connection.TRANSACTION_NONE):无隔离级别
  2. READ_COMMITTED(Connection.TRANSACTION_READ_COMMITTED):读取提交内容
  3. READ_UNCOMMITTED(Connection.TRANSACTION_READ_UNCOMMITTED):读取未提交内容
  4. REPEATABLE_READ(Connection.TRANSACTION_REPEATABLE_READ):可重复读
  5. SERIALIZABLE(Connection.TRANSACTION_SERIALIZABLE):可串行化

3、 boolean autoCommit:是否自动提交事物

恩,这个就不详细说了。。。。。

猜你喜欢

转载自blog.csdn.net/qq_37776015/article/details/90250294