导读:SqlSessionFactoryBuilder是利用XML或者Java编码获得资源来构建SqlSessionFactory。通过它可以构建过个SqlSessionFactory。它的作用就是一个构建器,一旦我们构建了SqlSessionFactory,它的作用也就消失了.
SqlSessionFactoryBuilder作用
SqlSessionFactoryBuilder的在Mybatis的整个流程中的作用如下图:
SqlSessionFactoryBuilder的在Mybatis中的作用
SqlSessionFactoryBuilder的源码如下
public class SqlSessionFactoryBuilder {
//SqlSessionFactoryBuilder有9个build()方法
//发现mybatis文档老了,http://www.mybatis.org/core/java-api.html,关于这块对不上
//以下3个方法都是调用下面第4种方法
public SqlSessionFactory build(Reader reader) {
return build(reader, null, null);
}
public SqlSessionFactory build(Reader reader, String environment) {
return build(reader, environment, null);
}
public SqlSessionFactory build(Reader reader, Properties properties) {
return build(reader, null, properties);
}
//第4种方法是最常用的,它使用了一个参照了XML文档或更特定的SqlMapConfig.xml文件的Reader实例。
//可选的参数是environment和properties。Environment决定加载哪种环境(开发环境/生产环境),包括数据源和事务管理器。
//如果使用properties,那么就会加载那些properties(属性配置文件),那些属性可以用${propName}语法形式多次用在配置文件中。和Spring很像,一个思想?
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
try {
//委托XMLConfigBuilder来解析xml文件,并构建
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
return build(parser.parse());
} catch (Exception e) {
//这里是捕获异常,包装成自己的异常并抛出的idiom?,最后还要reset ErrorContext
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
reader.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
//以下3个方法都是调用下面第8种方法
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);
}
//第8种方法和第4种方法差不多,Reader换成了InputStream
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
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方法使用了一个Configuration作为参数,并返回DefaultSqlSessionFactory
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
}
主要有9个build()方法,主要分为三部分.
- 1,2,3,4都是处理Reader类(字符流),1,2,3最终调用的都是第4个方法
- 5,6,7,8是处理inputStream(字节流),5,6,7最终调用的都是第8个方法
- 4,8方法分别通过XMLConfigBuilder类将Reader类(字符流),inputStream(字节流)解析成Configuration类,再将Configuration传给第9个方法 new DefaultSqlSessionFactory(config)返回。从而完成构建SqlSessionFactory的任务。
XMLConfigBuilder类的作用
XMLConfigBuilder类是SqlSessionFactoryBuilder的第4,8个build方法用来验证解析mybatis-config.xml文件的,并将析mybatis-config.xml的信息转换成Configuration类的。在build()方法中,XMLConfigBuilder的作用就体现在如下两行代码中。
//将配置文件的inputStream验证解析Configuration
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
//parser.parse()返回Configuration,并由最后一个方法实例DefaultSqlSessionFactory(config)返回
return build(parser.parse());
XMLConfigBuilder继承了BaseBuilder,它的成员变量中较为重要的有两个。一个是Configuration类,这个是用来存储mybatis的配置信息的;另一个是XPathParser类,是XPath解析器,用的都是JDK的类包,封装了一下,用来解析XML文件。XMLConfigBuilder类图如下。
从上图可以看出parse()方法返回Configuration类,是XMLConfigBuilde核心方法。SqlSessionFactoryBuilder就是通过实例XMLConfigBuilder,并调用这个方法来构造Configuration类的。
总结:SqlSessionFactoryBuilder构造SqlSessionFactory主要委托XMLConfigBuilder类来验证并解析xml配置文件成Configuration
网友评论