mybatis vs mybatis-plus

?

? ?

??核心關系:?? MyBatis-Plus ??不是?? MyBatis 的替代品,而是構建在 MyBatis ??之上??的一個強大的??增強工具包??。它完全兼容原生 MyBatis,并在其基礎上提供了大量開箱即用的功能,極大地簡化了開發,尤其是單表操作。


??一、 MyBatis 核心原理??

MyBatis 的核心思想是將 ??SQL 語句從 Java 代碼中解耦??,通過配置或注解來管理 SQL,并提供靈活的 ORM 映射。其核心原理圍繞以下幾個關鍵組件和流程:

  1. ??SqlSessionFactoryBuilder & SqlSessionFactory:??

    • ??作用:?? 應用啟動時,讀取 MyBatis 的全局配置文件 (mybatis-config.xml) 和所有的 Mapper XML 文件(或注解配置)。
    • ??原理:?? SqlSessionFactoryBuilder 解析這些配置文件,構建出包含所有配置信息(數據源、事務管理器、類型處理器、插件、Mapper 注冊信息等)的 Configuration 對象,并最終創建出 SqlSessionFactorySqlSessionFactory 是生產 SqlSession 的工廠。
  2. ??SqlSession:??

    • ??作用:?? 代表一次與數據庫的會話。它是 MyBatis 工作的??核心入口??。
    • ??原理:?? 通過 SqlSessionFactory.openSession() 獲取。它提供了執行 SQL 命令(selectOne, selectList, insert, update, delete)、獲取 Mapper 接口代理對象、管理事務等方法。每個 SqlSession 通常對應一個數據庫連接(或連接池中的一個連接)。
  3. ??Executor:??

    • ??作用:?? SqlSession 內部真正??執行 SQL 操作??的組件。
    • ??原理:?? SqlSession 將請求委托給 ExecutorExecutor 負責維護一級緩存(SqlSession 級別)、處理延遲加載、調用 StatementHandler 等。常見的實現有 SimpleExecutor(每次執行創建新 Statement)、ReuseExecutor(重用 Statement)、BatchExecutor(批處理)。
  4. ??StatementHandler:??

    • ??作用:?? 負責??創建 JDBC Statement 對象??(PreparedStatement, CallableStatement, Statement),并??設置參數??、??執行 SQL??。
    • ??原理:?? Executor 調用 StatementHandler。它使用 ParameterHandler 將 Java 對象參數設置到 SQL 的占位符 (?) 上。
  5. ??ParameterHandler:??

    • ??作用:?? 負責將??用戶傳入的 Java 參數??,按照 SQL 語句中的占位符 (?) 進行??類型轉換和設置??。
    • ??原理:?? 利用注冊的 TypeHandler 完成 Java 類型到 JDBC 類型的轉換。
  6. ??TypeHandler:??

    • ??作用:?? 負責 ??Java 類型和 JDBC 類型之間的相互轉換??。
    • ??原理:?? MyBatis 內置了常用類型(如 String, Integer, Date 等)的處理器。用戶可以自定義處理器處理特殊類型(如枚舉)。
  7. ??ResultSetHandler:??

    • ??作用:?? 負責將 JDBC ResultSet 返回的結果集??轉換??為??指定的 Java 對象??(單個對象、List、Map 等)。
    • ??原理:?? 根據 Mapper 方法定義的返回類型(或 resultMap 配置),利用 TypeHandler 和反射,將結果集的每一行數據映射成 Java 對象。
  8. ??MappedStatement:??

    • ??作用:?? 代表一個映射的 SQL 語句。它是 MyBatis 配置的核心單元。
    • ??原理:?? 存儲了 SQL 語句本身(<select>, <insert> 等標簽的內容)、參數映射信息 (<parameterMap>@Param)、結果映射信息 (<resultMap>@Result)、SQL 命令類型(SELECT/INSERT 等)、緩存配置等。一個 Mapper 接口方法對應一個 MappedStatement
  9. ??配置方式:??

    • ??XML 配置:?? 主要方式。通過 mybatis-config.xml 配置全局設置,通過 Mapper.xml 文件定義 SQL 和映射關系。
    • ??注解配置:?? 在 Mapper 接口方法上使用 @Select, @Insert, @Update, @Delete, @Results 等注解直接編寫 SQL 和映射規則。通常用于簡單 SQL。

