7 張圖解鎖 MyBatis 整體脈絡,讓你輕鬆拿捏面試官!

来源:https://www.cnblogs.com/javastack/archive/2023/11/08/17817187.html
-Advertisement-
Play Games

原文:juejin.cn/post/7283798251403821056 本文筆者計劃從全局角度來對Mybatis的整體架構及進行一次回顧和總結,希望能幫助你更加透徹的理解Mybatis。 1、前言 MyBatis是一款ORM(Object-Relational Mapping)框架,其主要用於將 ...


原文:juejin.cn/post/7283798251403821056

本文筆者計劃從全局角度來對Mybatis的整體架構及進行一次回顧和總結,希望能幫助你更加透徹的理解Mybatis。

1、前言

MyBatis是一款ORMObject-Relational Mapping)框架,其主要用於將Java對象與關係資料庫之間進行映射,憑藉其輕量性、穩定性以及廣泛的開源社區其受到了廣大開發者的追捧。

MyBatis為我們做了哪些事情呢?其實,總結來看主要有如下幾點:

  1. SQL映射配置MyBatis使用XML或註解配置文件來定義SQL查詢、插入、更新和刪除操作,以及與資料庫表之間的映射關係。這使得開發者能夠將SQL語句與Java代碼分離,提高了代碼的可維護性。
  2. 動態SQLMyBatis支持動態SQL,允許根據不同的條件生成不同的SQL語句。這使得構建複雜的查詢變得更加靈活和方便。
  3. 參數映射MyBatis能夠將Java對象的屬性與SQL語句中的參數進行映射,無需手動編寫繁瑣的參數傳遞代碼。
  4. 結果集映射MyBatis支持將SQL查詢結果映射到Java對象,自動將資料庫表中的列值賦給Java對象的屬性,大大簡化了數據的讀取和處理。
  5. 事務管理MyBatis可以與Java的事務管理框架(如Spring)無縫集成,確保資料庫操作的原子性和一致性。
  6. 連接池集成MyBatis可以與常見的Java連接池庫(如Apache DBCP、C3P0、HikariCP)集成,以管理資料庫連接的獲取和釋放。
  7. 二級緩存MyBatis支持二級緩存,可以在多個會話之間共用數據,提高性能。

知曉了MyBatis的功能特性後,接下來讓我們一起來看看MyBatis內部是通過哪些組件來支撐起這些功能的。

推薦一個開源免費的 Spring Boot 實戰項目:

https://github.com/javastacks/spring-boot-best-practice

2、總覽MyBatis

對於Mybatis的架構大致可以分為三層:基礎支持層核心處理層介面層。

或許,你會覺得上圖過於複雜,難以理解。如果此刻你也有這樣的疑惑,不要慌。不妨跟著筆者思路來進行梳理。

首先,使用MyBatis概括來看大致包括如下幾步:

  1. 定義介面,配置相關的xml文件信息
  2. 載入介面的配置文件,解析相關配置文件
  3. 生成介面代理類,執行相關sql

由於在使用MyBatis過程中會編寫相關的配置文件,所以Mybatis內部必然需要相應組件來支撐配置文件的解析,這些也就構成了底層的基礎支撐層。既然會解析配置文件,那是不是必然會涉及到資源載入、配置解析等模塊?

進一步,當配置文件解析完成後,下一步就是生成代理,然後執行sql,此時所涉及的也就是核心處理層中的sql執行,sql解析等。更進一步,執行sql過程中為了避免Connection頻繁創建,是不是需要對連接進行池化操作?所以MyBatis內部會抽象出一個數據源模塊來統一管理連接。

除此之外,對於sql執行過程中的事務是不是也需要控制?所以MyBatis還有事務管理模塊來對sql執行過程中的事務進行管理。

事實上,你只需要記住Mybatis的使用過程為:定義介面,提供配置文件,而後生成代理,執行****Sql 即可。以此進行發散,自然而然能擴展出上圖所示內容,根本沒必要死記硬背。

熟悉了MyBatis的整體架構後,我們接下來看Mybatis內部執行sql的大致流程:

接下來,我們將主要圍繞這張圖中內容進行總結分析。

3、配置文件解析

配置文件解析過程大致如下所示:

事實上,MyBatis內部對於配置文件解析的過程可以概括如下:

  1. 載入配置文件:MyBatis首先載入主配置文件(通常是mybatis-config.xml),並創建一個Configuration對象來表示整個MyBatis配置。
  2. 解析主配置文件:MyBatis使用XML解析器解析主配置文件,該文件包含了關於數據源、插件、類型別名、緩存等全局配置信息。這些配置會被存儲在Configuration對象中。

而參與配置文件解析的都繼承與BaseBuilder,其體繫結構如下所示:

其中

  1. XMLStatementBuilder :這個類用於解析映射文件中的 <select><insert><update><delete> 等標簽,構建與 SQL 語句相關的對象(如 MappedStatement),包括 SQL 語句的解析、參數映射、結果映射等。
  2. XMLMapperBuilderXMLMapperBuilder 用於解析映射文件(通常是 Mapper.xml 文件),負責構建與映射文件相關的對象,包括映射文件的解析、SQL 語句的構建、參數映射、結果映射、緩存配置等。
  3. XMLConfigBuilderXMLConfigBuilder 用於解析主配置文件(通常是 mybatis-config.xml 文件),負責構建與全局配置相關的對象,包括數據源配置、類型別名配置、插件配置、緩存配置等。

總結來看,對於MyBatis的載入過程來說,其在處理配置文件信息時,首先,會傳遞配置文件所在位置信息,然後再調用框架提供的****SqlSessionFactorybuild方法便會根據傳入路徑信息去載入相關的配置文件,併進行解析。而解析的內容會存放到的configuration之中,進而方便後續組件的使用。

