跳到正文
八一菜刀
返回

mybatis 源码系列(一) 初始化

通过阅读mybatis的官方文档,我们知道了初始化mybatis的方法有以下两种方法:

类图

我们先来看mybatis的初始化相关的几个基础类图

几个关键类说明:

基于Xml

基于Xml文件来创建SqlSessionFactory对象的方式,通过阅读源码我们知道以下两种

SqlSessionFactoryBuilder.java:

public class SqlSessionFactoryBuilder {

  /***
   * 根据reader对象来构建
   * @param reader
   * @return
   */
  public SqlSessionFactory build(Reader reader) {
    return build(reader, null, null);
  }
    
  /****
   * 指定参数构建
   * @param reader
   * @param environment
   * @param properties
   * @return
   */
  public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
    try {
      XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
      return build(parser.parse());
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    } finally {
      ErrorContext.instance().reset();
      try {
        reader.close();
      } catch (IOException e) {
        // Intentionally ignore. Prefer previous error.
      }
    }
  }
    
  //other constucts

    /***
   * 根据input流来构建
   * @param inputStream
   * @return
   */
  public SqlSessionFactory build(InputStream inputStream) {
    return build(inputStream, null, null);
  }
    /***
   * 指定参数构建
   * @param inputStream
   * @param environment
   * @param properties
   * @return
   */
  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.
      }
    }
  }
}

除了根据ReaderInputStream,还可以指定相关的environmentproperties属性

此时,初始化的代码:

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

非XML

非XML的方式是开发者在外部首先初始化创建好相应的Configuration对象实例,然后调用SqlSessionFactoryBuilderbuild(Configuration confg)方法来进行创建

/***
   * 最终通过Configuration对象构建SqlSessionFactory的方法,前面的各种构造函数都是通过读取流Xml对象,最终转换为Configuration对象
   * 调用build(config)来构建SqlSessionFactory
   * @param config
   * @return
   */
public SqlSessionFactory build(Configuration config) {
    return new DefaultSqlSessionFactory(config);
}

最终初始化代码应该是这样:

Configuration configuration = new Configuration(environment);
//other init operate...
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

Configuration

通过以上两种初始化的方式,我们大致了解到,mybatis的配置核心类Configuration,该类是mybatis的配置核心.不管是创建SqlSession或者SqlSessionFactory,都需要基于Configuration来操作.


分享文章:

上一篇
mybatis 源码系列(二) 配置类Configuration
下一篇
mybatis 源码系列