MyBatis-Plus 的加載及初始化

在 Spring Boot 啟動過程中,MyBatis-Plus 的加載和初始化涉及多個階段的工作。這些工作包括 MyBatis-Plus 自身的配置解析、Mapper 接口的掃描與注冊、SQL 語句的動態注入以及底層 MyBatis 的初始化等。以下是對整個過程的詳細分析:


1. Spring Boot 啟動時對 MyBatis-Plus 的加載

Spring Boot 在啟動時會對 MyBatis-Plus 進行自動配置(AutoConfiguration),并通過依賴注入的方式完成組件的初始化。以下是關鍵步驟:

(1)@EnableAutoConfiguration?和?MybatisPlusAutoConfiguration
  • Spring Boot 的核心特性是基于約定優于配置的原則,通過?@EnableAutoConfiguration?注解自動加載相關的 Starter 配置。
  • mybatis-plus-boot-starter?提供了?MybatisPlusAutoConfiguration?類,該類負責完成 MyBatis-Plus 的自動配置。
主要功能:
  • 數據源配置:加載?DataSource,并將其注入到 MyBatis 中。
  • SqlSessionFactory 初始化:創建?SqlSessionFactory?對象,用于管理 SQL 會話。
  • Mapper 掃描:掃描標注了?@Mapper?或被?@MapperScan?指定的包路徑下的所有 Mapper 接口,并將其注冊為 Spring 容器中的 Bean。
  • 全局配置:讀取?application.yml?或?application.properties?中的 MyBatis-Plus 配置項(如分頁插件、邏輯刪除配置等)。
(2)MapperScannerConfigurer?的作用
  • MyBatis-Plus 使用?MapperScannerConfigurer?來掃描所有的 Mapper 接口。
  • 掃描到的每個 Mapper 接口都會被注冊為一個 Spring Bean,并與底層的 MyBatis 映射器綁定。
(3)SqlSessionTemplate?和?SqlSession?的初始化
  • Spring Boot 會創建?SqlSessionTemplate,它是 MyBatis 的核心組件之一,用于執行 SQL 語句。
  • SqlSessionTemplate?內部封裝了?SqlSession,并通過線程安全的方式管理數據庫連接。

2. MyBatis-Plus 的加載和初始化

MyBatis-Plus 在 Spring Boot 啟動時完成了自身的初始化工作,主要包括以下幾個方面:

(1)全局配置加載

MyBatis-Plus 會從配置文件中讀取全局配置項,例如:

  • 數據庫字段命名規則(駝峰命名或下劃線命名)。
  • 主鍵生成策略。
  • 字段自動填充策略。
  • 分頁插件、邏輯刪除插件等。

配置項通常通過 application.ymlapplication.properties 提供,例如:

yaml

mybatis-plus:global-config:db-config:table-underline: true  # 啟用駝峰命名規則id-type: auto          # 主鍵生成策略
(2)Mapper 接口的動態代理

MyBatis-Plus 會為每個 Mapper 接口生成動態代理對象。這些代理對象實現了接口中定義的方法,并通過 MyBatis 的底層機制執行 SQL 操作。

動態代理的核心邏輯:
  • 方法攔截:當調用 Mapper 接口中的方法時,動態代理會攔截調用,并根據方法簽名生成對應的 SQL 語句。
  • SQL 注入:如果啟用了自定義 SQL 注入器(如?InsertBatchSomeColumn),則會在啟動時將這些方法的 SQL 注入到 MyBatis 的?MappedStatement?中。
(3)SQL 方法的動態注入

MyBatis-Plus 提供了許多內置的通用方法(如 insertselectById 等),這些方法對應的 SQL 語句是在啟動時動態生成并注入到 MyBatis 的 MappedStatement 中的。

動態注入的過程:
  1. 掃描 Mapper 接口:MyBatis-Plus 會掃描所有的 Mapper 接口,并為其注冊默認的 SQL 方法。
  2. 生成 SQL 語句:對于每個方法,MyBatis-Plus 會根據方法簽名和實體類的元信息(如表名、字段名)動態生成 SQL 語句。
  3. 注入?MappedStatement:生成的 SQL 語句會被注入到 MyBatis 的?MappedStatement?中,供后續執行使用。
(4)插件的初始化

MyBatis-Plus 提供了許多內置插件(如分頁插件、邏輯刪除插件等),這些插件會在啟動時被初始化并注冊到 MyBatis 的攔截器鏈中。

