MyBatis原理剖析

01.openSession到底做了什麼

1.1 SqlSessionFactory 接口的方法,得找接口的實現類

1.2DefaultSqlSessionFactory implements SqlSessionFactory

 進而找到了DefaultSqlSessionFactory 的openSession(),openSession方法的原型如下:

public SqlSession openSession() {
    return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);
}

 

1.3openSessionFromDataSource方法原型如下:

private SqlSession openSessionFromDataSource(ExecutorTypeexecType, TransactionIsolationLevel level,booleanautoCommit){
    Transaction tx = null;
DefaultSqlSession var8;
    try {
        Environment e = this.configuration.getEnvironment();
        TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(e);
        tx = transactionFactory.newTransaction(e.getDataSource(), level, autoCommit);
        Executor executor = this.configuration.newExecutor(tx, execType, autoCommit);
        var8 = new DefaultSqlSession(this.configuration, executor);
    } catch (Exception var12) {
        this.closeTransaction(tx);
        throw ExceptionFactory.wrapException("Error opening session.  Cause: " + var12, var12);
    } finally {
        ErrorContext.instance().reset();
    }

    return var8;
}

1.4DefaultSqlSession方法原型如下

public DefaultSqlSession(Configuration configuration, Executor executor) {
    this.configuration = configuration;
    this.executor = executor;
    this.dirty = false;
}

02.insert和delete底層到底是什麼?

Session.insert(“xxx”)

public int insert(String statement) {
    return this.insert(statement, (Object)null);//調度2個參數的insert
}

public int insert(String statement, Object parameter) {
    return this.update(statement, parameter);//底層調用update
}


03.爲什麼session.commit()引起事務的提交?

session.commit();

最終調度到事務的commit

this.transaction.commit();


04.session.close()爲什麼可以回滾事務


1.從session.insert()開始

public int insert(String statement, Objectparameter) {

       return this.update(statement, parameter);

    }

         --->update

         publicint update(String statement, Object parameter) {

      

           this.dirty = true;//注意這裏將dirty設置成真,內存數據和DB數據庫數據不一致

           MappedStatement e = this.configuration.getMappedStatement(statement);

      

    }

        

 session.close()

   this.executor.close(this.isCommitOrRollbackRequired(false));

         ------>isCommitOrRollbackRequired

         privateboolean isCommitOrRollbackRequired(boolean force) {

       return this.dirty || force;  //這裏得到的是true

    }

        

         ------>Executor的close()

          public void close(boolean forceRollback) {

       

               this.rollback(forceRollback);//true

     }

           ------>rollback

            public void rollback(boolean required)throws SQLException {

                if(required) {

                   this.transaction.rollback();

       }

    }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章