前面已經說過了怎么獲取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吧。
如果有不對請提出,共同提高,謝謝!!