4、代理構建

當配置文件解析,下一步就是通過SqlSessiongetMapper方法來構建一個介面對應的代理類,這一過程大致如下:

這一過程中涉及的組件主要包括MapperProxyFactory、MapperRegistry、MapperProxy,更加詳細的分析可參考Mybatis流程分析(六): Mybatis中方法和sql語句的橋梁——MapperProxy, 總之這一過程的本質就是通過****Jdk動態代理的方式返回一個實現介面的實例對象

5、sql執行

當配置文件解析完成,介面相應的代理類構建完畢後,下一步要做的就是sql的執行,這一過程邏輯大致如下所示:

這一部分的底層邏輯就是原生JDBC操縱資料庫的那一套邏輯,即

  1. 創建SQL語句:即創建StatementPreparedStatementCallableStatement對象,分別用於執行不同類型的SQL語句。
  2. 執行SQL查詢:使用創建的StatementPreparedStatement對象來執行SQL查詢。
  3. 處理查詢結果:通過ResultSet對象來處理查詢的結果數據。

6、總結

最後,我們再來一下Mybatis內部對於sql執行的大致步驟:

  1. 創建 SqlSessionFactory:使用Mybatis首先需要創建一個 SqlSessionFactory 對象,這通常通過讀取MyBatis 的主配置文件(mybatis-config.xml)並使用 SqlSessionFactoryBuilder 來實現。SqlSessionFactory 負責創建資料庫連接和 SqlSession 對象。
  2. 創建 SqlSession:通過 SqlSessionFactory 創建一個 SqlSession 對象。SqlSession 代表了與資料庫的一次會話,它可以執行 SQL 操作並管理資料庫連接。通常,每個線程都會創建自己的 SqlSession
  3. 執行 SQL 語句:在 SqlSession 中,通過調用方法執行 SQL 語句。MyBatis 支持多種方式來執行 SQL,包括 selectOne()selectList()insert()update()delete() 等方法。
  4. SQL 語句解析MyBatis 會解析 SQL 語句,包括動態 SQL,參數映射和結果映射。這包括了將 Java 對象轉化為 SQL 語句中的參數,以及將查詢結果映射回Java對象。
  5. 執行 SQLMyBatisSQL 語句發送到資料庫,並執行相應的操作,如查詢、插入、更新或刪除。資料庫返回結果或受影響的行數,這取決於SQL語句的類型。
  6. 處理結果MyBatis 最終會將SQL的執行結果映射為 Java 對象,然後返回給調用者。映射過程通常基於映射文件中的配置。結果集的處理包括將資料庫查詢結果映射為 Java 對象的屬性值。

進一步,上述步驟可總結概括總結為如下的流程。

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2022最新版)

2.勁爆!Java 協程要來了。。。

3.Spring Boot 2.x 教程,太全了!

4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!

5.《Java開發手冊(嵩山版)》最新發佈,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Go 介面:nil介面為什麼不等於nil? 本文主要內容:深入瞭解介面類型的運行時表示層。 目錄Go 介面:nil介面為什麼不等於nil?一、Go 介面的地位二、介面的靜態特性與動態特性2.1 介面的靜態特性與動態特性介紹2.2 “動靜皆備”的特性的好處三、nil error 值 != nil四、接 ...
  • 1、visio studio2019安裝及使用 1)下載地址:https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/ 2)選擇社區版進行下載 3)安裝 環境:win10-X64 ①勾選使用C++桌面開發 ②除預設選項外,勾選適用於 ...
  • 提起 jackson,在日常使用中,由於涉及到各種序列化和反序列化的處理,就不能不提 註解,瞭解註解的常用方式可以極大地方便我們處理序列化,今天分享一些在使用 jackson 中涉及到的註解。 目錄1.@JsonProperty - 欄位命名2.@JsonPropertyOrder - 欄位序列化順 ...
  • 使用腳本進行下載的需求很常見,可以是常規文件、web頁面、Amazon S3和其他資源。Python 提供了很多模塊從 web 下載文件。下麵介紹 一、使用 requests requests 模塊是模仿網頁請求的形式從一個URL下載文件 示例代碼: import requests url = 'x ...
  • 字元串操作 1.字元串的翻轉 # 方式一 s = 'hello world' print(s[::-1) # 方式二 from functools import reduce print(reduce(lambda x,y:y+x, s)) 2.判斷字元串是否是迴文 利用字元串翻轉操作可以查看字元串 ...
  • 前言 由於相容性問題,使得我們若想用較新版本的 PyTorch,通過 GPU 方式訓練模型,也得更換較新版本得 CUDA 工具包。然而 CUDA 的版本又與電腦顯卡的驅動程式版本關聯,如果是低版本的顯卡驅動程式安裝 CUDA11 及以上肯定會失敗。 比如 GTX750Ti 或 GTX1050Ti,出 ...
  • 寫在前面 此異常非彼異常,標題所說的異常是業務上的異常。 最近做了一個需求,消防的設備巡檢,如果巡檢發現異常,通過手機端提交,後臺的實時監控頁面實時獲取到該設備的信息及位置,然後安排員工去處理。 因為需要服務端主動向客戶端發送消息,所以很容易的就想到了用WebSocket來實現這一功能。 WebSo ...
  • Volatile 保證可見性 private volatile static Integer num = 0; 使用了volatile關鍵字,即可保證它本身可被其他線程的工作記憶體感知,即變化時也會被同步變化。 不保證原子性 原子性:不可分割 線程A在執行任務時是不可被打擾的,也不能被分割,要麼同時成 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...