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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...