[一天一個進階系列] – 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 整體架構及各層之間的功能。若要用好並深入,請關注下一篇原理剖析篇