给自己的每日一句
不从恶人的计谋,不站罪人的道路,不坐亵慢人的座位,惟喜爱耶和华的律法,昼夜思想,这人便为有福!他要像一棵树栽在溪水旁,按时候结果子,叶子也不枯干。凡他所做的尽都顺利
前言
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession();
作为一个开发界的菜鸟,当我研究Mybatis的源码的时候,总是好奇,上边这三行代码单当中走过的时候,发生了什么样的事情呢?我们这篇文章只研究openSession这个方法。
sqlSessionFactory.openSession()
public interface SqlSessionFactory { 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是SqlSession的工厂,各种各样的重载的openSession方法。
实现类有两个,默认走的都是第一个DefaultSqlSessionFactory
@Override public SqlSession openSession() { return openSessionFromDataSource( //默认的是SimpleExcutor, configuration.getDefaultExecutorType(), null, false); }
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) { Transaction tx = null; try { //final可以修饰局部变量 //获取Mybatis-config.xml中的Environment标签对应的对象 final Environment environment = configuration.getEnvironment(); //通过environment获取事务工厂 final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment); //通过事务工厂和数据源获取事务对象 tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit); //configuration.newExecutor(事务对象,Executor类型对象) 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(); } }
通过Environment 获取TransactionFactory 对象
通过TransactionFactory和Environment中的DateSource获取Transaction
通过Transaction 和 ExcutorType获取 Executor 对象
通过Executor configuration autoCommit获取SqlSession对象、
我们可以得出以下结论
1:openSession()默认创建的是DefaultSqlSession对象,而且三个入参是:ExcutorType、TransatinIsolationLevel、AutoCommit
2:默认的Exuecutor是SimpleExecutor
3:Excutor对象是由Configuration创建的,默认void:SimpleExcutor,param:Transaction、ExecutorType