??MyBatis 工作流程總結:??

  1. 應用啟動:解析配置 -> 構建 Configuration -> 創建 SqlSessionFactory
  2. 業務請求:SqlSessionFactory -> 創建 SqlSession
  3. 執行操作:
    • 通過 SqlSession 直接執行 SQL 方法 (selectOne, update 等)。
    • 或通過 SqlSession.getMapper() 獲取 Mapper 接口的??動態代理對象??。
  4. 代理對象調用:代理對象根據方法名找到對應的 MappedStatement
  5. Executor 執行:Executor 根據 MappedStatement 信息,調用 StatementHandler 創建 Statement
  6. ParameterHandler 設置參數。
  7. StatementHandler 執行 SQL。
  8. ResultSetHandler 處理結果集,映射為 Java 對象。
  9. 返回結果。

??優點:?? 靈活、SQL 可控性強、與 JDBC 解耦、支持復雜映射、插件擴展性強。
??缺點:?? 需要編寫大量 SQL 和 XML/注解(尤其是簡單 CRUD)、配置繁瑣。


??二、 MyBatis-Plus (MP) 核心原理??

MP 的核心原理是在 ??MyBatis 原有架構和機制的基礎上??,通過一系列封裝、擴展和自動化技術,??極大地簡化單表操作和常用功能開發??。它沒有改變 MyBatis 的核心流程,而是增強了它。

  1. ??核心增強點:BaseMapperSqlInjector / AbstractMethod??

    • ??原理:?? MP 的核心創新。用戶 Mapper 接口只需繼承 BaseMapper。在應用啟動時,MP 的 SqlInjector (如 DefaultSqlInjector) 會掃描這些 Mapper。
    • ??動態 SQL 生成:?? 對于 BaseMapper 中的每個方法(insert, selectById, update 等),MP 都有一個對應的 AbstractMethod 子類(如 Insert, SelectById, Update)。這些子類在啟動時,利用實體類的元數據 (TableInfo,由 @TableName, @TableId 等注解解析而來) 和預定義的 SQL 模板 (SqlMethod),??動態生成??該方法的完整 SQL 語句和 MappedStatement 對象,并注冊到 MyBatis 的 Configuration 中。
    • ??結果:?? 開發者無需為這些通用方法編寫任何 SQL 或 XML,MP 自動提供實現。
  2. ??強大的條件構造器 (Wrapper)??

    • ??原理:?? 提供 QueryWrapper, UpdateWrapper, LambdaQueryWrapper 等。用戶通過鏈式調用構建復雜的查詢/更新條件(eq, like, between, set 等)。
    • ??SQL 拼接:?? Wrapper 內部將條件表達式存儲為結構化的數據。當 Wrapper 被用于查詢或更新方法時,MP 的 SQL 生成引擎會安全地(防止 SQL 注入)將這些條件??解析并拼接到自動生成的基礎 SQL 的 WHERE 子句或 SET 部分??。
  3. ??自動配置與 Starter (Spring Boot)??

    • ??原理:?? 提供 mybatis-plus-boot-starter。利用 Spring Boot 自動配置機制,自動創建和配置 DataSource, SqlSessionFactoryBean(注入 MP 的核心組件如 GlobalConfig, Interceptor), MapperScannerConfigurer 等,大大簡化了集成步驟。
  4. ??插件體系增強??

    • ??原理:?? 繼承并擴展 MyBatis 的 Interceptor 接口,提供功能更強大、開箱即用的內置插件:
      • PaginationInnerInterceptor: 自動處理物理分頁(生成 COUNT 查詢和分頁 SQL)。
      • OptimisticLockerInnerInterceptor: 自動實現樂觀鎖(基于 @Version 注解)。
      • BlockAttackInnerInterceptor: 防止全表更新/刪除(安全防護)。
      • DynamicTableNameInnerInterceptor: 動態表名。
      • IllegalSQLInnerInterceptor: SQL 性能分析/阻止惡意 SQL。
    • ??工作方式:?? 這些插件在 MyBatis 的執行流程(主要是 Executor 階段)進行攔截,添加額外功能。
  5. ??全局配置與元數據處理??

    • GlobalConfig: 存儲全局配置(表前綴、主鍵生成器策略、元對象處理器等)。
    • MetaObjectHandler: 實現??自動填充??功能(@TableField(fill = ...))。在插入或更新時,通過反射自動填充字段(如 createTime, updateTime)。
  6. ??注解驅動增強??

    • ??原理:?? 在 MyBatis 注解基礎上,提供更豐富的 ORM 和功能注解:
      • @TableName: 指定表名。
      • @TableId: 指定主鍵及策略(自增、UUID、雪花ID等)。
      • @TableField: 指定字段映射、自動填充策略、是否存在等。
      • @Version: 樂觀鎖版本字段。
      • @EnumValue: 枚舉值映射。
      • @TableLogic: 邏輯刪除標記。
      • @SqlParser: 過濾 SQL 解析(用于跳過某些攔截器)。
    • 這些注解信息在啟動時被解析并存儲在 TableInfo 等元數據對象中,供 SQL 生成、條件構造、插件等使用。

