[一天一個進階系列] - MyBatis基礎篇

雙木l之林發表於2021-02-02

前言:一直以來,很多人都是拿來主義,只停留在會使用的階段,從未去研究挖掘其原理,剖析本質。現在慢慢探討一下其內幕,拋磚引玉

一、簡介

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 關閉 ResultSetStatement 物件以及資料庫連線,釋放相關資源

    java運算元據庫

  • 使用MyBatis,其主要步驟如下:
    • 1 配置mybatis-config.xml配置檔案, 配置資料庫的URL地址、資料庫使用者名稱和密碼、別名資訊、對映配置檔案的位置以及一些全域性配置資訊
    • 2 應用程式首先會載入mybatis-config.xml配置檔案
    • 3 井根據配置檔案的內容建立 SqlSessionFactory 物件
    • 4 通過 SqlSessionFactory 物件建立 SqlSession 物件, SqlSession 介面中定義了執行SQL語句所需要的各種方法
    • 5 通過 SqlSession 物件執行對映配置檔案中定義的 SQL 語句,完成相應的資料操作
    • 6 通過 SqlSession 物件提交事務,關閉 SqlSession 物件

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 語句中的佔位符提供支援
  • 資料來源模組:提供了與第三方資料來源整合的介面,這些功能都位於資料來源模組之中

  • 事務管理:對資料庫中的事務進行了抽象,其自身提供了相應的事務介面和簡單實現,與 Spring 框架整合,並由 Spring 框架管理事務

  • 快取模組

    • 功能
    • 1 提供一級快取和二級快取
    • 簡單的快取使用圖

      注意: MyBatis 中自帶的這兩級快取與 MyBatis 以及整個應用是執行在同一個JVM中的,共享同一塊堆記憶體。如果這兩級快取中的資料量較大, 則可能影響系統中其他功能的執行,所以當需要快取大量資料時 ,優先考慮使用 RedisMemcache 等快取產品
  • Binding模組:MyBatis 通過 Binding 模組將使用者自定義的 Mapper 介面與對映配置檔案關聯起來,系統可以通過呼叫自定義 Mapper 介面中的方法執行相應的 SQL 語句完成資料庫操作,開發人員無須編寫自定義 Mapper 介面的實現, MyBatis 會自動為其建立動態代理物件

② 核心處理層
  • 配置解析
    • MyBatis 初始化過程中,會載入 mybatis-config.xml 配置檔案、對映配置檔案以及Mapper 介面中的註解資訊,解析後的配置資訊會形成相應的物件並儲存到 Configuration 物件中
  • SOL 解析與 scripting 模組
    • 為了將開發人員從這項枯燥無趣的工作中解脫出來, MyBatis 實現動態 SQL 語句的功能,提供了多種動態 SQL 語句對應的節點
    • scripting 模組會根據使用者傳入的實參,解析對映檔案中定義的動態 SQL 節點,並形成資料庫可執行的 SQL 語句 。之後會處理 SQL 語句中的佔位符,繫結使用者傳入的實參
  • SOL 執行:語句的執行涉及多個元件 ,其中比較重要的是ExecutorStatementHandlerParameterHandlerResulSetHandler,步驟如下:
    • 1 Executor 主要負責維護一級快取和二級快取,並提供事務管理的相關操作 ,它會將資料庫相關操作委託給 StatementHandler 完成
    • 2 StatementHandler 首先通過 ParameterHandler 完成 SQL 語句的實參繫結,然後通過java.sql.Statement 物件執行 SQL 語句並得到結果集
    • 3 最後通過 ResultSetHandler 完成結果集的對映,得到結果物件並返回
  • 外掛:可以通過新增使用者自定義外掛的方式對 MyBatis 進行擴充套件,使用者自定義外掛也可以改變 Mybatis 的預設行為
③ 介面層
  • 介面層相對簡單,其核心是 SqlSession 介面,該介面中定義了 MyBatis 暴露給應用程式呼叫的 API,也就是上層應用與 MyBatis 互動的橋樑。介面層在接收到呼叫請求時,會呼叫核心處理層的相應模組來完成具體的資料庫操作

總結

  • 本篇簡單介紹了 MyBatis 整體架構及各層之間的功能。若要用好並深入,請關注下一篇原理剖析篇

相關文章