zoukankan      html  css  js  c++  java
  • mybatis源码分析(1)——SqlSessionFactory实例的产生过程

      在使用mybatis框架时,第一步就需要产生SqlSessionFactory类的实例(相当于是产生连接池),通过调用SqlSessionFactoryBuilder类的实例的build方法来完成。下面具体对这一过程涉及的源码进行分析。

         首先用Eclipse工具查看SqlSessionFactoryBuilder类的Outline视图:

     

    从上图中可以看出,SqlSessionFactoryBuilder类负责构建SqlSessionFactory,并且提供了多个build的重载方法。但其实很多都是在调同一签名的方法,例如:

     public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) ,只是由于方法参数environment和 propertiese都可以为null,

    所以为了提供调用的便利性,才提供了下面的三个方法:

      

    public SqlSessionFactory build(InputStream inputStream)
    public SqlSessionFactory build(InputStream inputStream, String environment) 
    public SqlSessionFactory build(InputStream inputStream, Properties properties)

    按照上述思路去除重复的,真正的重载方法只有如下三种:

    public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) 
    public SqlSessionFactory build(Reader reader, String environment, Properties properties)
    public SqlSessionFactory build(Configuration config)

    可以看出,配置信息可以以三种形式提供给SqlSessionFactorybuild方法,分别是InputStream(字节流)、Reader(字符流)、Configuration(类),由于字节流与字符流都属于读取配置文件的方式,所以从配置信息的来源就很容易想到构建一个SqlSessionFactory有两种方式,大致代码如下:

     

    (1) 读取xml文件构造方式

     

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

     

    (2) 编程构造方式

    DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
    TransactionFactory transactionFactory = new JdbcTransactionFactory();
    Environment environment = new Environment("development", transactionFactory, dataSource);
    Configuration configuration = new Configuration(environment);
    configuration.addMapper(BlogMapper.class);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration) ;

     

     

    下面先来分析XML文件构造方式的build方法的源码:

     

    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.
          }
        }
      }

     

    通过上面这几行代码,就能看出基于XML文件的这种构造方式,通过从XML中读取信息的工作之后,也是构造出Configuration对象之后再继续进行SqlSessionFactory的构建工作的,只是多了些XML的解析工作,所以我们只需单刀直入,直按分析编程构造方式的代码就可以了,或者是直接分析 build(parser.parse())这句代码(参数产生过程先跳过)

    编程构造方式的build方法源码如下(基于xml的构造方式的build(parser.parse())最终也是调了这个代码): 

      

      public SqlSessionFactory build(Configuration config) {
                    return new DefaultSqlSessionFactory(config);
        }

     

    其实这么看来SqlSessionFactory在mybatis的默认实现类为org.apache.ibatis.session.defaults.DefaultSqlSessionFactory , 其构造过程主要是注入了Configuration的实例对象,Configuration的实例对象即可通过解析xml配置文件产生,也可能通过代码直接构造。以上代码使用了一个设计模式:建设者模式(Builder)SqlSessionFactoryBuilder扮演具体的建造者,Configuration类则负责建造的细节工作,SqlSession则是建造出来的产品。

    以下是类图和建造者模式的基本形态图,读者自行对照阅读。

        

    构造者模式是一种对象的创建模式。它可以将一个复杂对象的内部构成特征与对象的构建过程完全分开。

     

     

  • 相关阅读:
    iOS语音合成
    5个可以帮你优化App的优秀网站
    全面谈谈Aspects和JSPatch兼容问题
    做一个 App 前需要考虑的几件事
    Swift 3必看:新的访问控制fileprivate和open
    iOS异常捕获
    LXNetwork – 基于AF3.0封装的iOS网络请求库
    POST方式提交表单时,后台接受实体如果继承了父类,将无法映射表单对应数据
    Angularjs promise对象解析
    H5基于iScroll实现下拉刷新,上拉加载更多
  • 原文地址:https://www.cnblogs.com/hzhuxin/p/3349836.html
Copyright © 2011-2022 走看看