??MP 工作流程總結:??

  1. ??啟動階段:??
    • 自動配置(Spring Boot Starter)。
    • 掃描實體類注解,構建 TableInfo 等元數據。
    • 掃描 Mapper 接口(繼承 BaseMapper)。
    • SqlInjectorBaseMapper 的每個方法注入對應的 AbstractMethod 實現。
    • AbstractMethod 子類利用元數據和 SQL 模板,動態生成 MappedStatement 并注冊。
    • 配置并添加 MP 的內置插件到 InterceptorChain
  2. ??運行時階段:??
    • 與原生 MyBatis 流程基本相同(SqlSession -> Executor -> ...)。
    • 當調用 BaseMapper 方法時,執行的是 MP 動態生成的 MappedStatement
    • 當使用 Wrapper 時,MP 在生成 SQL 時會解析并拼接 Wrapper 的條件。
    • MP 的插件在相應執行點進行攔截,提供分頁、樂觀鎖等功能。

??優點:?? 極大簡化 CRUD、減少 SQL/XML 編寫、內置強大功能(分頁、代碼生成器、樂觀鎖、邏輯刪除等)、增強條件構造、提高開發效率。
??缺點:?? 對復雜 SQL 和多表關聯查詢的支持不如直接手寫 SQL/XML 靈活(雖然也能用),需要學習 MP 特有的 API 和注解。


??三、 MyBatis vs MyBatis-Plus 核心對比總結??

