mybatis內置insert、update和delete


前面已經說過了怎么獲取Connection,這次看下內置的insert和update是怎么實現的。
insert和update最后都會調用update(String statement, Object parameter)方法,如圖1:
圖1

Executor在DefaultSqlSession生成中已經說明過,默認生成的是CachingExecutor,在CachingExecutor中有個代理,如果不指定默認就是SimpleExecutor,如圖2:
圖2

那么就直接看下executor.update方法,這個是SimpleExecutor的父類BaseExecutor的方法,如圖3:
圖3

這里是一個模板方法,每個子類都實現了doUpdate方法,那么看下SimpleExecutor的doUpdate方法,如圖4:
圖4

這里能看到,通過Configuration會去實例化一個StatementHandler的實現類,如圖5:
圖5

那么再看下RoutingStatementHandler的構造函數,如圖6:
圖6

可以看到這里有三個StatementHandler的實現,是RoutingStatementHandler中的代理,默認是PreparedStatementHandler,在初始化解析的時候,如果不指定,那就是PreparedStatementHandler,如圖7:
圖7

那繼續往下看,在初始化PreparedStatementHandler的時候是直接使用了父類的構造函數,如圖8:
圖8

可以看到主要是賦值一些參數,主要看下getBoundSql方法,如圖9:
圖9

這里就是解析sql的地方,關鍵還是要看sqlSource.getBoundSql方法,在這里還需要看初始化解析的時候,如果是靜態sql,就是沒有<if>和${},就會直接把#{}編譯成?,然后返回一個RawSqlSource,但是其中內部有個sqlSource的屬性,是StaticSqlSource類型,那StaticSqlSource就是預編譯好以后的sql。如果是動態sql就回去解析<if>標簽和使用OGNL表達式解析${},關於這塊解析,我們下次在討論。總之這里就是把sql解析了出來。
那么接下來就是獲取連接,執行sql了,如圖10:
圖10

前面獲取連接已經講過了,直接看下是怎么執行update的吧,如圖11:
圖11

整個update和insert的過程就結束了。
那么下次我們來看下內置的select吧。
 
如果有不對請提出,共同提高,謝謝!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM