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

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

一、簡介

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