特性MyBatisMyBatis-Plus (MP)說明
??定位??靈活的 SQL 映射框架MyBatis 的增強工具包MP 基于 MyBatis,不是替代品。
??核心目標??SQL 與代碼解耦,靈活控制 SQL??簡化開發??,尤其是單表 CRUDMP 專注于減少樣板代碼。
??SQL 編寫????必需?? (XML 或注解)??可選?? (對單表 CRUD 自動生成)MP 的 BaseMapper 自動提供通用方法實現。復雜 SQL 仍需手寫。
??CRUD 實現??手動編寫每個 CRUD 方法的 SQL 和映射??自動實現?? BaseMapper 中的通用 CRUD 方法MP 的核心優勢,省去大量簡單 SQL 編寫。
??條件構造??手動拼接 SQL 條件字符串 (易錯,不安全)強大的 ??Wrapper API?? (鏈式調用,類型安全 - LambdaWrapper,防注入)MP 提供面向對象的、安全的條件構建方式。
??分頁??需手動編寫分頁 SQL (不同數據庫語法不同)內置 ??PaginationInterceptor?? (自動物理分頁)MP 的分頁插件自動處理不同數據庫方言、COUNT 查詢和數據獲取。
??主鍵生成??需在 SQL 或配置中處理支持多種策略 (@TableId),內置分配器 (雪花ID等)MP 簡化了主鍵管理。
??邏輯刪除??需手動在 SQL 中添加條件內置支持 (@TableLogic),自動添加過濾條件MP 自動在查詢/更新中處理邏輯刪除字段。
??樂觀鎖??需手動實現版本控制邏輯內置支持 (@Version),通過插件自動處理MP 簡化了樂觀鎖實現。
??自動填充??需手動在代碼中設置內置支持 (@TableField(fill) + MetaObjectHandler)MP 自動填充如創建時間、更新時間等字段。
??代碼生成器??無官方提供,需用第三方或自研提供功能強大的 ??代碼生成器??MP 可快速生成 Entity, Mapper, Service, Controller 等基礎代碼。
??安全防護??無內置提供 ??BlockAttackInnerInterceptor?? 等安全插件MP 防止全表更新/刪除等危險操作。
??配置復雜度??相對較高 (需配置較多 XML/注解)??顯著降低?? (尤其結合 Spring Boot Starter)MP 的自動配置和默認行為減少了大量配置。
??學習曲線??掌握 SQL/XML 映射和核心組件即可需額外學習 MP 特有的 API (Wrapper, BaseMapper), 注解和插件MP 增加了自己的抽象層。
??靈活性????極高??,完全掌控 SQL對單表操作靈活,對??復雜 SQL/多表?? 靈活性相對降低MP 處理復雜場景時,有時仍需回退到原生 MyBatis 方式 (手寫 SQL/XML)。
??適用場景??需要極致 SQL 控制、復雜查詢、存儲過程調用快速開發、大量單表操作、需要內置功能 (分頁/樂觀鎖等)兩者并非互斥,可在同一項目中結合使用。

??總結:??

  • ??MyBatis:?? 是??基礎??,提供了靈活、強大的 SQL 映射能力,將開發者從 JDBC 的繁瑣中解放出來,但需要編寫大量 SQL 和配置。
  • ??MyBatis-Plus:?? 是??增強??,在 MyBatis 的基礎上,通過自動化生成、強大的條件構造器、豐富的內置功能(分頁、代碼生成、樂觀鎖等)和便捷的配置(特別是 Spring Boot),??極大地提升了開發效率,尤其擅長處理單表操作??。它保留了 MyBatis 的靈活性,對于復雜場景,你仍然可以像使用原生 MyBatis 一樣編寫自定義 SQL。

??選擇建議:??

  • 如果你的項目有??大量簡單的單表 CRUD 操作??,追求??開發效率??,且需要??分頁、樂觀鎖??等常見功能,??MyBatis-Plus 是絕佳選擇??。
  • 如果你的項目??極其復雜??,涉及大量??定制化 SQL、存儲過程、復雜的多表關聯和嵌套查詢??,或者你對 SQL 有??絕對的控制欲??,??原生 MyBatis 可能更合適??(或者結合使用,復雜部分用原生)。
  • ??實際項目中,兩者結合使用非常常見:?? 簡單 CRUD 用 MP 的 BaseMapperWrapper,復雜查詢或存儲過程調用則使用原生 MyBatis 的 XML 或注解方式編寫 SQL。MP 的 @SqlParser(filter=true) 可以讓你在同一個 Mapper 中混合使用這兩種方式。

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

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

相關文章

2025膠水分裝機服務商技術解析:聚焦高精度、智能化應用

膠水作為電子組裝、新能源電池、醫療器械、消費類電子產品等關鍵環節中的核心材料&#xff0c;其生產、儲存與分裝過程對精度、潔凈度和一致性的要求日益嚴苛。在這一背景下&#xff0c;膠水分裝機及分裝服務商正從傳統的設備供應商向“工藝裝備數據服務”的綜合解決方案提供者…

v-model是怎么實現的,語法糖到底是什么

