Mybatis的SqlSession创建过程详解
前面mybatis的初始化过程分析完成,接下来是第二步SqlSession的创建。
创建过程总览
SqlSession创建过程如下图:
创建过程还是比较简单的,首先是之前分析的SqlSessionFactory,在mybatis中提供了两个SqlSessionFactory实现:SqlSessionManager和DefaultSqlSessionFactory,通过前面的分析知道默认返回的是DefaultSqlSessionFactory,至于SqlSessionManager后面再说吧。
DefaultSqlSessionFactory为创建SqlSession对象重载了多个方法,除了默认的无参方法,还可以指定自动提交、事务隔离级别以及指定的执行器类型。执行器类型是一个枚举对应mybatis提供的三种执行器类型:SIMPLE, REUSE, BATCH。
这里从无参方法入手,可以看到最终传递了三个默认参数:默认的执行器类型(在configuration中默认是SIMPLE),默认隔离级别,非自动提交。接下来就是具体创建SqlSession的过程了,主要做了三件事情:
1、根据configuration获取environment,然后获取事务工厂,也就是在mybatis-config中配置的事务工厂;
2、通过事务工厂根配置文件中的据数据源、事务隔离等级、是否自动提交创建事务对象;
3、根据事务对象和执行器类型创建执行器对象;
4、创建DefaultSqlSession对象,把configuration和执行器对象设置给这个对象;
这个过程创建了三个对象:事务、执行器、DefaultSqlSession。
事务创建过程
事务创建源码过程如下图:
事务创建首先是事务工厂,因为在配置文件中配置的是JDBC,在configuration中JDBC类型别名对应的是JdbcTransactionFactory类,所以这里直接看的是JdbcTransactionFactory类,它创建Transaction的方法是 newTransaction,直接调用的是JdbcTransaction的构造函数,只是把数据源、事务隔离级别、是否自动提交设置到对象中没有多余的操作。
JdbcTransaction是Transaction的一个实现。它已经实现了Transaction的getConnection、commit、rollback、close、getTimeout方法。
数据源是从configuration中获取的,在mybatis中数据源DataSource有两种实现:PooledDataSource、UnpooledDataSource,由配置文件的dataSource节点的type值来确定。一般在生产中,我们会使用DBCP或druid等连接池。
执行器创建
执行器初始化源码如下图:
执行器Executor对象是通过Configuration对象创建的,newExecutor方法会先判断创建的Executor类型,然后根据类型创建对应的对象,创建成功后如果开启了缓存还会把新建的Executor对象作为参数创建CachingExecutor对象。
CachingExecutor持有其他Executor对象,具体操作由其他对象执行,他只做缓存那块的功能,CachingExecutor更像是其他Executor的代理。
Configuration和transaction都被保存在了BaseExecutor中,然后SimpleExecutor实现了操作数据库的方法,这些方法后面再说。
在最后还看到了interceptorChain的身影,执行interceptorChain的pluginAll方法实际上就是遍历配置的所有Interceptor对对执行器进行包装。
总结
DefaultSqlSession的构造函数没有什么说的,这里就不展开了。通过这几个类的分析现在清楚了几个对象的结构,首先是SqlSession中有全局配置configuration和执行器executor,执行器executor中有全局配置configuration和事务Transaction,而事务Transaction中有从configuration中得到的DataSource,而DataSource中包含有数据库的连接信息。
接下来就是SqlSession执行sql语句了,后面继续。
Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!