zoukankan      html  css  js  c++  java
  • Mybatis执行流程浅析

    从三个主要的对象SqlSessionFactoryBuilder->SqlSessionFactory->SqlSession说起

                inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
    1. 读取全局配置文件
    inputStream = Resources.getResourceAsStream(resource);
    
    1. 创建了一个SqlSessionFactoryBuilder对象

    2. 调用.getResourceAsStream(resource)方法,完成相关配置并创建SqlSessionFactory对象

    //点击进入可知对XML文件进行了解析,从而获得了XMLConfiguration,且该对象继承自Configuration对象.进入下一步的build查看
    public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
            SqlSessionFactory var5;
            try {
                XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
                var5 = this.build(parser.parse());
            } catch (Exception var14) {
                throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
            } finally {
                ErrorContext.instance().reset();
    
                try {
                    inputStream.close();
                } catch (IOException var13) {
                }
    
            }
    
            return var5;
        }
    
    //加Configuration对象加载给SqlSessionFactory对象,完成了SqlSessionFactory的创建
        public SqlSessionFactory build(Configuration config) {
            return new DefaultSqlSessionFactory(config);
        }
    
    
    1. 调用SqlSessionFactory对象的openSession方法完SqlSession对象的实例化
    //往下:可以看出是先继承了Configuration中的Environment,完成了transaction相关的操作,继而产生executor,最后才完成了SqlSession的实例化,能力有限,这里就不深究了
    private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
            Transaction tx = null;
    
            DefaultSqlSession var8;
            try {
                Environment environment = this.configuration.getEnvironment();
                TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(environment);
                tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
                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;
        }
    
    1. CURD的执行(产生错误就回滚)
    2. 检测是否执行(产生错误就回滚)
    3. 提交
      8.关闭
  • 相关阅读:
    Dockerfile编写语法
    java应用测试报告生成(二):利用ant的build.xml生成测试报告
    java应用测试报告生成(一): sonarqube配合Jenkins生成测试报告及覆盖率
    cannot create windows service for mysql
    线程交互:生产消费模型
    线程同步与锁
    线程的五种状态及改变状态的三种方法
    简单的git入门介绍及常用操作
    CentOS/RHEL 7中的firewall控制
    oracle数据库兼容mysql的差异写法
  • 原文地址:https://www.cnblogs.com/Arno-vc/p/13368416.html
Copyright © 2011-2022 走看看