mybatis源码解析-SqlSession构建

146 阅读1分钟

1.SqlSessionFactory 创建

接上文在解析完配置标签后,开始创建核心对象SqlSessionFactory

public SqlSessionFactory build(Configuration config) {
  //创建默认的DefaultSqlSessionFactory 
  return new DefaultSqlSessionFactory(config);
}

public DefaultSqlSessionFactory(Configuration configuration) {
  this.configuration = configuration;
}

new 默认的工厂DefaultSqlSessionFactory,并赋值解析完成的configuration对象

2.SqlSession

SqlSession对应数据操作的一次会话,接下来分析SqlSession的创建

通过DefaultSqlSessionFactory 的openSession()创建

@Override
public SqlSession openSession(TransactionIsolationLevel level) {
  return openSessionFromDataSource(configuration.getDefaultExecutorType(), level, false);
}
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level,
                                             boolean autoCommit) {
  //包装数据库连接。处理连接生命周期,包括:其创建、准备、commitrollback 和 close。
  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();
  }
}
  • Transaction 包含数据的操作 获取连接,提交,回滚,关闭连接

image.png

  • 执行器创建
public Executor newExecutor(Transaction transaction, ExecutorType executorType) {
  executorType = executorType == null ? defaultExecutorType : executorType;
  Executor executor;
  if (ExecutorType.BATCH == executorType) {
    executor = new BatchExecutor(this, transaction);
  } else if (ExecutorType.REUSE == executorType) {
    executor = new ReuseExecutor(this, transaction);
  } else {
    //默认的SIMPLE 执行器
    executor = new SimpleExecutor(this, transaction);
  }
  //二级缓存 开关    <setting name="cacheEnabled" value="true"/> value false 关闭二级缓存

  if (cacheEnabled) {
    executor = new CachingExecutor(executor);
  }
  //将插件逻辑植入执行器中
  return (Executor) interceptorChain.pluginAll(executor);
}
Transaction tx = null;

3.总结

最终创建一个DefaultSqlSession,里面设置Configuration对象,执行器Executor

image.png