全面解析 Mybatis 與 Mybatis-Plus:深入原理、實踐案例與高級特性對比

全面解析 Mybatis 與 Mybatis-Plus:深入原理、實踐案例與高級特性對比 🚀

  • 前言
  • 一、基礎介紹 ?
    • 1. Mybatis 簡介 🔍
    • 2. Mybatis-Plus 簡介 ?
  • 二、核心區別與高級特性對比 🔎
    • 1. 開發模式與配置管理
    • 2. 功能豐富度與擴展性
    • 3. 自動填充與邏輯刪除
    • 4. 性能監控與安全防護
  • 三、實戰案例:構建用戶管理系統與進階功能演示 📚
    • 1. 案例一:基于 Mybatis 的用戶管理系統
    • 2. 案例二:基于 Mybatis-Plus 的用戶管理系統與進階功能
  • 四、綜合對比與實踐中的注意事項 🎯
    • 1. 選擇依據
    • 2. 開發實踐建議
  • 五、總結 🌟


前言

在 Java 后端開發中,數據持久層始終是關鍵模塊。如何既保證 SQL 調優的靈活性,又能提高開發效率,是眾多開發者關注的焦點。本文將從基礎介紹開始,全面解析 MybatisMybatis-Plus 的各個方面,包括工作原理、常見使用場景、詳細實例、進階特性、插件支持以及最佳實踐,幫助你在項目中做出更明智的選擇。讓我們一起開始這段干貨滿滿的技術之旅吧!💡

在這里插入圖片描述


一、基礎介紹 ?

1. Mybatis 簡介 🔍

Mybatis 是一款輕量級的 ORM 框架,它主要通過 XML 或注解方式將 SQL 語句與 Java 對象進行映射,具備以下特點:

  • 高度靈活

    開發者可以自定義 SQL,實現復雜查詢及數據庫操作。

  • 精細控制

    通過 XML 映射文件管理 SQL 與實體類之間的關系,充分掌控底層細節。

  • 低侵入性

    只關注數據庫交互部分,業務邏輯完全由開發者掌控。

工作原理

  1. 映射配置:在 XML 文件或注解中定義 SQL 語句與參數映射。

  2. SqlSession 管理:通過 SqlSession 獲取 Mapper 接口,完成數據庫 CRUD 操作。

  3. 動態 SQL:支持動態 SQL 構建,便于處理復雜查詢條件。

示例:Mybatis XML 配置

<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper"><select id="getUserById" resultType="com.example.entity.User">SELECT id, name, age FROM user WHERE id = #{id}</select>
</mapper>

雖然這種方式靈活、透明,但當項目中涉及大量 SQL 時,XML 文件的編寫和維護會變得相對繁瑣。😓

2. Mybatis-Plus 簡介 ?

Mybatis-Plus 是在 Mybatis 基礎上的增強工具包,旨在極大地簡化開發流程,提高生產力。其主要特點包括:

  • 自動 CRUD

    內置 BaseMapper 接口,封裝常用增刪改查操作,省去重復編寫 SQL。

  • 代碼生成器

    通過代碼生成快速構建實體類、Mapper 接口和 XML 映射文件。

  • 條件構造器

    提供鏈式調用方式構建查詢條件(包括 Lambda 表達式方式),書寫清晰直觀。

  • 內置插件

    包括分頁插件、性能分析插件、樂觀鎖、邏輯刪除等常用功能。

  • 自動填充字段

    支持創建時間、修改時間等字段的自動填充,簡化開發流程。

工作原理

  1. 自動封裝:根據實體類和注解生成常用 SQL 語句,無需重復編寫。

  2. 插件機制:通過插件擴展查詢、更新、分頁等功能,適應不同場景需求。

  3. 靈活擴展:支持自定義 SQL 和擴展方法,既滿足快速開發又不失定制化能力。

示例:Mybatis-Plus 實體類與 Mapper 接口

// User.java
@Data
@TableName("user")
public class User {private Long id;private String name;private Integer age;
}// UserMapper.java
public interface UserMapper extends BaseMapper<User> {// 自定義方法示例:通過名字模糊查詢用戶List<User> selectByName(@Param("name") String name);
}

在 Spring Boot 項目中,只需簡單配置數據源和包掃描即可快速啟動應用。😊

二、核心區別與高級特性對比 🔎

