1.初始化
从今天开始我将对MyBatis的源码进行阅读学习,学习的方式是一边按照官方文档的使用教程的顺序来逐步阅读对应实现源码,并分析相应类结构及设计思想。
使用MyBatis一般有两种方式加载配置信息,一种是使用XML配置文件,另一种是使用Java代码来自定义配置信息。一般情况下我们可能都会使用XML的方式来定义配置信息,这样的好处是配置信息一目了然,也方便调整。首先来看下如何加载配置文件。
在MyBatis中,操作数据的是SqlSession接口。此接口对象由对应的工厂类SqlSessionFactory负责产生,那么如何构建这个工厂类呢,MyBatis官方文档在一开始就给出了相应的初始化方式。
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
首先指定一个配置文件路径,然后使用SqlSessionFactoryBuilder来根据配置信息构建我们要使用的SqlSessionFactory类。那么这里先了解一下这个builder类内部都做了什么。
从类结构图上看,除了一个构造方法外,全都是重载了不同参数的build方法。其参数可以是Reader,InputStream,Configuration对象等。下面挑几个方法看下。
public SqlSessionFactory build(InputStream inputStream) {
return build(inputStream, null, null);
}
public SqlSessionFactory build(InputStream inputStream, String environment) {
return build(inputStream, environment, null);
}
public SqlSessionFactory build(InputStream inputStream, Properties properties) {
return build(inputStream, null, properties);
}
//使用InputStream传入配置文件的几个重载方法都调用此方法,实际可传入文件流,环境信息,以及属性信息
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
//使用XMLConfigBuilder对象将IO流表示的配置文件内容转化成Configuration对象实例,进行最终构建。
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
//所有的build方法最终都调用此处,创建默认的SqlSessionFactory。
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
上面的四个build方法中前三个都调用的是第四个build方法,前三个都只传入了部分参数。而在第四个build方法中,使用了XMLConfigBuilder类来加载XML配置文件信息
XMLConfigBuilder拥有多个构造方法,可以传入不同方式的初始化信息,最终调用parse()方法将信息转换成Configuration类的实例。
最后,SqlSessionFactoryBuilder对象使用转换后的Configuration对象来创建一个默认的SqlSessionFactory,因此,我们如果不另外处理的话,默认使用的工厂类就是DefaultSqlSessionFactory。
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
初始化工厂类之后,就可以进行数据操作了。