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

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

1、簡介

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操做數據庫
    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大體的執行過程
① 基礎支持層
  • 反射模塊sql

    • 反射工具箱:在進行參數處理、結果映射等操做時,會涉及大量的反射操做,Java中的反射雖然功能強大,可是代碼編寫起來比較複雜且容易出錯,爲了簡化反射操做的相關代碼,MyBatis提供了專門的反射模塊,該模塊位於 org.apache.ibatis.reflection 包中,它對常見的反射操做作了進一步封裝,提供了更加簡潔方便的反射API
  • 類型轉換模塊數據庫

    • 功能
      • 1 別名機制
      • 2 轉換機制:在爲 SQL 語句綁定實參時, 會將數據由 Java 類型轉換成 JDBC 類型;而在映射結果集時,會將數據由 JDBC 類型轉換成 Java 類型
  • 日誌模塊:apache

    • 功能
      • 1 提供詳細的日誌輸出信息
      • 2 集成第三方日誌框架
  • 資源加載模塊編程

    • 功能
      • 1 對類加載器進行封裝,肯定類加載器的使用順序
      • 2 提供了加載類文件以及其餘資源文件的功能
  • 解析器模塊緩存

    • 功能
      • 1 對 XPath 進行封裝,爲 MyBatis 初始化時解析 mybatis-config.xml 配置文件以及映射配置文件提供支持
      • 2 爲處理動態 SQL 語句中的佔位符提供支持
  • 數據源模塊:提供了與第三方數據源集成的接口,這些功能都位於數據源模塊之中mybatis

  • 事務管理:對數據庫中的事務進行了抽象,其自身提供了相應的事務接口和簡單實現,與 Spring 框架集成,並由 Spring 框架管理事務架構

  • 緩存模塊app

    • 功能
    • 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 總體架構及各層之間的功能。若要用好並深刻,請關注下一篇原理剖析篇
相關文章
相關標籤/搜索