首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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程序员日常学习笔记,如理解有误欢迎各位交流讨论!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201214A06I2Q00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券