1. 程式人生 > >SSM-MyBatis-07:Mybatis中SqlSession的insert和delete底層到底做了什麽

SSM-MyBatis-07:Mybatis中SqlSession的insert和delete底層到底做了什麽

src batis mit image updating obj color idea快捷鍵 手動

先點進去看一下insert方法

技術分享圖片

用ctrl加鼠標左鍵點進去看

  發現是一個接口SqlSession的方法,沒有實現 ,但是通過裏氏替換原則的想法,他是接口接收了實現類,所以找他的實現類DefaultSqlSession(idea快捷鍵ctrl+H)

  進去後用ctrl+F查找insert,可以看到多個insert方法構成的重載,但是他們的方法實現調用了這個

public int insert(String statement) {
        return this.insert(statement, (Object)null);
    }

    public int insert(String statement, Object parameter) {
        
return this.update(statement, parameter); }

  上面那個方法調用了下面的方法,下面insert方法確實調用了update方法

再看一下delete的方法,

  他和insert類似,都是接口SqlSession的方法,所以還是找他的實現類DefalutSqlSession

  進去之後繼續尋找delete方法

public int delete(String statement) {
        return this.update(statement, (Object)null);
}

public int delete(String statement, Object parameter) {
        
return this.update(statement, parameter); }

  可以看出他也是調用了update方法,所以就引發了好奇,update帶倆個參數的那個方法中有什麽?為什麽都調用它呢?

看一下update方法

public int update(String statement, Object parameter) {
        int var4;
        try {
            this.dirty = true;
            MappedStatement e = this.configuration.getMappedStatement(statement);
            var4 
= this.executor.update(e, this.wrapCollection(parameter)); } catch (Exception var8) { throw ExceptionFactory.wrapException("Error updating database. Cause: " + var8, var8); } finally { ErrorContext.instance().reset(); } return var4; }

  這裏簡單的提一下,

    1)dirty=true;代表了他已經成為臟數據,意思就是內存上的數據和數據庫中不一致,為什麽這兒會改,或許就要談論到為什麽增刪改需要手動提交事務(session.commit())和

      session.close為什麽會造成事物的回滾,可能下幾章博客會有簡單刨析一下

    2)MappedStatement這個我找了一些資料,但是從百度搜索的沒有告訴明白這個是什麽東西,簡單的說一下,如果錯誤,請大家幫我指出來,它應該是獲取到mybatis配置中的具體SQL

    3)var4就是用執行器執行sql,接收返回值,由update返回值是int,並且是var4,可以推斷出他應該是返回受影響的行數

    4)ErrorContext從字面意思理解為錯誤的上下文,instance是實例的意思,他源碼是通過靜態方法,拿到ErrorContext對象實例或創建實例並返回回來,單例的寫法,reset是復位,重置,

    初始化的意思

SSM-MyBatis-07:Mybatis中SqlSession的insert和delete底層到底做了什麽