构建sqlSessionFactory下一步就是获取sqlSession,代码如下:

SqlSession sqlSession = sqlSessionFactory.openSession();

SqlSessionFactory有两个实现类,SqlSessionManager和DefaultSqlSessionFactory。

由上篇文章可知,在

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

中,new了一个DefaultSqlSessionFactory对象,咱们具体介绍下DefaultSqlSessionFactory的次要办法。

5.1 DefaultSqlSessionFactory

DefaultSqlSessionFactory是一个具体工厂类,次要提供了两种创立 DefaultSqlSession形式。一种形式是通过数据源获取数据库连贯并创立Excutor 对象以及DefaultSqlSession对象,源代码如下:

private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {    Transaction tx = null;    try {      final Environment environment = configuration.getEnvironment();      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);      //依据DataSource对象创立Transaction对象      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();    }  }

另一种形式是依据用户提供的连贯对象获取数据库连贯并创立Excutor 对象以及DefaultSqlSession对象,其中的主动提交形式也是采纳的Connection对象中的。源代码如下:

private SqlSession openSessionFromConnection(ExecutorType execType, Connection connection) {    try {      boolean autoCommit;      try {        //应用Connection对象的主动提交形式        autoCommit = connection.getAutoCommit();      } catch (SQLException e) {        // Failover to true, as most poor drivers        // or databases won't support transactions        autoCommit = true;      }      final Environment environment = configuration.getEnvironment();      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);      //依据Connection对象创立Transaction对象      final Transaction tx = transactionFactory.newTransaction(connection);      final Executor executor = configuration.newExecutor(tx, execType);      return new DefaultSqlSession(configuration, executor, autoCommit);    } catch (Exception e) {      throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);    } finally {      ErrorContext.instance().reset();    }  }

二者的区别只有下面两点,即正文中的语句。
本文的例子调用的是第一个办法,该办法次要分四步:
1.从configuration中获取Environment对象。
2.从Environment对象获取TransactionFactory对象。
3.应用TransactionFactory对象创立Transaction对象。
4.依据Transaction对象创立Executor对象。
5.依据Executor对象创立DefaultSqlSession对象。

5.2 Environment

Environment对象是XMLConfigBuilder对象的parse()办法进行结构的。具体的执行者是XMLConfigBuilder外部的公有办法environmentsElement()。它有以下几个字段:

  private final String id;  private final TransactionFactory transactionFactory;  private final DataSource dataSource;

对应配置文件中的<environment>节点。

 <!-- id:惟一标识 -->        <environment id="test">            <!-- 事务管理器,JDBC类型的事务管理器 -->            <transactionManager type="JDBC" />            <!-- 数据源,池类型的数据源 -->            <dataSource type="POOLED">                <property name="driver" value="com.mysql.jdbc.Driver" />                <property name="url" value="jdbc:mysql://xxx/xxx" />                <property name="username" value="xxx" />                <property name="password" value="xxx" />            </dataSource>        </environment>

通过断点能够看到,字段的值和下面的配置一一对应。

5.3 TransactionFactory与Transaction

TransactionFactory对象是从下面的Environment对象获取的。TransactionFactory是创立Transaction对象的工厂,它有两个实现类。一个是JdbcTransactionFactory用来创立JdbcTransaction,另一个是ManagedTransactionFactory用外创立ManagedTransaction。

Transaction有两个实现类一个是JdbcTransaction,另一个是ManagedTransaction。

本文例子配置文件中<transactionManager type="JDBC" />
所以应用的是JdbcTransaction.
Transaction次要有以下几个接口。

JdbcTransaction次要的字段如下:

  //数据库连贯  protected Connection connection;  //数据源  protected DataSource dataSource;  //数据库隔离级别  protected TransactionIsolationLevel level;  //是否主动提交  protected boolean autoCommit;

ManagedTransaction和JdbcTransaction比拟相似,然而没有实现commit()和rollback()办法。

5.4 Executor

在openSessionFromDataSource办法中创立Transaction对象之后,会依据tx创立一个Executor,语句如下:

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

configuration的newExecutor办法次要作用是依据execType来创立不同类型的Executor对象,并通过代理的办法执行interceptor。代码如下:

public Executor newExecutor(Transaction transaction, ExecutorType executorType) {    //如果没有指定executorType,则应用ExecutorType.SIMPLE,    //defaultExecutorType是一个常量,值也是ExecutorType.SIMPLE    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 { //因为ExecutorType.SIMPLE == executorType,所以走这个分支      executor = new SimpleExecutor(this, transaction);    }    if (cacheEnabled) {//默认是true,能够通过<settings>标签扭转      executor = new CachingExecutor(executor);    }    executor = (Executor) interceptorChain.pluginAll(executor);    return executor;  }

由下面代码看出先new了一个SimpleExecutor,而后被CachingExecutor代理,而后被interceptor代理。假如有三个拦截器,配置程序为interceptor1、interceptor2、interceptor3最初的执行关系是这样的:interceptor3(interceptor2(interceptor1(CachingExecutor(SimpleExecutor()))))

plugin3 beforeplugin2 beforeplugin1 beforecaching ...simpleExecutor ...plugin1 afterplugin2 afterplugin3 after

5.5 DefaultSqlSession

最初一步是依据Executor对象创立DefaultSqlSession对象。
DefaultSqlSession就SqlSession的默认实现类,属于接口层。次要性能是数据库表的增删改查。