前言
已知在MyBatis的使用中,使用MyBatis时会先读取配置文件mybatis-config.xml为字符流或者字节流,然后通过SqlSessionFactoryBuilder基于配置文件的字符流或字节流来构建SqlSessionFactory,然后再通过SqlSessionFactory的openSession() 方法获取SqlSession,示例代码如下所示。
public static void main(String[] args) throws Exception {
String resource = "mybatis-config.xml";
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream(resource));
SqlSession sqlSession = sqlSessionFactory.openSession();
}
复制代码
上述示例代码中的SqlSessionFactory实际为DefaultSqlSessionFactory,本篇文章将对DefaultSqlSessionFactory获取SqlSession的流程进行学习。
正文
DefaultSqlSessionFactory的openSession() 方法如下所示。
public SqlSession openSession() {
return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
}
复制代码
继续看openSessionFromDataSource() 方法的实现,如下所示。
private SqlSession openSessionFromDataSource(ExecutorType execType,
TransactionIsolationLevel level,
boolean autoCommit) {
Transaction tx = null;
try {
// Environment中包含有事务工厂和数据源
final Environment environment = configuration.getEnvironment();
// 获取事务工厂
// 如果配置了JDBC事务,则获取JDBC事务工厂,否则获取MANAGED事务工厂
final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
// 创建事务
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);