mybatis的Demo案例中 ,通过sqlSessionFactory创建Session
1 //通过sqlSessionFactory创建SqlSession 2 public static SqlSession getSession(){ 3 return sqlSessionFactory.openSession(); 4 }
1 @Override 2 public SqlSession openSession(boolean autoCommit) { 3 return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, autoCommit); 4 }
1 private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) { 2 Transaction tx = null; 3 try { 4 //获取environment对象,就是mybatis配置中的environment子节点下的配置内容 5 final Environment environment = configuration.getEnvironment(); 6 //构建事务工厂 7 final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment); 8 //创建事务实例 9 tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit); 10 //创建一个执行器 11 final Executor executor = configuration.newExecutor(tx, execType); 12 //返回默认的sqlSession 13 return new DefaultSqlSession(configuration, executor, autoCommit); 14 } catch (Exception e) { 15 closeTransaction(tx); // may have fetched a connection so lets call close() 16 throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e); 17 } finally { 18 ErrorContext.instance().reset(); 19 } 20 }
configuration.newExecutor(tx, execType);为创建一个执行器,创建执行器的过程为:
1 public Executor newExecutor(Transaction transaction, ExecutorType executorType) { 2 //获取默认的执行器类型,默认为SIMPLE 3 executorType = executorType == null ? defaultExecutorType : executorType; 4 executorType = executorType == null ? ExecutorType.SIMPLE : executorType; 5 Executor executor; 6 //执行器类型为三种BATCH 批量执行已经预编译的sql,REUSE 重复执行sql,SIMPLE只执行一次 7 if (ExecutorType.BATCH == executorType) { 8 executor = new BatchExecutor(this, transaction); 9 } else if (ExecutorType.REUSE == executorType) { 10 executor = new ReuseExecutor(this, transaction); 11 } else { 12 executor = new SimpleExecutor(this, transaction); 13 } 14 //判断是否开启缓存,默认是开启的 15 if (cacheEnabled) { 16 executor = new CachingExecutor(executor); 17 } 18 executor = (Executor) interceptorChain.pluginAll(executor); 19 return executor; 20 }