SSM-MyBatis-07:Mybatis中SqlSession的insert和delete底層到底做了什麽
先點進去看一下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底層到底做了什麽