1. 程式人生 > 實用技巧 >Mybatis執行流程淺析

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.關閉