美文网首页
SqlSessionFactoryBuilder构建SqlSes

SqlSessionFactoryBuilder构建SqlSes

作者: d3f59bfc7013 | 来源:发表于2018-04-08 11:20 被阅读0次

导读: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类图如下。

XMLConfigBuilder UML类图
从上图可以看出parse()方法返回Configuration类,是XMLConfigBuilde核心方法。SqlSessionFactoryBuilder就是通过实例XMLConfigBuilder,并调用这个方法来构造Configuration类的。

总结:SqlSessionFactoryBuilder构造SqlSessionFactory主要委托XMLConfigBuilder类来验证并解析xml配置文件成Configuration

相关文章

网友评论

      本文标题:SqlSessionFactoryBuilder构建SqlSes

      本文链接:https://www.haomeiwen.com/subject/alephftx.html