前言:一直以來,很多人都是拿來主義,只停留在會使用的階段,從未去研究挖掘其原理,剖析本質。現在慢慢探討一下其內幕,拋磚引玉
一、簡介
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 整體架構及各層之間的功能。若要用好並深入,請關注下一篇原理剖析篇