1. 程式人生 > >[一天一個進階系列] - MyBatis基礎篇

[一天一個進階系列] - MyBatis基礎篇

### 前言:一直以來,很多人都是拿來主義,只停留在會使用的階段,從未去研究挖掘其原理,剖析本質。現在慢慢探討一下其內幕,拋磚引玉 ### 一、簡介 #### 1)常用的持久化框架 + `Hibernate`:是一款`Java`世界中最著名的`ORM`框架之一 + `JPA(Java Persistence API)`: 是`EJB 3 .0`中持久化部分的規範,但它可以脫離`EJB`的體系單 獨作為一個持久化規範進行使用 + `Spring JDBC`:嚴格來說,`Sring JDBC`不能算是一個`ORM`架,它僅僅是使用模板方式對原生`DBC`行了一層非常薄的封裝 + `MyBatis`: `MyBatis`前身是`Apache`基金會的開源專案`iBatis`,在2010 年該專案脫離`Apache`基金會並正式更名為`MyBatis` #### 2)使用步驟 + 傳統的`JDBC`程式設計中的查詢操作為例進行說明,其主要步驟如下: + 1 註冊資料庫驅動類 ,明確指定資料庫`URL`地址、資料庫使用者名稱、密碼等連線資訊 + 2 通過`DriverManager`開啟資料庫連線 + 3 通過資料庫連線建立`Statement`物件 + 4 通過 `Statement` 物件執行 `SQL` 語句,得到 `ResultSet` 物件 + 5 通過 `ResultSet` 讀取資料,並將資料轉換成 `JavaBean` 物件 + 6 關閉 `ResultSet` 、 `Statement` 物件以及資料庫連線,釋放相關資源 > java操作資料庫 > ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/edef9a8c8f914c7d8b93a8048c219a30~tplv-k3u1fbpfcp-zoom-1.image) + 使用`MyBatis`,其主要步驟如下: + 1 配置`mybatis-config.xml`配置檔案, 配置資料庫的`URL`地址、資料庫使用者名稱和密碼、別名資訊、對映配置檔案的位置以及一些全域性配置資訊 + 2 應用程式首先會載入`mybatis-config.xml`配置檔案 + 3 井根據配置檔案的內容建立 `SqlSessionFactory` 物件 + 4 通過 `SqlSessionFactory` 物件建立 `SqlSession` 物件, `SqlSession` 介面中定義了執行SQL語句所需要的各種方法 + 5 通過 `SqlSession` 物件執行對映配置檔案中定義的 `SQL` 語句,完成相應的資料操作 + 6 通過 `SqlSession` 物件提交事務,關閉 `SqlSession` 物件 #### 3)Mybatis整體架構 > + 整體結構圖 > ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/63950324e8824799ad38a52133019c5d~tplv-k3u1fbpfcp-zoom-1.image) > + 一條sql大致的執行過程 > ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a413812b3cc743b3932632a5efe7fe97~tplv-k3u1fbpfcp-zoom-1.image) ##### ① 基礎支援層 + 反射模組 + 反射工具箱:在進行引數處理、結果對映等操作時,會涉及大量的反射操作,`Java`中的反射雖然功能強大,但是程式碼編寫起來比較複雜且容易出錯,為了簡化反射操作的相關程式碼,`MyBatis`提供了專門的反射模組,該模組位於 `org.apache.ibatis.reflection` 包中,它對常見的反射操作做了進一步封裝,提供了更加簡潔方便的反射`API` + 型別轉換模組 + 功能 + 1 別名機制 + 2 轉換機制:在為 `SQL` 語句繫結實參時, 會將資料由 `Java` 型別轉換成 `JDBC` 型別;而在對映結果集時,會將資料由 `JDBC` 型別轉換成 Java 型別 + 日誌模組: + 功能 + 1 提供詳細的日誌輸出資訊 + 2 整合第三方日誌框架 + 資源載入模組 + 功能 + 1 對類載入器進行封裝,確定類載入器的使用順序 + 2 提供了載入類檔案以及其他資原始檔的功能 + 解析器模組 + 功能 + 1 對 `XPath` 進行封裝,為 `MyBatis` 初始化時解析 `mybatis-config.xml` 配置檔案以及對映配置檔案提供支援 + 2 為處理動態 `SQL` 語句中的佔位符提供支援 + 資料來源模組:提供了與第三方資料來源整合的介面,這些功能都位於資料來源模組之中 + 事務管理:對資料庫中的事務進行了抽象,其自身提供了相應的事務介面和簡單實現,與 `Spring` 框架整合,並由 `Spring` 框架管理事務 + 快取模組 + 功能 + 1 提供一級快取和二級快取 > + 簡單的快取使用圖 > ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0349a11d16af403facb7149c0c6ef45a~tplv-k3u1fbpfcp-zoom-1.image) > 注意: `MyBatis` 中自帶的這兩級快取與 `MyBatis` 以及整個應用是執行在同一個`JVM`中的,共享同一塊堆記憶體。如果這兩級快取中的資料量較大, 則可能影響系統中其他功能的執行,所以當需要快取大量資料時 ,優先考慮使用 `Redis` 、 `Memcache` 等快取產品 + `Binding`模組:`MyBatis` 通過 `Binding` 模組將使用者自定義的 `Mapper` 介面與對映配置檔案關聯起來,系統可以通過呼叫自定義 `Mapper` 介面中的方法執行相應的 `SQL` 語句完成資料庫操作,開發人員無須編寫自定義 `Mapper` 介面的實現, `MyBatis` 會自動為其建立動態代理物件 ##### ② 核心處理層 + 配置解析 + 在 `MyBatis` 初始化過程中,會載入 `mybatis-config.xml` 配置檔案、對映配置檔案以及`Mapper` 介面中的註解資訊,解析後的配置資訊會形成相應的物件並儲存到 `Configuration` 物件中 + `SOL` 解析與 `scripting` 模組 + 為了將開發人員從這項枯燥無趣的工作中解脫出來, `MyBatis` 實現動態 `SQL` 語句的功能,提供了多種動態 `SQL` 語句對應的節點 + `scripting` 模組會根據使用者傳入的實參,解析對映檔案中定義的動態 `SQL` 節點,並形成資料庫可執行的 `SQL` 語句 。之後會處理 `SQL` 語句中的佔位符,繫結使用者傳入的實參 + `SOL` 執行:語句的執行涉及多個元件 ,其中比較重要的是`Executor`、`StatementHandler`、`ParameterHandler` 和 `ResulSetHandler`,步驟如下: + 1 `Executor` 主要負責維護一級快取和二級快取,並提供事務管理的相關操作 ,它會將資料庫相關操作委託給 `StatementHandler` 完成 + 2 `StatementHandler` 首先通過 `ParameterHandler` 完成 `SQL` 語句的實參繫結,然後通過`java.sql.Statement` 物件執行 `SQL` 語句並得到結果集 + 3 最後通過 `ResultSetHandler` 完成結果集的對映,得到結果物件並返回 + 外掛:可以通過新增使用者自定義外掛的方式對 `MyBatis` 進行擴充套件,使用者自定義外掛也可以改變 `Mybatis` 的預設行為 ##### ③ 介面層 + 介面層相對簡單,其核心是 `SqlSession` 介面,該介面中定義了 `MyBatis` 暴露給應用程式呼叫的 `API`,也就是上層應用與 `MyBatis` 互動的橋樑。介面層在接收到呼叫請求時,會呼叫核心處理層的相應模組來完成具體的資料庫操作 #### 總結 + 本篇簡單介紹了 MyBatis 整體架構及各層之間的功能。若要用好並深入,請關注下一篇原理剖析篇