• SSM-MyBatis-06:Mybatis中openSession到底做了什么


    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

    1.找SqlSesionFactory实现类
      Ctrl+H:DefaultSqlSessionFactory:
      Ctrl+F :openSession()方法
      原型如下:
      public SqlSession openSession() {
        return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);
      }

    2.查看openSessionFromDataSource方法的实现
      private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
        Transaction tx = null; 定义事务对象
        很明显:SqlSession实现类
        DefaultSqlSession var8;
        try {
          //读取 MyBatis-Config.xml 形成 Environment对象
          Environment e = this.configuration.getEnvironment();
          //通过环境e作为入参,获取到事务工厂
          TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(e);
          //创建事务对象
          tx = transactionFactory.newTransaction(e.getDataSource(), level, autoCommit);
          //MyBatis执行器 Executor 执行器
          Executor executor = this.configuration.newExecutor(tx, execType);
          var8 = new DefaultSqlSession(this.configuration, executor, autoCommit);
        } catch (Exception var12) {
          this.closeTransaction(tx);
          throw ExceptionFactory.wrapException("Error opening session. Cause: " + var12, var12);
        } finally {
          ErrorContext.instance().reset();
        }

        return var8;
      }


    3.查看DefaultSqlSession方法的实现
      private Configuration configuration; //配置
      private Executor executor; //执行器
      private boolean autoCommit; //事务自动提交的
      private boolean dirty; //脏 Java 内存中泛型数据 和底层DB数据 不一样 干净的(Java内存===DB Data 一致的)
      private List<Cursor<?>> cursorList; 游标 让记录前进的一个工具

      public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {
        this.configuration = configuration;
        this.executor = executor;
        this.dirty = false; //干净的
        this.autoCommit = autoCommit;
      }

    结论:通过以上3个步骤,我们不难发现,openSession 就是对DefaultSqlSession类中的成员变量赋值

  • 相关阅读:
    Windows 之 手机访问 PC 端本地部署的站点
    Java 之 Given final block not properly padded
    关于ie7下display:inline-block;不支持的解决方案
    Oracle 之 获取当前日期及日期格式化
    WebService 之 实例学习一
    第 3 章 共享程序集和强命名程序集
    第 2 章 生成、打包、部署和管理应用程序及类型
    第一章 CLR的执行模型
    CLR 之 内容概述
    网站跨站点脚本,Sql注入等攻击的处理
  • 原文地址:https://www.cnblogs.com/DawnCHENXI/p/8460718.html
Copyright © 2020-2023  润新知