千家信息网

Mybatis源码分析[03.SqlSessionFactory]

发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,// 构造SqlSessionpublic interface SqlSessionFactory {//8个方法可以用来创建SqlSession实例SqlSession openSession();
千家信息网最后更新 2025年01月31日Mybatis源码分析[03.SqlSessionFactory]

// 构造SqlSession

public interface SqlSessionFactory {

//8个方法可以用来创建SqlSession实例
SqlSession openSession();

//自动提交
SqlSession openSession(boolean autoCommit);
//连接
SqlSession openSession(Connection connection);
//事务隔离级别
SqlSession openSession(TransactionIsolationLevel level);

//执行器的类型
SqlSession openSession(ExecutorType execType);
SqlSession openSession(ExecutorType execType, boolean autoCommit);
SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);
SqlSession openSession(ExecutorType execType, Connection connection);

Configuration getConfiguration();

}

SqlSessionFactory的实现类是DefaultSqlSessionFactory

public class DefaultSqlSessionFactory implements SqlSessionFactory {  private final Configuration configuration;  public DefaultSqlSessionFactory(Configuration configuration) {    this.configuration = configuration;  }  //最终都会调用2种方法:openSessionFromDataSource,openSessionFromConnection  //以下6个方法都会调用openSessionFromDataSource  @Override  public SqlSession openSession() {    return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);  }  @Override  public SqlSession openSession(boolean autoCommit) {    return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, autoCommit);  }  @Override  public SqlSession openSession(ExecutorType execType) {    return openSessionFromDataSource(execType, null, false);  }  @Override  public SqlSession openSession(TransactionIsolationLevel level) {    return openSessionFromDataSource(configuration.getDefaultExecutorType(), level, false);  }  @Override  public SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level) {    return openSessionFromDataSource(execType, level, false);  }  @Override  public SqlSession openSession(ExecutorType execType, boolean autoCommit) {    return openSessionFromDataSource(execType, null, autoCommit);  }  //以下2个方法都会调用openSessionFromConnection  @Override  public SqlSession openSession(Connection connection) {    return openSessionFromConnection(configuration.getDefaultExecutorType(), connection);  }  @Override  public SqlSession openSession(ExecutorType execType, Connection connection) {    return openSessionFromConnection(execType, connection);  }  @Override  public Configuration getConfiguration() {    return configuration;  }  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);      //然后产生一个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();    }  }  private SqlSession openSessionFromConnection(ExecutorType execType, Connection connection) {    try {      boolean autoCommit;      try {        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);      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();    }  }  private TransactionFactory getTransactionFactoryFromEnvironment(Environment environment) {    //如果没有配置事务工厂,则返回托管事务工厂    if (environment == null || environment.getTransactionFactory() == null) {      return new ManagedTransactionFactory();    }    return environment.getTransactionFactory();  }  private void closeTransaction(Transaction tx) {    if (tx != null) {      try {        tx.close();      } catch (SQLException ignore) {        // Intentionally ignore. Prefer previous error.      }    }  }}
0