介绍
该部分代码位于 org.apache.ibatis.session 包。覆盖了由读取配置之后,到创建一个 SqlSession 的过程。
简化流程
SqlSessionManager 根据 Reader、InputStream 用 SqlSessionFactoryBuilder 创建 SqlSessionFactory 对象
XMLConfigBuilder 从 Reader 或 InputStream 读取 xml 配置,解析之后,创建 Configuration 对象
SqlSessionFactoryBuilder 读取配置 Configuration 创建 SqlSessionFactory,
SqlSessionFactory 根据不同的参数(autoCommit,ExecutorType,TransactionIsolationLevel,Connection)创建不同类型的 SqlSession,DefaultSqlSessionFactory 是 SqlSessionFactory 的默认实现,DefaultSqlSession 是 SqlSession 的默认实现。其中包括
- 创建用 TransactionFactory 创建 Transaction
- 创建执行器 BatchExecutor,ReuseExecutor、SimpleExecutor 或 CachingExecutor
- 创建 SqlSession
SqlSession 执行相应的 sql 语句,Executor 执行具体的 sql 语句,其中:
- executor.query 为 select 操作
- executor.update 为 update 操作
- executor.update 为 delete 操作
- executor.commit 为 commit 操作
- executor.rollback 为 rollback 操作
- executor.flushStatements 为 flush 操作
更具体的流程
根据 Reader、InputStream 用 SqlSessionFactoryBuilder 创建 SqlSessionFactory 对象
public static SqlSessionManager newInstance(Reader reader) {
return new SqlSessionManager(new SqlSessionFactoryBuilder().build(reader, null, null));
}
public static SqlSessionManager newInstance(InputStream inputStream) {
return new SqlSessionManager(new SqlSessionFactoryBuilder().build(inputStream, null, null));
}
以 InputStream 或 Reader 的形式读配置文件
Inputstream inputStream= Resources.getResourceAsStream("mybatis-config.xml");
将 InputStream 或 Reader 解析为 Configuration 对象
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
根据 Configuration 创建 SqlSessionFactory 对象 DefaultSqlSessionFactory
SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
根据 SqlSessionFactory 创建 SqlSession 对象 DefaultSqlSession
final Environment environment = configuration.getEnvironment();
final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
final Executor executor = configuration.newExecutor(tx, execType);
new DefaultSqlSession(configuration, executor, autoCommit);
SqlSessionManager
用 SqlSessionFactoryBuilder 创建 SqlSessionFactory,之后创建 SqlSession
SqlSessionFactoryBuilder
通过 Reader,InputStream,Configuration 创建 SqlSessionFactory
SqlSessionFactory
接口类,默认实现 DefaultSqlSessionFactory,创建 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();
注:ExecutorType 包括 SIMPLE,REUSE,BATCH
SqlSessionFactory 是 MyBatis的关键对象,它是单个数据库映射关系经过编译后的内存镜像。
SqlSessionFactory 对象的实例可以通过 SqlSessionFactoryBuilder 对象来获得,而SqlSessionFactoryBuildr 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出SqlSessionFactory 的实例。
每一个 MyBatis 的应用程序都以一个 SqlSessionFactory 对象的实例为核心。SqlSessionFactory 是线程安全的,它一旦被创建,应该在应用执行期间都存在。在应用运行期间不要重复创建多次,建议使用单例模式。
DefaultSqlSessionFactory
- 从 Configuration 中读取 Environment
- 创建 TransactionFactory,并创建新的事务 Transaction
- 根据 事务和执行类型,创建一个执行器 Executor
- 根据配置,执行器,是否自动提交,创建一个 SqlSession
SqlSession
接口类,默认实现 DefaultSqlSession ,对 sql 语句的封装,select,insert,delete,update,commit,rollback 等。
每个线程一个,避免将跨线程共享使用完必须在 finally 中 close
通过 Executor 来说执行相应的 sql 语句(query,upate,commit,rollback)
总结
session 部分比较简单,就是 Manger -> FactoryBuilder -> Factory -> Session 的套路。
具体的 sql 执行依赖执行器 Executor,下一个主题 Executor。