zoukankan      html  css  js  c++  java
  • 2017.12.27 sqlSessionFactory和sqlSession(to be continued)

    参考来自:《深入浅出MyBatis技术原理与实践-第6章 》

    1.SqlSessionFactory

    SqlSessionFactory是一个接口,最重要的功能是提供SqlSession。

     1 public interface SqlSessionFactory {
     2 
     3   SqlSession openSession();
     4 
     5   SqlSession openSession(boolean autoCommit);
     6   SqlSession openSession(Connection connection);
     7   SqlSession openSession(TransactionIsolationLevel level);
     8 
     9   SqlSession openSession(ExecutorType execType);
    10   SqlSession openSession(ExecutorType execType, boolean autoCommit);
    11   SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);
    12   SqlSession openSession(ExecutorType execType, Connection connection);
    13 
    14   Configuration getConfiguration();
    15 
    16 }

    SqlSessionFactory有一个默认的实现类DefaultSqlSessionFactory。

     16 package org.apache.ibatis.session.defaults;
     17 
     18 import java.sql.Connection;
     19 import java.sql.SQLException;
     20 
     21 import org.apache.ibatis.exceptions.ExceptionFactory;
     22 import org.apache.ibatis.executor.ErrorContext;
     23 import org.apache.ibatis.executor.Executor;
     24 import org.apache.ibatis.mapping.Environment;
     25 import org.apache.ibatis.session.Configuration;
     26 import org.apache.ibatis.session.ExecutorType;
     27 import org.apache.ibatis.session.SqlSession;
     28 import org.apache.ibatis.session.SqlSessionFactory;
     29 import org.apache.ibatis.session.TransactionIsolationLevel;
     30 import org.apache.ibatis.transaction.Transaction;
     31 import org.apache.ibatis.transaction.TransactionFactory;
     32 import org.apache.ibatis.transaction.managed.ManagedTransactionFactory;
     33 
     34 /**
     35  * @author Clinton Begin
     36  */
     37 public class DefaultSqlSessionFactory implements SqlSessionFactory {
     38 
     39   private final Configuration configuration;
     40 
     41   public DefaultSqlSessionFactory(Configuration configuration) {
     42     this.configuration = configuration;
     43   } 84 
     85   @Override
     86   public Configuration getConfiguration() {
     87     return configuration;
     88   }
     89   //其余略
    144 145 }

    在对SqlSessionFactory的构建中,直接使用构造方法去构建是有困难的,这样会将大量的逻辑放在构造方法中。因此采用的是builder模式,使用SqlSessionFactoryBuilder来构建。

    SqlSessionFactory中提供了很多build方法,最终调用的都是下面两个中的一个,然后调用第三个build:生成一个defaultSqlSessionFactory(configuration config)。

    Configuration类中则保存了配置相关的参数,全局唯一。

     1 package org.apache.ibatis.session;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.io.Reader;
     6 import java.util.Properties;
     7 
     8 import org.apache.ibatis.builder.xml.XMLConfigBuilder;
     9 import org.apache.ibatis.exceptions.ExceptionFactory;
    10 import org.apache.ibatis.executor.ErrorContext;
    11 import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory;
    12 
    13 public class SqlSessionFactoryBuilder {
    14 
    15   public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
    16     try {
    17       XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
    18       return build(parser.parse());
    19     } catch (Exception e) {
    20       throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    21     } finally {
    22       ErrorContext.instance().reset();
    23       try {
    24         reader.close();
    25       } catch (IOException e) {
    26         // Intentionally ignore. Prefer previous error.
    27       }
    28     }
    29   }
    30 
    31   public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
    32     try {
    33       XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
    34       return build(parser.parse());
    35     } catch (Exception e) {
    36       throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    37     } finally {
    38       ErrorContext.instance().reset();
    39       try {
    40         inputStream.close();
    41       } catch (IOException e) {
    42         // Intentionally ignore. Prefer previous error.
    43       }
    44     }
    45   }
    46     
    47   public SqlSessionFactory build(Configuration config) {
    48     return new DefaultSqlSessionFactory(config);
    49   }
    50   //其余略
    51 }

    综上所述,SqlSessionFactory的构建过程:

    • mybatis通过SqlSessionFactoryBuilder去构建SqlSessionFactory。
    • SqlSessionFactoryBuilder中提供了SqlXMLConfigBuilder读取XML配置文件中的信息,保存至Configuration类的单例中。
    • 然后SqlSessionFactoryBuilder实例化DefaultSqlSessionFactory。
  • 相关阅读:
    C#数组的使用
    CLR设计类型之接口
    CLR类型设计之泛型(二)
    CLR类型设计之泛型(一)
    CLR类型设计之属性
    CLR类型设计之参数传递
    CLR类型设计之方法与构造器
    将博客搬至CSDN
    Unity_与android交互
    CSS3制作hover下划线动画
  • 原文地址:https://www.cnblogs.com/lyh421/p/8135168.html
Copyright © 2011-2022 走看看