1&#xff1a;作用在表單元素上實際上就是2&#xff1a;作用在自定義組件上&#xff0c;vue2和vue3不同 vue2&#xff1a; v-model相當于名為value 的 prop和名為 input 的事件 在父組件中 <child v-model"message"></child> //相當于&#xff1a; <…

學習筆記:Javascript(5)——事件監聽(用戶交互)

事件監聽&#xff1a;用戶交互的核心機制在前端開發中&#xff0c;事件監聽是處理用戶交互的基礎機制。它允許我們檢測用戶的操作&#xff08;如點擊、輸入、滾動等&#xff09;并執行相應的代碼&#xff0c;讓網頁從靜態變為動態。一、事件與事件監聽的基本概念事件&#xff0…

在Linux系統中清理大文件的方法

在Linux系統的日常運維管理過程中&#xff0c;磁盤空間問題是一個非常常見且棘手的難題。隨著系統運行時間的增加&#xff0c;日志文件、臨時文件、緩存文件以及用戶產生的數據會不斷增長。如果缺乏及時的監控和清理&#xff0c;大文件往往會迅速占滿磁盤&#xff0c;導致系統性…

使用x64dbg分析調試windows可執行程序

引言 當我們僅有一個C/C等編譯的可執行程序&#xff08;windows 上的 exe 文件&#xff09;&#xff0c;而沒有源碼時我們應該怎么分析調試該可執行程序呢&#xff1f;我們可以通過動態分析或靜態分析的方式達成我們的目的&#xff0c;當然比較有效的方案當然是靜態分析結合動態…

在Windows 11上配置Cursor IDE進行Java開發

前言 Cursor IDE是一款基于VSCode的AI編程助手&#xff0c;集成了強大的AI功能&#xff0c;能夠顯著提升Java開發效率。本文詳細介紹如何在Windows 11系統上安裝和配置Cursor IDE&#xff0c;使其成為高效的Java開發環境。 1. Windows 11上安裝Cursor IDE 1.1 下載和安裝步驟…

字符串-43.字符串相乘-力扣(LeetCode)

一、題目解析 1、計算乘積后&#xff0c;將結果也按字符串返回 2、字符串長度在[1&#xff0c;200] 二、算法原理 為了方便字符串計算&#xff0c;我們將其逆置&#xff0c;符合我們的計算需求&#xff0c;"123"將變為"321" 解法1&#xff1a;模擬小學…

鴻蒙HAP包解包、打包、簽名及加固全流程解析

在鴻蒙應用開發過程中&#xff0c;HAP&#xff08;HarmonyOS Ability Package&#xff09;包的解包、打包、簽名以及加固是開發者們繞不開的重要環節。今天&#xff0c;就讓我們深入探討這一全流程&#xff0c;幫助大家更好地理解和掌握相關操作。 一、HAP解包 解包是分析和修…

PyTorch之張量創建與運算

PyTorch 主要有以下幾個基礎概念&#xff1a;張量&#xff08;Tensor&#xff09;、自動求導&#xff08;Autograd&#xff09;、神經網絡模塊&#xff08;nn.Module&#xff09;、優化器&#xff08;optim&#xff09;等。張量&#xff08;Tensor&#xff09;&#xff1a;PyTo…

數據 儲存

文件儲存 網頁版爬蟲數據庫 &#xff1a; https://spidertools.cn/#/crypto TEXT 文本儲存 可以使用記事本打開 r #讀取。 r #讀寫&#xff0c;文件指針放在文件的開頭。 w #寫入&#xff0c;覆蓋原文件。 w #讀寫&#xff0c;覆蓋原文件。 a #附加。 a #讀寫&…

Flask 博客系統(Flask Blog System)

目標&#xff1a;零基礎也能從頭搭建一個支持文章管理、評論、分類標簽、搜索、用戶登錄的博客系統 技術棧&#xff1a;Flask SQLite SQLAlchemy Jinja2 HTML/CSS Flask-Login 開發工具&#xff1a;VSCode 學習重點&#xff1a;MVC 模式、數據庫操作、會話管理、表單處理一…

