MyBatis源碼窺探(一):MyBatis總體架構解析

Mybatis的使用這裏就不介紹了,不知道怎麼使用的朋友能夠點擊html

www.mybatis.org/mybatis-3/z…java

這裏面的教程很詳細,包括xml的配置、映射、動態sql都有介紹,能夠學習和使用,本系列的文章將會更深刻的瞭解MyBatis。sql

1. ORM簡介

  ORM(Object Relational Mapping)對象-關係映射框架,ORM的主要功能就是根據映射配置文件,完成數據在對象模型與關係模型之間的映射。 數據庫

在這裏插入圖片描述

1.1 常見的ORM框架

1.1.1 Hibernate

  Hibernate經過hbm.xml映射文件維護一個Java類與數據庫表的映射關係,經過Hibernate的映射,Java開發人員能夠用看待Java對象的角度去看待數據庫表中的數據行,數據庫中多有的表經過hbm.xml配置文件映射以後,都對應一個Java類。緩存

1.1.2 JPA

  JPA(Java Persistence API) 是EJB 3.0中持久化部分的規範,他能夠脫離EJB的體系單獨做爲一個持久化規範進行使用。安全

1.1.3 Spring JDBC

  嚴格來講,Spring JDBC並不能算一個ORM框架,它僅僅是使用模板方式對原生JDBC進行了一層很是薄的封裝,使用Spring JDBC能夠幫助開發人員屏蔽建立數據庫鏈接對象,Statement對象,異常處理以及事務管理的重複性代碼,提升開發效率。bash

1.1.4 MyBatis

  MyBatis與前面介紹的持久化框架同樣,能夠幫助開發人員屏蔽底層重複性的原生JDBC代碼,MyBatis經過映射配置文件或相應註解將ResultSet映射爲Java對象,其映射規則能夠嵌套其餘映射規則以及子查詢,從而實現複雜的邏輯,也可實現一對一,一對多,多對多映射以及雙向映射。相比Hibemate更加輕量級,可控性也更高。mybatis

2. MyBatis總體架構

  MyBatis的總體分爲三層,分別是基礎支持層,核心處理層和接口層,如圖所示 架構

在這裏插入圖片描述

2.1 基礎支持層

  基礎支持層包含整個MyBatis的基礎模塊,這些模塊爲核心處理層的功能提供了良好的支撐,下面簡單描述下各個模塊。app

2.1.1 數據源模塊

  數據源是實際開發中經常使用的組件之一,如今開源的數據源都提供了比較豐富的功能,例如鏈接池功能、檢測連接狀態等,選擇性能優秀的數據源組件對於提高ORM框架乃至整個應用的性能都是很是重要的。MyBatis自身提供了相應的數據源實現。固然MyBatis也提供了與第三方接口數據源集成的接口,這些功能都位於數據源模塊之中。

2.1.2 事務管理模塊

  MyBatis對數據庫中的事務進行了抽象,其自身提供了相應的事務接口和簡單的實現,在不少場景中,MyBatis會與Spring框架集成,並由Spring框架管理事務相關配置。

2.1.3 緩存模塊

  在優化系統性能時,優化數據庫性能是很是重要的一個環節,而添加緩存則是優化數據庫時最有效的手段之一。正確、合理的使用緩存能夠將一部分數據庫請求攔截在緩存這一層,這就可以減小至關一部分數據庫的壓力。

  MyBatis中提供了一級緩存和二級緩存,而這兩級緩存都依賴於基礎支持層中的緩存模塊實現,這裏須要讀者注意的是MyBatis中自帶的兩級緩存以及整個應用是運行在一個JVM中的,共享一塊堆內存,若是這兩級緩存中的數據量較大,則可能影響系統中其餘功能的運行,因此當須要緩存大量數據時,優先考慮使用Redis、Mongodb、Memcache等緩存產品。

2.1.4 Binding模塊

  在調用 SqISession 相應方法執行數據庫操做時,須要指定映射文件中定義的 SQL 節點,若是出現拼寫錯誤,咱們只能在運行時才能發現相應的 異常 。 爲了儘早發現這種錯誤, MyBatis 經過 Binding 模塊將用戶自定義的 Mapper 接 口與映射配置文件關聯起來,系統能夠經過調用自定義 Mapper 接口中的方法執行相應的 SQL 語句完成數據庫操做,從而避免上述問題。值得讀者注意的是,開發人員無須編寫自定義 Mapper接口的實現, MyBatis會自動爲 其建立動態代理對象。在有些場景中,自定義 Mapper接口能夠徹底代替映射配置文件, 但有的映射規則和 SQL 語句的定義仍是寫在映射配置文件中比較方便,例如動態 SQL 語句的定義 。

2.1.5 反射模塊

  Java中的反射功能雖然強大,但對大多數開發人員來講,寫出高質量的反射代碼仍是有必定難度的。MyBatis中專門提供了反射模塊,該模塊對Java原生的反射進行了一系列優化,例如緩存了類的元數據,提升了反射的性能。

2.1.6 類型轉換模塊

  MyBatis 爲簡化配置文件提供了別名機制 , 該機制是類型轉換模 塊的主要功能之一 。 類型轉換模塊的另外一個功能是實現 JDBC 類型與 Java 類型之間的 轉換,該功能在爲 SQL 語句綁定實參以及 映射查詢結果集 時都會涉及。在爲 SQL 語 句綁定實參時, 會將數據由 Java類型轉換成 JDBC 類型;而在映射結果集時,會將數 據由 JDBC類型轉換成 Java類型。

