文章内容和参考博文来源:
1 mybatis源码jar包–package org.apache.ibatis.datasource.unpooled;
2 http://blog.csdn.net/luanlouis/article/details/37671851
3 http://blog.csdn.net/reliveit/article/details/47325189
前言
本文更多的是在尝试去说明mybatis整体初始化的流程和mybatis数据源初始化的流程是怎么样一回事,通过使用一个测试类,来跟踪整个数据源的创建过程,而不是针对某个类具体做了那些事情去做分析,在平常的项目中,基本不会涉及到本片文章的内容,因为一般都是通过spring+mybatis+第三方数据源连接池(C3P0或DBCP或BoneCP等)来做数据源这部分.而不是使用本文描述的用unpooled类型的数据源去开发项目,不过对整个过程有所了解还是挺好的.
UNPOOLED这个数据源的实现只是每次被请求时打开和关闭连接.它对没有性能要求的简单应用程序是一个很好的选择.不同的数据库在这方面表现也是不一样的.unpooled的配置项比较少.只有下面几项:
driver: JDBC驱动的Java类的完全限定名(并不是JDBC驱动中可能包含的数据源类)
url: 数据库的JDBC URL 地址
username: 登陆数据库的用户名
password: 登陆数据库的密码
defaultTransactionIsolationLevel: 默认的连接事务隔离级别
JNDI数据源可以参照另外一篇文章:http://blog.csdn.net/u013412772/article/details/73753399
pooled数据源自行百度.
一、回顾mybatis初始化基本流程
mybatis初始化基本过程:
SqlSessionFactoryBuilder根据传入的数据流生成Configuration对象,然后根据Configuration对象创建默认的SqlSessionFactory实例.
1 调用SqlSessionFactoryBuilder对象的build(inputStream)方法.
2 SqlSessionFactoryBuilder会根据输入流inputStream等信息创建XMLConfiguration对象
3 SqlSessionFactoryBuilder调用XMLConfigBuilder对象的parse()方法.
4 XMLConfigBuilder对象解析XML配置文件返回Configuration对象.
5 SqlSessionFactoryBuilder根据Configuration对象创建一个DefaultSessionFactory对象.
6 SqlSessionFactoryBuilder返回DefaultSessionFactory对象给客户端,供客户端使用.
由此可见,SqlSessionFactory是根据mybatis的配置文件mybatis-config.xml创建的.其中关于SqlSessionFactory和SqlSession的介绍可以参照(http://blog.csdn.net/u013412772/article/details/73648537).
SqlSessionFactoryBuilder源码:
二、数据源的创建过程
mybatis的创建过程发生在mybatis的初始化过程中,在mybatis的配置文件中,使用
<dataSource>
标签元素来配置数据源.
1 MyBatis在初始化时,解析此文件,根据的type属性来创建相应类型的的数据源DataSource,即:
type=”POOLED” :MyBatis会创建PooledDataSource实例
type=”UNPOOLED”:MyBatis会创建UnpooledDataSource实例
type=”JNDI”:MyBatis会从JNDI服务上查找DataSource实例,然后返回使用
2 顺便说一下,MyBatis是通过工厂模式来创建数据源DataSource对象的,MyBatis定义了抽象的工厂接口:org.apache.ibatis.datasource.DataSourceFactory,通过其getDataSource()方法返回数据源DataSource:
//DataSourceFactory源码如下:
package org.apache.ibatis.datasource;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.ibatis.parsing.XNode;
/**
* @author Clinton Begin
*/
public interface DataSourceFactory {
/**
* 数据源工厂接口中定义了两个方法,一个是设置属性的方法,与事务模型中的设置属性方法类似,也是需要在构建Configuration配置类时由XMLConfigBuilder来进行调用的,
* 调用的目的是为了将配置文件中配置的数据源属性信息填充到DataSource中(然后在填充到Environment中,在填充到Configuration中,这是后话)。
*/
/**
* 函数功能描述:读取形参当中的配置信息,并从中获取得到相关的信息用来初始化下文和从上下文中获取得到数据源等其他信息
* @param props 配置文件信息被放在了Properties当中
*/
void setProperties(Properties props);//此方法会在XMLConfigBuilder类中的private DataSourceFactory dataSourceElement(XNode context) throws Exception{}中被调用
/**
* 函数功能描述:获取dataSource数据源对象
* @return
*/
DataSource getDataSource();
}
上述三种不同类型的type,则有对应的以下dataSource工厂:
POOLED PooledDataSourceFactory
UNPOOLED UnpooledDataSourceFactory
JNDI JndiDataSourceFactory
3 MyBatis创建了DataSource实例后,会将其放到Configuration对象内的Environment对象中, 供以后使用。