MyBatis启动主流程及SqlSessionFactoryBuilder

mybatis启动主流程

mybatis启动流程即获得SqlSessionFactory对象的流程,SqlSessionFactory是一个接口,其默认实现类是DefaultSqlSessionFactory,由SqlSessionFactoryBuilder的build方法构建。在我们初学MyBatis时一般会写一个方法获得SqlSessionFactory对象,代码如下:

    public class MyBatisUtil {
       private static SqlSessionFactory sqlSessionFactory = null;

       public static SqlSessionFactory getSqlSessionFactory() throws IOException {
          if(sqlSessionFactory == null) {
             // 获得配置文件输入流
             Reader r = Resources.getResourceAsReader("mybatis_conf.xml");
             // 通过MybatisSqlSessionFactoryBuilder构造SqlSessionFactory对象
             sqlSessionFactory = new SqlSessionFactoryBuilder().build(r);
          }
          return sqlSessionFactory;

       }
    }    

可以看到获得SqlSessionFactory对象比较简单,有如下几步:

  1. 获得配置文件的输入流对象,mybatis提供一个实用工具类Resources可以获得配置文件的输入流对象
  2. 创建SqlSessionFactoryBuilder对象
  3. 基于输入流对象,调用SqlSessionFactoryBuilder对象的build方法构建SqlSessionFatory对象

SqlSessionFactoryBuilder对象build方法

SqlSessionFactoryBuilder提供如个重载的build方法用来构造SqlSessionFactory对象

public class SqlSessionFactoryBuilder {
    // inputStream表示要解析的配置文件的输入流
	// environement表示所使用的环境的字符串,在mybatis配置文件中可以配置多个环境,说明使用哪个环境,可以为null
	// properties是外部传入的属性文件对象,这个对象会作为Configuration对象的属性variables的值,可以为null
	public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
    try {
      // 创建XMLConfigBuilder对象,XMLConfigBuilder对象用来解析mybatis对象,  
      XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
      // parser.parse() 解析XML配置文件,并获得Configuration对象
      // 其于配置文件对象,获得SqlSessionFactory对象,默认实现类为DefaultSqlSessionFactory  
      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.
      }
    }
  }
  
  public SqlSessionFactory build(Configuration config) {
    // 返回SqlSessionFactory对象,默认实现类为DefaultSqlSessionFactory  
    return new DefaultSqlSessionFactory(config);
  }  

}    
posted @ 2022-04-10 10:28  beckwu  阅读(132)  评论(0)    收藏  举报