1. 開發模式與配置管理

  • Mybatis

    • 配置方式:依賴 XML 或注解完成映射,代碼與 SQL 分離,靈活但冗長。😅

    • 維護難度:每個實體或查詢都需要單獨配置,項目規模擴大時維護成本較高。

  • Mybatis-Plus

    • 約定優于配置:自動生成常用 SQL,極大減少了 XML 文件數量。💡

    • 自動化支持:內置自動 CRUD、分頁和插件機制,使得配置更簡潔、開發更高效。🚀

2. 功能豐富度與擴展性

  • Mybatis

    • 功能聚焦于 SQL 映射與執行,靈活定制性強,適合對 SQL 有極高要求的場景。

    • 支持動態 SQL,復雜業務邏輯處理能力突出。🔥

  • Mybatis-Plus

    • 自動 CRUD:BaseMapper 內置方法(如 selectByIdinsert 等)極大降低代碼重復率。

    • 條件構造器:提供 QueryWrapperLambdaQueryWrapper,使用鏈式調用構建查詢條件更加直觀。

    • 插件體系:分頁插件、樂觀鎖插件、性能分析插件等一應俱全,支持日志打印 SQL 執行時間,便于性能調優。😊

    示例:使用 Lambda 查詢構造器

    // 查詢名字中包含 "張" 的用戶,年齡大于 20
    List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().like(User::getName, "張").gt(User::getAge, 20)
    );
    

3. 自動填充與邏輯刪除

  • Mybatis-Plus 自動填充

    • 支持在插入或更新數據時自動填充常用字段(如 createTimeupdateTime)。

    • 通過自定義 MetaObjectHandler 實現字段自動更新,降低出錯概率。

    示例:自動填充配置

    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", Timestamp.class, new Timestamp(System.currentTimeMillis()));this.strictInsertFill(metaObject, "updateTime", Timestamp.class, new Timestamp(System.currentTimeMillis()));}@Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", Timestamp.class, new Timestamp(System.currentTimeMillis()));// 強行更新updateTime// this.setFieldValByName("updateTime", new Timestamp(System.currentTimeMillis()), metaObject);}
    }
    
  • 邏輯刪除

    • Mybatis-Plus 支持通過配置實現邏輯刪除,數據不會真正從數據庫刪除,只是狀態標記為已刪除,更便于數據恢復和審計。

    • 只需在實體類上使用 @TableLogic 注解即可。

    示例:邏輯刪除字段配置

    @Data
    @TableName("user")
    public class User {private Long id;private String name;private Integer age;@TableLogicprivate Integer deleted;
    }
    

4. 性能監控與安全防護

  • 性能分析插件

    • Mybatis-Plus 內置性能分析插件可幫助開發者在開發環境下檢測 SQL 執行效率,提前發現慢查詢問題。

    • 插件能夠打印 SQL 語句及其執行時間,便于調優。😊

  • SQL 注入防護

    • 雖然 Mybatis 本身不會對 SQL 注入提供自動防護,但 Mybatis-Plus 在使用條件構造器時,通過參數化查詢一定程度上降低了 SQL 注入風險。👍

三、實戰案例:構建用戶管理系統與進階功能演示 📚

下面將通過兩個案例,分別展示使用 Mybatis 與 Mybatis-Plus 實現用戶管理系統的基本功能和進階特性。

