Mybatis 架構(gòu)原理

1. 架構(gòu)設(shè)計

架構(gòu)圖

我們把Mybatis的功能架構(gòu)分為三層:
1. API接口層:提供給外部使用的接口API,開發(fā)人員通過這些本地API來操作數(shù)據(jù)庫。接口層一接收到調(diào)用請求就會調(diào)用數(shù)據(jù)處理層來完成具體的數(shù)據(jù)處理。
a. 使用傳統(tǒng)的Mybatis提供的API
b. 使用Mapper代理的方式
2. 數(shù)據(jù)處理層:負責具體的SQL查找,SQL解析、SQL執(zhí)行和執(zhí)行結(jié)果映射處理等。它主要的目的是根據(jù)調(diào)用的請求完成一次數(shù)據(jù)庫操作。
3. 基礎(chǔ)支撐層:負責最基礎(chǔ)的功能支持,包括連接管理、事務(wù)管理、配置加載和緩存管理,這些都是共用的東西,將他們抽取出來作為最基礎(chǔ)的組件。為上層的數(shù)據(jù)處理層提供最基礎(chǔ)的支撐。

2. 主要構(gòu)件及其相互關(guān)系

構(gòu)件 描述
SqlSession 作為Mybatis工作主要頂層API,表示和數(shù)據(jù)庫交互的會話,完成必要數(shù)據(jù)庫增刪改查功能
Executor Mybatis執(zhí)行器,是Mybatis調(diào)度的核心,負責SQL語句的生成和查詢緩存的維護
StatementHandler 封裝了JDBC Statement,負責對JDBC statement的操作,如設(shè)置參數(shù)、將Statement結(jié)果集轉(zhuǎn)換為List集合
parameterHandler 負責對用戶傳遞的參數(shù)轉(zhuǎn)換為JDBC Statement所需要的參數(shù)
ResultSetHandler 負責將JDBC返回的ResultSet結(jié)果集轉(zhuǎn)換為List類型的集合
TypeHandler 負責將java數(shù)據(jù)類型和jdbc數(shù)據(jù)類型之間的映射和轉(zhuǎn)換
MappedStatement MappedStatement維護了一條<select|update|delete|insert>節(jié)點的封裝
SqlSource 負責根據(jù)用戶傳遞的parameterObject,動態(tài)生成SQL語句,將信息封裝到BoundSql對象中,并返回
BoundSql 表示動態(tài)生成的SQL語句以及相應(yīng)的參數(shù)信息

3. 總體流程

  1. 加載配置并初始化
    觸發(fā)條件:加載配置文件
    配置來源于兩個地方,一個是配置文件(主配置文件conf.xml,mapper文件*.xml),一個是java代碼中的注解,將主配置文件內(nèi)容解析封裝到Configuration,將sql的配置信息加載成為一個mappedstatement對象,存儲在內(nèi)存中。
  2. 處理調(diào)用請求
    觸發(fā)條件:調(diào)用Mybatis提供的API
    傳入?yún)?shù):為SQL的ID 以及 傳入?yún)?shù)對象
    處理過程:將請求傳遞給下層的請求處理層進行處理。
  3. 處理操作請求
    觸發(fā)條件:API接口層傳遞請求過來
    傳入?yún)?shù):為SQL的ID 以及 傳入?yún)?shù)對象
    處理過程:
    a. 根據(jù)SQL的ID查找對應(yīng)的MappedStatement對象
    b. 根據(jù)傳入?yún)?shù)對象解析MappedStatement對象,得到最終要執(zhí)行的SQL和執(zhí)行傳入?yún)?shù)
    b. 獲取數(shù)據(jù)庫連接,根據(jù)得到的最終SQL語句和執(zhí)行傳入?yún)?shù)到數(shù)據(jù)庫執(zhí)行,并得到執(zhí)行結(jié)果
    c. 獲取數(shù)據(jù)庫連接,根據(jù)得到的最終SQL語句和執(zhí)行傳入?yún)?shù)到數(shù)據(jù)庫執(zhí)行,并得到執(zhí)行結(jié)果
    d. 根據(jù)MappedStatement對象中的結(jié)果映射配置對得到的執(zhí)行結(jié)果進行轉(zhuǎn)換處理,并得到最終的處理結(jié)果
    e. 釋放連接資源
  4. 返回結(jié)果集
    將最終處理結(jié)果返回
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容