基于RFID技術的寵物自動喂食器方案

一、背景 寵物已經成為現代人生活中不可或缺的一部分&#xff0c;隨著養寵物的人越來越多&#xff0c;寵物的數量也越來越多&#xff0c;有些家庭甚至養了兩只以上的貓狗或者貓狗混養&#xff0c;寵物間的管理問題也越來越突出&#xff0c;如寵物之間的搶食行為&#xff0c;易…

conda常見問題

文章目錄run "conda init" before "conda activate"打開PowerShell自動進入base環境&#xff08;cmd沒有這個問題&#xff09;run “conda init” before “conda activate” 在使用conda命令創建env后使用conda activate命令&#xff0c;出現"run ‘…

第5章 HTTPS與安全配置

5.1 HTTPS概述 5.1.1 為什么需要HTTPS 數據加密:保護傳輸中的敏感數據 身份驗證:確認服務器身份的真實性 數據完整性:防止數據在傳輸過程中被篡改 SEO優勢:搜索引擎優先排名HTTPS網站 瀏覽器要求:現代瀏覽器對HTTP網站顯示不安全警告 合規要求:許多行業標準要求使用HTTP…

Java入門級教程17——利用Java SPI機制制作驗證碼、利用Java RMI機制實現分布式登錄驗證系統

目錄 1.制作驗證碼——java SPI機制 1.1 類所屬包情況 1.2 具體實現 1.2.1 核心接口&#xff1a;ICode 1.2.2 接口實現類&#xff1a;驗證碼的具體生成邏輯 1.2.3 服務工廠類&#xff1a;CodeServiceFactory&#xff08;核心&#xff1a;SPI 服務發現&#xff09; 1.2.…

ES6筆記5

1. Promise相當于一個容器&#xff0c;保存著未來才要結束的事件&#xff08;異步操作&#xff09;的一個結果&#xff0c;各種異步操作都可以用同樣方法處理 axios特點&#xff1a;對象的狀態不受外界影響&#xff0c;處理異步操作&#xff0c;3個狀態&#xff0c;Pending&…

解決idea2021maven依賴導入后還是找不到包,爆紅無法導入

1.依賴導入后pom.xml文件以及Maven,此兩處代碼還是爆紅 2.解決方法 由技術大佬同事幾分鐘解決,他記憶深刻之前搞過很久,一看就知道哪里出問題了 我之前是配過Maven的本地倉庫的但是沒有用,這次出問題之后長教訓了,技術大佬說盡量用自己的本地倉庫,不要用idea的Maven倉庫,容易…

【硬件-筆試面試題-81】硬件/電子工程師,筆試面試題(知識點:詳細講講同步時鐘與異步時鐘通信)

題目匯總版--鏈接&#xff1a; 【硬件-筆試面試題】硬件/電子工程師&#xff0c;筆試面試題匯總版&#xff0c;持續更新學習&#xff0c;加油&#xff01;&#xff01;&#xff01;-CSDN博客 【硬件-筆試面試題-81】硬件/電子工程師&#xff0c;筆試面試題&#xff08;知識點…

php計算一個模擬增長過程函數

private function calculateGrowth($progress) {// 使用多個增長階段模擬不均勻性if ($progress < 0.3) {// 前30%時間&#xff1a;緩慢增長 30 %return pow($progress / 0.3, 0.7) * 0.3;} elseif ($progress < 0.7) {// 中間40%時間&#xff1a;快速增長 50%return 0.3…

華為USG6000v2 NAT模式下IPSEC IKE V1 實驗

USG6000v2 NAT模式下IPSEC 實驗 拓撲圖公網配置OSPF路由協議&#xff08;網絡要求能通就行&#xff09; 一、 總部配置 &#xff08;一&#xff09;交換機配置 1、 總部交換機到防火墻網段 192.168.10.0/24 2、 交換機G0/0設置成access端口劃分vlan 10&#xff0c;網關 192.168…