2.1.7 日誌模塊

  不管在開發測試環境中,仍是在線上生產環境中,日誌在整個系統中的地位都是很是重要的。良好的日誌功能能夠幫助開發人員和測試人員快速定位 Bug代碼,也能夠幫助運維人員快速定位性能瓶頸、等問題 。 目前的 Java 世界中存在不少優秀的日誌框架,例如 Log4j、 Log4j2, slf4j等。 MyBatis做爲一個設計優良的框架,除了提供詳細的日誌輸出信息,還要可以集成多種日誌框架,其日誌模塊的 一個主要功能就是集成第三方日誌框架。

2.1.8 資源加載模塊

  資源加載模塊主要是對類加載器進行封裝,肯定類的使用順序,並提供了加載類文件以及其餘資源文件的功能。

2.1.9 解析器模塊

  解析器模塊主要提供了兩個功能:一個功能是對XPath進行封裝,爲MyBatis初始化時解析mybatis-config.xml配置文件以及映射配置文件提供支持;另外一個功能是爲處理動態sql語句中的佔位符提供支持。

2.2 核心處理層

  在MyBatis的核心處理層中實現了MyBatis的核心處理流程,其中包括MyBatis的初始化以及完成一次數據庫操做的所有流程,而這些都是基於基礎支持層實現的。

2.2.1 配置解析

  在 MyBatis 初始化過程當中,會加載 mybatis-config.xml 配置文件、映射配置文件以及 Mapper 接口中的註解信息,解析後的配置信息會造成相應的對象並保存到 Configuration 對象中 。例如,節點(即ResultSet 的映射規則) 會被解析成 ResultMap 對象,定義的節點(即屬性映射)會被解析成 ResultMapping對象。以後,利用該 Configuration對象創SqlSessionFactor對象。待 MyBatis 初始化以後,開發人員能夠經過初始化獲得SqlSessionFactory建立 SqlSession 對象並完成數據庫操做。

2.2.2 參數映射-SQL解析

  拼湊 SQL 語句是一件煩瑣且易出錯的過程,爲了將開發人員從這項枯燥無趣的工做中解脫出來,MyBatis實現動態SQL語句的功能,提供了多種動態 SQL語句對應的節點, 例如,節點、節點、節點等 。經過這些節點的組合使用,開發人員能夠寫出幾乎知足全部需求的動態 SQL語句。   MyBatis 中的scripting模塊會根據用戶傳入的實參,解析映射文件中定義的動態SQL節點,並造成數據庫可執行的SQL 語句 。以後會處理 SQL 語句中的佔位符,綁定用戶傳入的實參。

2.2.3 SQL執行

  SQL語句的執行涉及多個組件,其中比較重要的是Executor、StatementHandler、ParameterHandler和ResultSetHandler。Executor主要負責維護一級緩存和二級緩存,並提供事務管理的相關操做,它會將數據庫相關操做委託給StatementHandler完成。StatementHandler首先經過ParamHandler完成SQL語句的實參綁定,而後經過java.sql.Statement對象執行SQL語句並獲得結果集,最後經過ResultSetHandler完成結果集的映射,獲得結果對象並返回。如圖展現一條sql的執行過程:

在這裏插入圖片描述

2.2.4 插件

  Mybatis 自身的功能雖然強大,可是並不能完美切 合全部 的應用場景,所以 MyBatis 提供了插件接口,咱們能夠經過添加用戶自定義插件的方式對 MyBatis 進行擴展。用 戶自定義插件也能夠改變 Mybatis 的默認行爲 ,例如,咱們能夠 攔截 SQL 語句並對其 進行重寫。因爲用戶自定義插件會影響 MyBatis 的核心行爲,在使用自定義插件以前, 開發人員須要瞭解 MyBatis 內部的原理,這樣才能編寫出安全、高效的插件。

3.MyBatis 核心類介紹

SqlSession            做爲MyBatis工做的主要頂層API,表示和數據庫交互的會話,完成必要數據庫增刪改查功能
Executor              MyBatis執行器,是MyBatis 調度的核心,負責SQL語句的生成和查詢緩存的維護
StatementHandler      封裝了JDBC Statement操做,負責對JDBC statement 的操做,如設置參數、將Statement結果集轉換成List集合。
ParameterHandler      負責對用戶傳遞的參數轉換成JDBC Statement 所須要的參數,
ResultSetHandler      負責將JDBC返回的ResultSet結果集對象轉換成List類型的集合;
TypeHandler           負責java數據類型和jdbc數據類型之間的映射和轉換
MappedStatement       MappedStatement維護了一條<select|update|delete|insert>節點的封裝, 
SqlSource             負責根據用戶傳遞的parameterObject,動態地生成SQL語句,將信息封裝到BoundSql對象中,並返回
BoundSql              表示動態生成的SQL語句以及相應的參數信息
Configuration         MyBatis全部的配置信息都維持在Configuration對象之中。
複製代碼

4. MyBatis執行流程

在這裏插入圖片描述
到這裏本篇文章就結束,此篇文章做爲MyBatis系列開篇,這裏只是作一個總體的介紹,後面會陸續對Mybatis的各個模塊進行分析。喜歡的朋友能夠關注一波,跟着我一塊兒學習MyBatis。
相關文章
相關標籤/搜索