executor:是mybaits核心介面之一,定義了資料庫操作最基本的方法, sqlsession的功能都是基於它來實現的。
這裡我們由上述executor類的query方法來了解下它的基礎實現類baseexecutor類
這裡它在查詢之前會先判斷是否設定了禁用一級快取,要是禁用的話,它在去快取之前會先清除一級快取,然後再查詢資料庫之前它會從一級快取中去資料,沒有拿到資料的話,才會去訪問資料庫。
在訪問資料庫取得資料後,它會將資料放入一級快取之中去
我們會發現在baseexecutor類真正去查詢資料庫的方法是沒有實現的,這裡只是提供的快取管理的能力,這是一查詢為例,baseexecutor類在插入更新等操作中也是不進行訪問資料庫中,它主要提供事務管理的能力。
其實真正執行查詢資料庫的處理其實是由baseexecutor的子類進行實現的,是不是想到了我們的 抽象類應用——模板模式
我們baseexecutor類的doquery方法共有三個實現類,如下:
這裡我們先看一下我們的預設配置******executor類,這裡我們會通過我們的配置得到statementhandler,然後通過這個statementhandler來獲取我們的statement
這裡我們發現其實和我們的jdbc是一樣的,都是獲取connection,然後獲取statement,這裡我們獲取的connection是我們通過動態**增強之後的,具有有列印日誌能力的connection,我們在 mybatis日誌模板分析 中也是分析過的
我們繼續看看它是如何獲取statement的,我們通過這個方法的實現類basestatementhandler,發現我們獲取statement的方法也是乙個抽象方法,由其子類進行實現
因為我們在使用jdbc連線資料庫的時候我們也是知道的,我們可以使用statement,是不進行預編譯的,或者我們使用preparedstatemen,是使用預編譯方式的。
看完了我們的******executor類,這裡我們再來看一看我們的reuseexecutor類,這我們發現我們的doquery執行的方法一模一樣,它的主要區別就是在於獲取statement的過程之中
這裡我們發現,他在建立statement之前,會先拿到sql語句,判斷在它設定的快取中是否有對應的statement,有的話直接取出返回
要是在快取中未找到的話,才會去建立乙個statement,並且會將其加入到快取之中,這樣下次就可以不用建立了。
還有一點就是我們在上述的 baseexecutor 類的執行流程中發現,我們在在查詢過程中,我們會拼接處cachekey,然後去查一級快取,沒有查詢到再去查詢資料庫,可是如果我們配置的二級快取,在查詢一級快取前是會先查詢二級快取的,那麼我們會在什麼地方查詢二級快取呢
其實上,我們的 executor 介面處理 baseexecutor 實現類,還有另外乙個 cachingexecutor 實現類
這裡上述還判斷了我們上述說了幾個型別,我們在也是可以在mybatis進行設定的,我們的 mybatis配置 中的 setting 也有相關介紹
這裡會先去下二級快取,看看有沒有設定二級快取,如果有的話回去二級快取中去資料,如果取不到資料的話,就是去呼叫我們的 baseexecutor 類的 query 方法,接下來的步驟就和我們上述介紹的一致了。
最後我們總結下來,executor類及其實現類的關係如下:
經過上述分析,我們發現executor的實現類cachingexecutor,就是設定了二級快取就查一下二級快取,沒有取到資料或者沒有設定二級快取的話,就交由baseexecutor類進行處理,我們的baseexecutor也沒有幹什麼事,就是在查詢操作中提供查詢一級快取的能力,在插入/更新等操作中提供事務的能裡,然後運算元據庫就交由它的幾個子類中的其中某個進行處理。
mybatis核心元件之MapperMethod
execute執行 執行sqlsessiontemplate中的方法 注釋 跟蹤sql語句的原始碼過程 mybatis springpublic object invoke object proxy,method method,object args throws throwable catch t...
Mybatis核心雜談
本文主要介紹mybatis的配置解析對應的class mybatis的全域性配置等,每個點都不會講太多細節的東西,只是提一下對應的點,更多細節的東西請有興趣的讀者自己去挖掘。來解析的,具體如下。型別 解析器 mybatis全域性配置檔案 xmlconfigbuilder xmlstatementbu...
MyBatis核心配置
resource database.properties jdbc.driver com.mysql.jdbc.driver jdbc.url jdbc mysql localhost 3306 test?characterencoding utf 8 jdbc.username root jdbc...