mybatis 源码解析之 session

介绍

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

简化流程

  1. 由 SqlSessionFactoryBuilder 创建 SqlSessionFactory
    1. 从 Reader,InputStream 读取 xml 配置,并解析 xml 配置
    2. 构造 DefaultSqlSessionFactory 对象(实现了 SqlSessionFactory 接口)
  2. 用 SqlSessionFactory 创建 SqlSession
    1. 获取环境变量
    2. 创建事务工厂,创建事务
    3. 创建执行器 Executor
    4. 创建 DefaultSqlSession
  3. 调用 SqlSession 执行 Sql (select,insert,update,delete,commit,rollback),实际由执行器来执行。

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

  private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
    Transaction tx = null;
    try {
      final Environment environment = configuration.getEnvironment();
      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
      final Executor executor = configuration.newExecutor(tx, execType);
      return new DefaultSqlSession(configuration, executor, autoCommit);
    } catch (Exception e) {
    }
  }
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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值