[一天一個進階系列] – MyBatis基礎篇
- 2021 年 2 月 2 日
- 筆記
前言:一直以來,很多人都是拿來主義,只停留在會使用的階段,從未去研究挖掘其原理,剖析本質。現在慢慢探討一下其內幕,拋磚引玉
一、簡介
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操作資料庫
- 1 註冊資料庫驅動類 ,明確指定資料庫
- 使用
MyBatis
,其主要步驟如下:- 1 配置
mybatis-config.xml
配置文件, 配置資料庫的URL
地址、資料庫用戶名和密碼、別名資訊、映射配置文件的位置以及一些全局配置資訊 - 2 應用程式首先會載入
mybatis-config.xml
配置文件 - 3 井根據配置文件的內容創建
SqlSessionFactory
對象 - 4 通過
SqlSessionFactory
對象創建SqlSession
對象,SqlSession
介面中定義了執行SQL語句所需要的各種方法 - 5 通過
SqlSession
對象執行映射配置文件中定義的SQL
語句,完成相應的數據操作 - 6 通過
SqlSession
對象提交事務,關閉SqlSession
對象
- 1 配置
3)Mybatis整體架構
- 整體結構圖
- 一條sql大致的執行過程
① 基礎支援層
-
反射模組
- 反射工具箱:在進行參數處理、結果映射等操作時,會涉及大量的反射操作,
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
語句中的佔位符提供支援
- 1 對
- 功能
-
數據源模組:提供了與第三方數據源集成的介面,這些功能都位於數據源模組之中
-
事務管理:對資料庫中的事務進行了抽象,其自身提供了相應的事務介面和簡單實現,與
Spring
框架集成,並由Spring
框架管理事務 -
快取模組
- 功能
- 1 提供一級快取和二級快取
- 簡單的快取使用圖
注意: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
完成結果集的映射,得到結果對象並返回
- 1
- 插件:可以通過添加用戶自定義插件的方式對
MyBatis
進行擴展,用戶自定義插件也可以改變Mybatis
的默認行為
③ 介面層
- 介面層相對簡單,其核心是
SqlSession
介面,該介面中定義了MyBatis
暴露給應用程式調用的API
,也就是上層應用與MyBatis
交互的橋樑。介面層在接收到調用請求時,會調用核心處理層的相應模組來完成具體的資料庫操作
總結
- 本篇簡單介紹了 MyBatis 整體架構及各層之間的功能。若要用好並深入,請關注下一篇原理剖析篇