Mybatis深入之DataSource实例化过程
简介
主要介绍Mybatis启动过程中DataSource实例化的过程、为后面解析一个完整SQL执行过程做个前章。
Mybatis中DataSource体系
MybatisDataSource整体简介
Mybatis中关于数据库的类都在org.apache.ibatis.datasource
包中
Mybatis配置文件中关于数据库的配置:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
- 重点关注
<dataSource type="POOLED">
的type属性、其有三种取值:
- POOLED:使用Mybatis自带的数据库连接池来管理数据库连接
- UNPOOLED:不使用任何数据库连接池来管理数据库连接
- JNDI:jndi形式使用数据库连接、主要用于项目正常使用的时候
类与类之间的关系:
每一条线都是一种关系、简单解释一下
1. PooledDataSource实现java.sql.DataSource接口
2. PooledDataSource内部持有一个DataSource引用
3. UnpooledDataSource实现java.sql.DataSource接口
4. PooledDataSource内部持有一个UnpooledDataSource引用
5.PooledDataSourceFactory无参构造方法体中将其父类UnpooledDataSourceFactory持有的引用DataSource实例化为PooledDataSource
6. PooledDataSourceFactory继承UnpooledDataSourceFactory
7. UnpooledDataSourceFactory无参构造方法将其持有的引用DataSource实例化为UnpooledDataSource
8. UnpooledDataSourceFactory持有一个DataSource引用、用于返回实例化好的DataSource。
Mybatis中DataSource实例化整体过程
这里以使用Mybatis自带的数据库连接池为例。也就是type为 “POOLED”类型的数据连接。
- 根据配置文件中type的类型实例化具体的DataSourceFactory。这里是POOLED所以实例化的是PooledDataSourceFactory。
- 通过PooledDataSourceFactory来获取DataSource具体实例:PooledDataSource
对于第一步更详细点的过程:
- 在Mybatis初始化Configuration对象时、Configuration中属性TypeAliasRegistry同样被实例化、并且在Configuration的无参构造方法中对TypeAliasRegistry注册了许多常用的类(以键值对的形式保存在TypeAliasRegistry的属性
private final Map<String, Class<?>> TYPE_ALIASES = new HashMap<String, Class<?>>();
中、也包括TypeAliasRegistry无参构造方法注册的基本java类型。 - 通过配置文件中type指定的”POOLED”在TypeAliasRegistry中查找其对应的类:PooledDataSourceFactory
- 调用其newInstance()实例化
- PooledDataSourceFactory继承自UnpooledDataSourceFactory、所以UnpooledDataSourceFactory先被实例化、
- UnpooledDataSourceFactory无参构造方法中实例化了其DataSource引用为UnpooledDataSource。
- 接着实例化PooledDataSourceFactory、其无参构造方法