MyBatis是一款優秀的持久層框架,它支持定制化SQL、存儲過程以及高級映射。以下是關于MyBatis的詳細介紹:
一、MyBatis的起源與發展
- MyBatis本是Apache的一個開源項目iBATIS,2010年這個項目由Apache遷移到了Google Code,并且改名為MyBatis。2013年11月遷移到Github。
- 當前,最新版本是MyBatis 3.5.13,發布時間是2023年03月11日。
二、MyBatis的功能特點
- 簡單易學:MyBatis本身很小且簡單,沒有任何第三方依賴。最簡單的安裝只需兩個jar文件,并配置幾個SQL映射文件。它易于學習、易于使用,通過文檔和源代碼,開發者可以比較全面地掌握其設計思路和實現。
- 靈活:MyBatis不會對應用程序或者數據庫的現有設計強加任何影響。SQL寫在XML里,便于統一管理和優化。
- 解除SQL與程序代碼的耦合:MyBatis通過提供DAO(數據訪問對象)層,將業務邏輯和數據訪問邏輯分離,使得系統的設計更清晰、更易維護、更易進行單元測試。
- 支持對象與數據庫的ORM字段關系映射:MyBatis提供映射標簽,支持對象關系映射(ORM),方便Java對象與數據庫記錄之間的轉換。
- 支持動態SQL:MyBatis提供XML標簽,支持編寫動態SQL,使得SQL語句更加靈活、可配置。
三、MyBatis的核心組件與流程
MyBatis架構分為三層:
- API接口層:提供給外部使用的接口API,開發人員通過這些本地API來操縱數據庫。接口層接收到調用請求后,會調用數據處理層來完成具體的數據處理。
- 數據處理層:負責具體的SQL查找、SQL解析、SQL執行和執行結果映射處理等。它的主要目的是根據調用的請求完成一次數據庫操作。
- 基礎支撐層:負責最基礎的功能支撐,包括連接管理、事務管理、配置加載和緩存處理等。這些都是共用的組件,為上層的數據處理層提供最基礎的支撐。
MyBatis的執行流程如下:
-
加載配置并初始化:觸發條件為加載配置文件。處理過程是將SQL的配置信息加載成為一個個MappedStatement對象(包括傳入參數映射配置、執行的SQL語句、結果映射配置),并存儲在內存中。
-
接收調用請求:觸發條件為調用MyBatis提供的API。傳入參數為SQL的ID和傳入參數對象。處理過程是將請求傳遞給下層的請求處理層進行處理。
-
處理操作請求:觸發條件為API接口層傳遞請求過來。傳入參數為SQL的ID和傳入參數對象。具體處理步驟包括:
- 根據SQL的ID查找對應的MappedStatement對象。
- 根據傳入參數對象解析MappedStatement對象,得到最終要執行的SQL和執行傳入參數。
- 獲取數據庫連接,根據得到的最終SQL語句和執行傳入參數到數據庫執行,并得到執行結果。
- 根據MappedStatement對象中的結果映射配置對得到的執行結果進行轉換處理,并得到最終的處理結果。
- 釋放連接資源。
-
返回處理結果:將最終的處理結果返回。
四、MyBatis的配置與使用
- 導入依賴:使用MyBatis需要導入MyBatis和數據庫(如MySQL)的依賴。
- 配置yml或xml文件:配置數據庫連接信息、MyBatis的相關設置等。
- 創建Mapper接口:定義數據訪問方法。
- 創建Mapper XML文件:編寫SQL語句,并與Mapper接口中的方法綁定。
- 使用SqlSession進行操作:通過SqlSession獲取Mapper接口的代理實現類,并調用其方法進行數據庫操作。
五、MyBatis的高級特性
- 一級緩存:存儲在SqlSession中,默認開啟。第一次查詢時會先去緩存中查找,若找到則直接返回;若沒找到則去數據庫獲取,返回查詢結果并緩存。事務提交操作會清空緩存。
- 二級緩存:構建在一級緩存之上。在收到查詢請求時,MyBatis會首先查詢二級緩存;若二級緩存未命中,再去查詢一級緩存;若一級緩存也沒有,則查詢數據庫。二級緩存與具體的命名空間綁定,一個Mapper中有一個Cache,相同Mapper中的MappedStatement共用一個Cache。
- 延遲加載:MyBatis支持延遲加載,即只有在真正需要數據時才從數據庫中加載,這有助于提高性能。
- 復雜映射:MyBatis支持復雜映射,包括一對一、一對多、多對多等關系映射。這可以通過resultMap手動配置實體屬性與表配置關系來實現。