常見插件:
  • 分頁插件(PaginationInterceptor):用于支持分頁查詢。
  • 邏輯刪除插件(LogicSqlInjector):用于支持邏輯刪除功能。
  • 性能分析插件(PerformanceInterceptor):用于分析 SQL 執行性能。

插件的初始化通常通過配置文件或代碼顯式注冊,例如:

@Bean
public PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();
}


3. 底層 MyBatis 的初始化

MyBatis 是 MyBatis-Plus 的底層框架,因此 MyBatis-Plus 的初始化也依賴于 MyBatis 的核心機制。以下是 MyBatis 的初始化過程:

(1)SqlSessionFactory?的創建
  • SqlSessionFactory?是 MyBatis 的核心組件,用于創建?SqlSession?對象。
  • 在 Spring Boot 中,SqlSessionFactory?通常通過?SqlSessionFactoryBean?創建。
初始化流程:
  1. 加載 MyBatis 配置文件:讀取?mybatis-config.xml?或通過 Java 配置類提供的配置項。
  2. 解析 Mapper XML 文件:如果存在 XML 格式的 Mapper 文件,MyBatis 會解析這些文件并將其中的 SQL 語句注冊到?MappedStatement?中。
  3. 創建?SqlSessionFactory?實例:完成上述步驟后,SqlSessionFactory?被創建并注入到 Spring 容器中。
(2)MapperRegistry?的初始化
  • MapperRegistry?是 MyBatis 的一個內部組件,用于管理所有的 Mapper 接口。
  • 在啟動時,MyBatis 會將所有的 Mapper 接口注冊到?MapperRegistry?中。
(3)Configuration?的初始化
  • Configuration?是 MyBatis 的核心配置對象,包含所有的全局配置項和映射信息。
  • 在啟動時,MyBatis 會初始化?Configuration?對象,并將所有的?MappedStatement、插件、類型處理器等注冊到其中。

4. 總結:工作原理及底層邏輯

以下是 Spring Boot 啟動時 MyBatis-Plus 的加載和初始化過程的總結:

  1. Spring Boot 自動配置

    • 加載?DataSource
    • 初始化?SqlSessionFactory
    • 掃描并注冊 Mapper 接口。
  2. MyBatis-Plus 的初始化

    • 加載全局配置項。
    • 動態生成并注入 SQL 方法。
    • 初始化插件(如分頁插件、邏輯刪除插件)。
  3. MyBatis 的底層初始化

    • 創建?SqlSessionFactory
    • 解析 Mapper XML 文件。
    • 初始化?MapperRegistry?和?Configuration
  4. 運行時行為

    • 當調用 Mapper 接口中的方法時,動態代理會攔截調用,并通過 MyBatis 的底層機制執行 SQL 操作。

MyBatis-Plus 在 Spring Boot 啟動時會完成實體類的基礎 SQL(如 SELECTINSERTUPDATEDELETE 等)的組裝和加載,并將這些 SQL 注冊到 MyBatis 的 Mapper 映射中。這個過程可以理解為 提前初始化好基礎 SQL,以便在運行時直接使用。

以下是詳細的分析和工作原理:


1. 基礎 SQL 的組裝

MyBatis-Plus 通過動態生成的方式,為每個實體類生成一組通用的基礎 SQL(即 CRUD 操作對應的 SQL)。這些 SQL 是基于實體類的注解(如 @TableName@TableField)以及全局配置(如字段命名規則、主鍵策略等)動態生成的。

(1)SQL 的生成邏輯

MyBatis-Plus 使用 AbstractMethod 類及其子類來定義每種 SQL 方法的生成邏輯。例如:

  • Insert?方法:生成插入語句(INSERT INTO table_name (column1, column2) VALUES (?, ?))。
  • SelectById?方法:生成根據主鍵查詢的語句(SELECT * FROM table_name WHERE id = ?)。
  • Update?方法:生成更新語句(UPDATE table_name SET column1 = ?, column2 = ? WHERE id = ?)。
  • Delete?方法:生成刪除語句(DELETE FROM table_name WHERE id = ?)。

這些方法的具體實現位于 com.baomidou.mybatisplus.core.injector.methods 包中。

(2)動態生成 SQL

