在之前文章中,咱們對Mybatis進行了入門級的介紹教小師妹快速入門Mybatis,看這篇就夠了,今天咱們來從一個全局的角度看看Mybatis。java
本文主要內容:sql
Mybatis工做流程能夠大體分爲四個步驟:數據庫
下面咱們就來講說這四個步驟:緩存
觸發條件:加載配置文件,好比:全局配置文件、XxxMapper.xml配置文件等。架構
配置來源於兩個地方,一處是配置文件,一處是Java代碼的註解,將SQL的配置信息加載成爲一個個MappedStatement對象(包括了傳入參數映射配置、執行的SQL語句、結果映射配置),存儲在內存中。app
觸發條件:調用Mybatis提供的APIide
傳入參數:爲SQL的ID和傳入參數對象spa
處理過程:將請求傳遞給下層的請求處理層進插件
行處理。傳入參數:爲SQL的ID和傳入參數對象code
具體處理過程: (A)根據SQL的ID查找對應的MappedStatement對象。
(B)根據傳入參數對象解析MappedStatement對象,獲得最終要執行的SQL和執行傳入參數。
(C)獲取數據庫鏈接,根據獲得的最終SQL語句和執行傳入參數到數據庫執行,並獲得執行結果。
(D)根據MappedStatement對象中的結果映射配置對獲得的執行結果進行轉換處理,並獲得最終的處理結果。
(E)釋放鏈接資源。
將最終的處理結果返回。
Mybatis大體流程:
Mybatis底層仍是採用原生jdbc來對數據庫進行操做的,只是經過 SqlSessionFactory,SqlSession Executor,StatementHandler,ParameterHandler,ResultHandler和TypeHandler等幾個處理器封裝了這些過程。
執行器:Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) 參數處理器:ParameterHandler (getParameterObject, setParameters) 結構處理器 ResultSetHandler (handleResultSets, handleOutputParameters) sql查詢處理器:StatementHandler (prepare, parameterize, batch, update, query)
其中StatementHandler用經過ParameterHandler與ResultHandler分別進行參數預編譯 與結果處理。而ParameterHandler與ResultHandler都使用TypeHandler進行映射。以下圖:
Mybatis
的功能架構分爲三層:
每一層對應詳細內容:
首先接口層是咱們打交道最多的層,核心對象就是SqlSession,它是上層應用和Mybatis打交道的橋樑,也有的人稱之爲大門,SqlSession中定義了很是多的對數據庫操做的方法,接口層在接受到調用請求時,會調用核心處理層的相應模塊來完成具體的數據庫操做。。
這一層主要就是跟數據庫操做相關的動做都是在這數據處理層完成的。
核心處理層主要作了這4件事:
插件也屬於核心層,這是由它的工做方式和攔截的對象決定的。
負責最基礎的功能支撐,包括鏈接管理、事務管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來做爲最基礎的組件。爲上層的數據處理層提供最基礎的支撐。
MyBatis全部的配置信息都保存在Configuration對象之中,配置文件中的大部分配置都會存儲到該類中。
做爲MyBatis工做的主要頂層API,表示和數據庫交互時的會話,完成必要數據庫增刪改查功能。
MyBatis執行器,是MyBatis 調度的核心,負責SQL語句的生成和查詢緩存的維護。
封裝了JDBC Statement操做,負責對JDBC statement 的操做,如設置參數等。
負責對用戶傳遞的參數轉換成JDBC Statement 所對應的數據類型。
負責將JDBC返回的ResultSet結果集對象轉換成List類型的集合。
負責java數據類型和jdbc數據類型(也能夠說是數據表列類型)之間的映射和轉換。
MappedStatement維護一條<select|update|delete|insert>
節點的封裝。
負責根據用戶傳遞的parameterObject,動態地生成SQL語句,將信息封裝到BoundSql對象中,並返回
表示動態生成的SQL語句以及相應的參數信息。