mybatis 源码解析之 session

版权声明:本文系原创,转发请注明出处,商业用途联系作者 https://blog.csdn.net/wenxueliu/article/details/85042718

介绍

该部分代码位于 org.apache.ibatis.session 包。覆盖了由读取配置之后,到创建一个 SqlSession 的过程。

简化流程

SqlSessionManager 根据 Reader、InputStream 用 SqlSessionFactoryBuilder 创建 SqlSessionFactory 对象

XMLConfigBuilder 从 Reader 或 InputStream 读取 xml 配置,解析之后,创建 Configuration 对象

SqlSessionFactoryBuilder 读取配置 Configuration 创建 SqlSessionFactory,

SqlSessionFactory 根据不同的参数(autoCommit,ExecutorType,TransactionIsolationLevel,Connection)创建不同类型的 SqlSession,DefaultSqlSessionFactory 是 SqlSessionFactory 的默认实现,DefaultSqlSession 是 SqlSession 的默认实现。其中包括

  1. 创建用 TransactionFactory 创建 Transaction
  2. 创建执行器 BatchExecutor,ReuseExecutor、SimpleExecutor 或 CachingExecutor
  3. 创建 SqlSession

SqlSession 执行相应的 sql 语句,Executor 执行具体的 sql 语句,其中:

  1. executor.query 为 select 操作
  2. executor.update 为 update 操作
  3. executor.update 为 delete 操作
  4. executor.commit 为 commit 操作
  5. executor.rollback 为 rollback 操作
  6. executor.flushStatements 为 flush 操作

更具体的流程

根据 Reader、InputStream 用 SqlSessionFactoryBuilder 创建 SqlSessionFactory 对象

  public static SqlSessionManager newInstance(Reader reader) {
    return new SqlSessionManager(new SqlSessionFactoryBuilder().build(reader, null, null));
  }


  public static SqlSessionManager newInstance(InputStream inputStream) {
    return new SqlSessionManager(new SqlSessionFactoryBuilder().build(inputStream, null, null));
  }

以 InputStream 或 Reader 的形式读配置文件

Inputstream inputStream= Resources.getResourceAsStream("mybatis-config.xml");

将 InputStream 或 Reader 解析为 Configuration 对象

XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);

XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);

根据 Configuration 创建 SqlSessionFactory 对象 DefaultSqlSessionFactory

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

根据 SqlSessionFactory 创建 SqlSession 对象 DefaultSqlSession

      final Environment environment = configuration.getEnvironment();
      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
      final Executor executor = configuration.newExecutor(tx, execType);
      new DefaultSqlSession(configuration, executor, autoCommit);

SqlSessionManager

用 SqlSessionFactoryBuilder 创建 SqlSessionFactory,之后创建 SqlSession

SqlSessionFactoryBuilder

通过 Reader,InputStream,Configuration 创建 SqlSessionFactory

SqlSessionFactory

接口类,默认实现 DefaultSqlSessionFactory,创建 SqlSession 的工厂。支持各种参数,比如 自动提交,事物隔离级别等。

  SqlSession openSession();

  SqlSession openSession(boolean autoCommit);
  SqlSession openSession(Connection connection);
  SqlSession openSession(TransactionIsolationLevel level);

  SqlSession openSession(ExecutorType execType);
  SqlSession openSession(ExecutorType execType, boolean autoCommit);
  SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);
  SqlSession openSession(ExecutorType execType, Connection connection);

  Configuration getConfiguration();

注:ExecutorType 包括 SIMPLE,REUSE,BATCH

SqlSessionFactory 是 MyBatis的关键对象,它是单个数据库映射关系经过编译后的内存镜像。
SqlSessionFactory 对象的实例可以通过 SqlSessionFactoryBuilder 对象来获得,而SqlSessionFactoryBuildr 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出SqlSessionFactory 的实例。

每一个 MyBatis 的应用程序都以一个 SqlSessionFactory 对象的实例为核心。SqlSessionFactory 是线程安全的,它一旦被创建,应该在应用执行期间都存在。在应用运行期间不要重复创建多次,建议使用单例模式。

DefaultSqlSessionFactory

  1. 从 Configuration 中读取 Environment
  2. 创建 TransactionFactory,并创建新的事务 Transaction
  3. 根据 事务和执行类型,创建一个执行器 Executor
  4. 根据配置,执行器,是否自动提交,创建一个 SqlSession

SqlSession

接口类,默认实现 DefaultSqlSession ,对 sql 语句的封装,select,insert,delete,update,commit,rollback 等。

每个线程一个,避免将跨线程共享使用完必须在 finally 中 close

通过 Executor 来说执行相应的 sql 语句(query,upate,commit,rollback)

总结

session 部分比较简单,就是 Manger -> FactoryBuilder -> Factory -> Session 的套路。

具体的 sql 执行依赖执行器 Executor,下一个主题 Executor。

猜你喜欢

转载自blog.csdn.net/wenxueliu/article/details/85042718