MyBatis-Plus 會根據實體類的元信息(如表名、字段名、主鍵等)動態生成 SQL 語句。例如:

  • 如果實體類中有?@TableName("user")?注解,則生成的 SQL 中的表名為?user
  • 如果字段上有?@TableField("name")?注解,則生成的 SQL 中的字段名為?name
  • 如果啟用了駝峰命名規則(table-underline: true),則會自動將字段名從駝峰命名轉換為下劃線命名。

2. SQL 的注冊過程

生成的基礎 SQL 會被注冊到 MyBatis 的 MappedStatement 中,這是 MyBatis 的核心組件之一,用于存儲 SQL 語句及其映射信息。

(1)什么是?MappedStatement

MappedStatement 是 MyBatis 的一個內部對象,用于描述一條 SQL 語句的執行細節,包括:

  • SQL 語句本身。
  • 參數類型。
  • 返回值類型。
  • 執行器類型(如?SIMPLEREUSEBATCH)。
(2)SQL 注冊的流程

在 Spring Boot 啟動時,MyBatis-Plus 會完成以下步驟:

  1. 掃描 Mapper 接口:通過?@MapperScan?或?MapperScannerConfigurer?掃描所有的 Mapper 接口。
  2. 生成 SQL:為每個 Mapper 接口中的方法動態生成 SQL 語句。
  3. 注冊到?MappedStatement:將生成的 SQL 注冊到 MyBatis 的?Configuration?對象中,并與對應的?Mapper?方法綁定。
示例:

假設有一個實體類 User 和對應的 UserMapper

@TableName("user")
public class User {private Long id;private String name;
}public interface UserMapper extends BaseMapper<User> {
}

在啟動時,MyBatis-Plus 會為 UserMapper 注冊以下基礎 SQL:

  • SELECT * FROM user WHERE id = ?selectById?方法)
  • INSERT INTO user (id, name) VALUES (?, ?)insert?方法)
  • UPDATE user SET name = ? WHERE id = ?updateById?方法)
  • DELETE FROM user WHERE id = ?deleteById?方法)

這些 SQL 會被存儲在 MappedStatement 中,并與 UserMapper 的方法綁定。


3. 提前初始化的好處

MyBatis-Plus 的這種提前初始化機制有以下好處:

(1)性能優化
  • 減少運行時開銷:SQL 語句在啟動時就已經生成并注冊,運行時無需再動態生成 SQL,從而提高了執行效率。
  • 緩存復用MappedStatement?是 MyBatis 的緩存對象,同一 SQL 語句在多次調用時可以直接復用,避免重復解析。
(2)簡化開發
  • 零配置:開發者無需手動編寫 SQL 語句,MyBatis-Plus 會根據實體類自動生成基礎 SQL。
  • 統一管理:所有基礎 SQL 都由 MyBatis-Plus 統一生成和管理,減少了代碼冗余和潛在錯誤。
(3)靈活性
  • 可擴展性:如果需要自定義 SQL 方法,可以通過實現?AbstractMethod?或自定義?SqlInjector?來擴展功能。
  • 插件支持:MyBatis-Plus 的插件機制(如分頁插件、邏輯刪除插件)可以在 SQL 注冊過程中對生成的 SQL 進行增強或修改。

4. 動態代理與運行時行為

雖然基礎 SQL 在啟動時已經生成并注冊,但實際的 SQL 執行是由 MyBatis 的動態代理機制完成的。以下是運行時的行為:

(1)動態代理攔截

當調用 Mapper 接口中的方法時,MyBatis 的動態代理會攔截調用,并根據方法簽名找到對應的 MappedStatement

(2)參數綁定

MyBatis 會根據方法的參數類型和 SQL 中的占位符(?)進行參數綁定。例如:

java

User user = userMapper.selectById(1L);

在運行時,MyBatis 會將 1L 綁定到 SQL 中的 ?,生成最終的 SQL:

sql

SELECT * FROM user WHERE id = 1;

(3)執行 SQL

綁定參數后,MyBatis 會通過 SqlSession 執行 SQL,并返回結果。


5. 總結

  • SQL 的組裝:MyBatis-Plus 在啟動時會根據實體類的元信息動態生成基礎 SQL(如?SELECTINSERTUPDATEDELETE?等)。
  • SQL 的注冊:生成的 SQL 會被注冊到 MyBatis 的?MappedStatement?中,并與?Mapper?方法綁定。
  • 提前初始化的好處:這種方式減少了運行時的開銷,簡化了開發,并提供了良好的靈活性和擴展性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73552.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73552.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73552.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot中安全的設置阿里云日志SLS的accessKey