1. 案例一:基于 Mybatis 的用戶管理系統

  • 環境配置與依賴

    • 依賴引入:在 Maven 中添加 Mybatis、Spring Boot、數據庫驅動等依賴。

    • 配置文件:在 application.yml 中配置數據源和 Mybatis 映射文件路徑。

    spring:datasource:url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8username: rootpassword: 123456
    mybatis:mapper-locations: classpath*:mapper/*.xml
    
  • Mapper XML 文件

    <!-- UserMapper.xml -->
    <mapper namespace="com.example.mapper.UserMapper"><select id="getUserById" resultType="com.example.entity.User">SELECT id, name, age FROM user WHERE id = #{id}</select><insert id="insertUser" parameterType="com.example.entity.User">INSERT INTO user(name, age) VALUES(#{name}, #{age})</insert><update id="updateUser" parameterType="com.example.entity.User">UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}</update><delete id="deleteUser" parameterType="Long">DELETE FROM user WHERE id = #{id}</delete>
    </mapper>
    
  • Service 與 Controller 層代碼

    @Service
    public class UserService {@Autowiredprivate UserMapper userMapper;public User getUserById(Long id) {return userMapper.getUserById(id);}public void createUser(User user) {userMapper.insertUser(user);}public void updateUser(User user) {userMapper.updateUser(user);}public void deleteUser(Long id) {userMapper.deleteUser(id);}
    }@RestController
    @RequestMapping("/user")
    public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public User getUser(@PathVariable Long id) {return userService.getUserById(id);}@PostMapping("/")public String createUser(@RequestBody User user) {userService.createUser(user);return "創建成功!";}
    }
    

該案例展示了 Mybatis 靈活的映射機制,但隨著業務復雜度增加,XML 文件和手動配置也會逐步增多。😓

2. 案例二:基于 Mybatis-Plus 的用戶管理系統與進階功能

  • 環境配置與依賴

    • 依賴引入:在 Maven 中添加 Mybatis-Plus Starter 及 Spring Boot 依賴。

    • 配置文件:基本與 Mybatis 類似,但無需編寫大量 XML 文件。

    spring:datasource:url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8username: rootpassword: 123456
    mybatis-plus:mapper-locations: classpath*:mapper/*.xml
    
  • 實體類、Mapper 與自動填充

    // User.java@Data@TableName("user")public class User {private Long id;private String name;private Integer age;@TableLogicprivate Integer deleted;@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;}// MyMetaObjectHandler.java@Componentpublic class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", Timestamp.class, new Timestamp(System.currentTimeMillis()));this.strictInsertFill(metaObject, "updateTime", Timestamp.class, new Timestamp(System.currentTimeMillis()));}@Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", Timestamp.class, new Timestamp(System.currentTimeMillis()));// 強行更新updateTime// this.setFieldValByName("updateTime", new Timestamp(System.currentTimeMillis()), metaObject);}
    
  • Service 層與高級查詢示例

    @Service
    public class UserService {@Autowiredprivate UserMapper userMapper;public User getUserById(Long id) {return userMapper.selectById(id);}public void createUser(User user) {userMapper.insert(user);}public void updateUser(User user) {userMapper.updateById(user);}public void deleteUser(Long id) {userMapper.deleteById(id);}// 進階示例:使用 LambdaQueryWrapper 進行條件查詢public List<User> getUsersByNameAndAge(String name, int age) {return userMapper.selectList(new LambdaQueryWrapper<User>().like(User::getName, name).ge(User::getAge, age));}
    }
    
  • Controller 層代碼

    @RestController
    @RequestMapping("/user")
    public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public User getUser(@PathVariable Long id) {return userService.getUserById(id);}@PostMapping("/")public String createUser(@RequestBody User user) {userService.createUser(user);return "創建成功!";}@GetMapping("/search")public List<User> searchUsers(@RequestParam String name, @RequestParam int age) {return userService.getUsersByNameAndAge(name, age);}
    }
    

Mybatis-Plus 的優勢在于減少重復代碼、支持自動填充、邏輯刪除以及內置的高級查詢功能,既滿足簡單 CRUD,又能應對復雜查詢場景。👍

四、綜合對比與實踐中的注意事項 🎯

1. 選擇依據

  • 項目規模與復雜度

    • 對于簡單或中小型項目,Mybatis-Plus 以其簡潔高效的開發體驗無疑更適合。

    • 大型或對 SQL 細節要求極高的系統,則可考慮 Mybatis,或結合使用二者,發揮各自優勢。

  • 團隊技術水平

    • 初學者更容易上手 Mybatis-Plus;

    • 資深開發者可根據實際需求靈活選擇并擴展自定義功能。

2. 開發實踐建議

  • 文檔與社區

    • 閱讀 Mybatis 和 Mybatis-Plus 的官方文檔,關注最新插件和最佳實踐;

    • 利用開源社區、博客(如 CSDN、掘金)中的經驗分享,獲取實際問題的解決方案。

  • 性能調優

    • 利用 Mybatis-Plus 的性能分析插件及時發現慢查詢;

    • 在 Mybatis 中,合理使用動態 SQL 和緩存機制,優化數據庫訪問效率。

  • 安全性

    • 注意 SQL 注入問題,優先使用條件構造器和參數化查詢;

    • 對于業務敏感數據,配置合理的事務管理和日志審計。


五、總結 🌟

通過本文的詳細解析與豐富實例,了解到:

  • Mybatis 以其極高的靈活性和定制能力適合復雜業務場景,但配置與維護成本較高。

  • Mybatis-Plus 則在 Mybatis 基礎上進行了功能擴展和自動化封裝,極大提高了開發效率,適合快速開發中小型項目,同時也支持高級查詢、自動填充和邏輯刪除等特性。

未來,隨著業務場景的不斷豐富和技術的持續演進,選擇合適的持久層框架將更注重團隊開發效率和系統可維護性。

無論是堅持 Mybatis 的精細調優,還是選擇 Mybatis-Plus 的自動化便利,深入理解底層原理和不斷優化實踐都是取得成功的關鍵!😊

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

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

相關文章

【區塊鏈安全 | 第十九篇】類型之映射類型

文章目錄 映射類型可迭代映射 映射類型 映射類型使用語法 mapping(KeyType KeyName? > ValueType ValueName?)&#xff0c;映射類型的變量聲明使用語法 mapping(KeyType KeyName? > ValueType ValueName?) VariableName。 KeyType 可以是任何內置值類型、bytes、st…

動態循環表單+動態判斷表單類型+動態判斷表單是否必填方法

頁面效果&#xff1a; 接口請求到的數據格式&#xff1a; list: [{demandType: "設備輔助功能要求",demandSettingList: [{id: "1907384788664963074",name: "測試表單",fieldType: 0,contentValue: "",vaildStatus: 0, // 0 非必填&a…

藍橋杯DFS算法題(java)

最大連通 鏈接&#xff1a; https://www.lanqiao.cn/problems/2410/learning/ 問題描述 小藍有一個 30 行 60 列的數字矩陣&#xff0c;矩陣中的每個數都是 0 或 1 。 1100100000111111101010010010011010101110110110111010011111100100000000010100011011000000100101100011…

解鎖物種分布模擬新技能:MaxEnt 模型與 R 語言的奇妙融合

技術點目錄 第二章、常用數據檢索與R語言自動化下載及可視化方法第三章、R語言數據清洗與特征變量篩選第四章、基于ArcGIS、R數據處理與進階第五章、基于Maxent的物種分布建模與預測第六章、基于R語言的模型參數優化第七章、物種分布模型結果分析與論文寫作 —————————…

三軸云臺之相機技術篇

一、結構設計 三軸云臺通常由空間上三個互相垂直的框架構成&#xff0c;包括內框&#xff08;俯仰框&#xff09;、中框&#xff08;方位框&#xff09;和外框&#xff08;橫滾框&#xff09;。這些框架分別負責控制相機的俯仰運動、方位運動和橫滾運動&#xff0c;從而實現對目…

全文 - MLIR Toy Tutorial Chapter 3 :高層次上語言特定的分析和變換

使用 C 風格的模式匹配和重寫來優化轉置運算 使用 DRR 優化 reshape 運算 創建一種貼近輸入語言的語義表示的方言&#xff0c;可以在 MLIR 中分析、變換和優化&#xff0c;這些過程中需要用到高級語言的信息&#xff0c;而且通常是在語言的 AST 上執行的這些過程。…

js逆向入門圖靈爬蟲練習平臺 第四題學習

(base64解碼&#xff09;地址:aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvNC8 先找到請求接口帶有加密參數&#xff1a; 全局搜索Sign,找到參數生成位置 看到這就一目了然塞&#xff0c;知道參數是怎么構造生成的&#xff0c;不知道這段 JavaScript 代碼沒關系…

【Flask開發】嘿馬文學web完整flask項目第2篇:2.用戶認證,Json Web Token(JWT)【附代碼文檔】

教程總體簡介&#xff1a;2. 目標 1.1產品與開發 1.2環境配置 1.3 運行方式 1.4目錄說明 1.5數據庫設計 2.用戶認證 Json Web Token(JWT) 3.書架 4.1分類列表 5.搜索 5.3搜索-精準&高匹配&推薦 6.小說 6.4推薦-同類熱門推薦 7.瀏覽記錄 8.1配置-閱讀偏好 8.配置 9.1項目…

[dp5_多狀態dp] 按摩師 | 打家劫舍 II | 刪除并獲得點數 | 粉刷房子

目錄 1.面試題 17.16. 按摩師 題解 2.打家劫舍 II 題解 3.刪除并獲得點數 題解 4.粉刷房子 題解 一定要有這樣的能力&#xff0c;碰到一個新題的時候&#xff0c;可以往之前做過的題方向靠&#xff01; 打家劫舍問題模型: 不能選擇相鄰的兩個數&#xff0c;并且要最終…

基于javaweb的SSM羽毛球會員俱樂部系統場館課程運動設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

windows下git bash安裝SDKMan報錯Looking for unzip...Not found

需要在jdk8和jdk17兩個版本切換。最簡單的是通過手動切換&#xff0c;但切換過程太繁瑣&#xff0c;修改環境變量&#xff0c;達到切換目的。于是嘗試其它解決方案&#xff0c;最終確實使用sdkman工具。 確保安裝了git Git - Downloading Package 記住安裝的路徑&#xff0c;…

rnn的音頻降噪背后技術原理

rnniose: 這個演示展示了 RNNoise 項目&#xff0c;說明了如何將深度學習應用于噪聲抑制。其核心理念是將經典的信號處理方法與深度學習結合&#xff0c;打造一個小巧、快速的實時噪聲抑制算法。它不需要昂貴的 GPU —— 在樹莓派上就能輕松運行。 相比傳統的噪聲抑制系統&…

劍指Offer(數據結構與算法面試題精講)C++版——day3

劍指Offer&#xff08;數據結構與算法面試題精講&#xff09;C版——day3 題目一&#xff1a;數組中和為0的3個數字題目二&#xff1a;和大于或等于k的最短子數組題目三&#xff1a;乘積小于k的子數組 題目一&#xff1a;數組中和為0的3個數字 前面我們提到&#xff0c;在一個排…

全新UI好看404頁面源碼

源碼介紹 全新UI好看404頁面源碼,源碼由HTMLCSSJS組成&#xff0c;記事本打開源碼文件可以進行內容文字之類的修改&#xff0c;雙擊html文件可以本地運行 效果預覽 源碼獲取 全新UI好看404頁面源碼

遞歸典例---漢諾塔

https://ybt.ssoier.cn/problem_show.php?pid1205 #include<bits/stdc.h> #define endl \n #define pii pair<int,int>using namespace std; using ll long long;void move(int n,char a,char b,char c) // n 個盤子&#xff0c;通過 b&#xff0c;從 a 移動到 …

php的高速緩存

部署方法 在我們安裝的nginx中默認不支持memc和srcache功能&#xff0c;需要借助第三方模塊來讓nginx支持此功能。 tar zxf srcache-nginx-module-0.33.tar.gz tar zxf memc-nginx-module-0.20.tar.gz 下載這倆個模塊&#xff0c;然后編譯安裝的時候加進去 編譯安裝完成之后…

視頻設備軌跡回放平臺EasyCVR打造視頻智能融合新平臺,驅動智慧機場邁向數字新時代

一、行業背景? 隨著 5G、AI、物聯網、大數據等前沿技術的不斷更新換代&#xff0c;交通行業進入數字化轉型的高速發展時期。航空業作為交通領域的重要部分&#xff0c;數字化進程從追求速度往注重質量的轉變。但機場在數字化轉型中面臨許多嚴峻挑戰&#xff0c;如現有運營模式…

【論文閱讀】Anchor Graph Network for Incomplete Multiview Clustering

摘要 近年來&#xff0c;不完全多視圖聚類&#xff08;IMVC&#xff09;受到廣泛關注。然而&#xff0c;現有研究仍然存在以下幾個不足之處&#xff1a;1) 部分方法忽略了樣本對在全局結構分布中的關聯性&#xff1b;2) 許多方法計算成本較高&#xff0c;因此無法應用于大規模…

15. 遠程服務器運行jemter的GUI方式

1. 問題 在 linux 服務器或遠程服務器上&#xff0c;安裝 Jmeter&#xff0c;打不開 Jmeter 的 GUI 界面。 環境&#xff1a; linux 服務器mac 電腦 需求&#xff1a;在遠程服務器中&#xff0c;啟動 jmeter&#xff08;./bin/jmeter &&#xff09;后&#xff0c;在 ma…

Ansible:playbook的高級用法

文章目錄 1. handlers與notify2. tags組件3. playbook中使用變量3.1使用 setup 模塊中變量3.2在playbook 命令行中定義變量3.3在playbook文件中定義變量3.4使用變量文件3.5主機清單文件中定義變量主機變量組&#xff08;公共&#xff09;變量 1. handlers與notify Handlers&am…