眾所周知,阿里云的服務都是基于accesskeyId和accesskeySecret來進行身份鑒權的,但唯獨日志因為需要寫入到.xml文件里對于accesskeyId和accesskeySecret需要進行一定程度的改進,尤其是使用了jasypt進行加密的參數傳遞進去logback.xml更是會遇到需要對參數進行解密的問題,而官網只…

關于解決Ubuntu終端及系統字體大小的問題

在Ubuntu中調整終端和系統字體大小可以通過以下方法&#xff08;可能不僅僅只是這幾種&#xff09;實現&#xff1a; 1. 調整系統字體大小 打開終端并輸入以下命令&#xff0c;安裝GNOME Tweaks&#xff0c;等待安裝完成&#xff1a; sudo apt install gnome-tweaks 接著進行…

Rust vs. Go: 性能測試(2025)

本內容是對知名性能評測博主 Anton Putra Rust vs. Go (Golang): Performance 2025 內容的翻譯與整理, 有適當刪減, 相關數據和結論以原作結論為準。 再次對比 Rust 和 Go&#xff0c;但這次我們使用的是最具性能優勢的 HTTP 服務器庫---Hyper&#xff0c;它基于 Tokio 異步運…

【NLP 48、大語言模型的神秘力量 —— ICL:in context learning】

目錄 一、ICL的優勢 1.傳統做法 2.ICL做法 二、ICL的發展 三、ICL成因的兩種看法 1.meta learning 2.Bayesian Inference 四、ICL要點 ① 語言模型的規模 ② 提示詞prompt中提供的examples數量和順序 ③ 提示詞prompt的形式&#xff08;format&#xff09; 五、fine-tune VS I…

兩數之和解題記錄

開始打算用一個數組保存差值&#xff0c;arr[target-nums[i]] i, 只要arr[nums[i]]有內容就能滿足target&#xff0c;返回arr[nums[i]]和i。但是會出現復數的情況&#xff0c;所以換成map。 換成map就只用一邊遍歷&#xff0c;一遍檢查和存入對應key就行了&#xff0c;value就…

P1722 矩陣Ⅱ - 洛谷

題源&#xff1a;P1722 矩陣 II - 洛谷 看了題目之后&#xff0c;需要注意的是&#xff1a; ①在1 ~ i 個格子中紅色數量 > 黑色數量 ②最后&#xff0c;在2 * n 個格子中&#xff0c;紅色數量 黑色數量 根據這兩個約束條件&#xff0c;可以知道&#xff0c;第一個格…

數據庫——MySQL基礎操作

一、表結構與初始數據 假設存在以下兩張表&#xff1a; 1. student 表 字段名數據類型描述idINT學生唯一標識符nameVARCHAR(100)學生姓名ageINT學生年齡sexVARCHAR(10)學生性別 初始數據&#xff1a; idnameagesex1張三20男2李四22女3王五21男 2. course 表 字段名數據類…

行業白皮書2025 | 益企研究院:AI時代的存儲基石

在當今科技飛速發展的時代&#xff0c;AI技術已成為推動各行業變革的關鍵力量。日前&#xff0c;益企研究院重磅發布《AI時代的存儲基石》白皮書。 下載方式&#xff1a;關注“渡江客涂鴉板”&#xff0c;回復st250326獲取免費下載地址 數據需求與技術挑戰&#xff1a; AI技術…

音視頻新人如何快速上手nginx-rtmp-module

一、整體設計架構 nginx-rtmp-module 是 Nginx 的一個擴展模塊&#xff0c;專門為 Nginx 添加了對 RTMP 協議的支持。其核心功能包括&#xff1a; RTMP推流&#xff08;publish&#xff09; RTMP拉流&#xff08;play&#xff09; 流轉發&#xff08;relay&#xff09; 流錄…

vue 封裝 Axios菜鳥教程

1、Axios依賴下載 $ npm install axios 2、以下鏈接為Axios 的api Axios 實例 | Axios中文文檔 | Axios中文網 3、 項目新建request.js&#xff0c;文件名稱按照駝峰命名法就可以 4、封裝request.js代碼如下 import axios from "axios"//創建axios實例&#xff0…

[項目]基于FreeRTOS的STM32四軸飛行器: 十一.MPU6050配置與讀取

基于FreeRTOS的STM32四軸飛行器: 十一.MPU6050 一.芯片介紹二.配置I2C三.編寫驅動四.讀取任務的測試五.MPU6050六軸數據的校準 一.芯片介紹 芯片應該放置在PCB中間&#xff0c;X Y軸原點&#xff0c;敏感度131表示范圍越小越靈敏。理想狀態放置在地面上X&#xff0c;Y&#xf…

iOS常見網絡框架

URLSession、Alamofire 和 Moya 1. URLSession 1.1 核心概念 URLSession 是 Apple 官方提供的網絡請求 API&#xff0c;封裝在 Foundation 框架中。它支持 HTTP、HTTPS、FTP 等協議&#xff0c;可用于&#xff1a; ? ? 普通網絡請求&#xff08;GET/POST&#xff09; ? …

AOA(到達角度)與TOA(到達時間)兩個技術的混合定位,MATLAB例程,自適應基站數量,三維空間下的運動軌跡,濾波使用UKF(無跡卡爾曼濾波)

本文介紹一個MATLAB代碼,實現了三維動態目標非線性定位與濾波系統,通過融合 到達角(AOA) 和 到達時間(TOA) 的混合定位方法,結合 無跡卡爾曼濾波(UKF) 處理非線性觀測模型,優化軌跡精度。代碼支持自適應基站數量配置,適用于復雜非線性場景的定位研究。 文章目錄 運行…

Ubuntu 重置密碼方法

目錄 修改過 root 密碼&#xff0c;重置密碼的方法沒改過 root 密碼?&#xff0c;重置密碼的方法 修改過 root 密碼&#xff0c;重置密碼的方法 Ubuntu 默認禁用root用戶&#xff0c;意思就是安裝好Ubuntu系統后&#xff0c;root用戶默認是沒有密碼的&#xff0c;普通用戶通過…

Leetcode 路徑總和 III

java 解法一&#xff1a;雙遞歸 class Solution {public int pathSum(TreeNode root, long targetSum) { //外層遞歸,把每個節點都當作路徑起點if(root null) return 0;int ret rootSum(root, targetSum);ret pathSum(root.left, targetSum);ret pathSum(root.right, targ…

WEB安全--SQL注入--利用log寫入webshell

一、原理&#xff1a; 這也是對之前文章的補充&#xff1a;WEB安全--SQL注入--INTO OUTFILE-CSDN博客 我們可以通過修改MySQL的log文件&#xff0c;用select關鍵字寫入木馬文件放在服務器物理地址中&#xff0c;通過訪問物理地址getshell。 二、條件&#xff1a; 用戶有寫入權限…

C++11中引入的比較常用的新特性講解(上)

目錄 1、C11簡介 2、統一的列表初始化 2.1、&#xff5b;&#xff5d;初始化 2.2、std::initializer_list 3、變量類型推導 3.1、auto 3.2、decltype 3.3、nullptr 4、范圍for循環 5、STL中一些變化 6、右值引用和移動語義 6.1、左值引用和右值引用 6.2、右值引用…

hugo+github pages 部署實驗室網站

&#xff01;&#xff01;太爽了&#xff0c;看了很久教程&#xff0c;自己試了好久&#xff0c;終于搞懂怎么把hugo和public單獨進行部署了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 目的是什么&#xff1f;目的當然是為了修改這天殺的hugo的模板。現在…

兩頭文件互引問題解決(前置聲明)

問題&#xff1a; 想必正在基礎階段學習的朋友們都遇見過以下問題吧 widget.h otherwidget.h 如上問題是&#xff0c;我在widget.h中引用了otherwidget.h ,在ohterwidget中又引用了widget.h&#xff0c;兩個頭文件互相引用產生了報錯 解決辦法&#xff1a; 那么我們該如何解…

Python 異常處理完全指南

目錄 一、異常處理基礎1. 基本語法結構 二、常見異常類型1. 內置異常層次2. 常見異常示例 三、多重異常處理1. 合并捕獲2. 分層處理 四、finally與else子句1. finally 應用場景2. else 使用技巧 五、自定義異常1. 創建異常類2. 異常繼承體系 六、異常鏈與上下文1. raise from 語…