SpringBoot整合MyBatis-Plus:零XML實現高效CRUD

前言

作為一名開發者,數據庫操作是我們日常工作中不可或缺的部分。傳統的MyBatis雖然強大,但需要編寫大量XML映射文件,這在快速開發的今天顯得效率不足。MyBatis-Plus(簡稱MP)作為MyBatis的增強工具,在保留MyBatis所有特性的基礎上,極大地簡化了開發流程。本文將帶你全面了解如何在SpringBoot項目中整合MyBatis-Plus,實現零XML配置的高效CRUD操作。

一、MyBatis-Plus簡介:JPA vs MyBatis vs MyBatis-Plus

在開始整合之前,我們先了解下這三種持久層框架的特點和差異:

特性JPAMyBatisMyBatis-Plus
ORM支持全自動ORM半自動ORMMyBatis增強
SQL控制自動生成,可控性低完全手動控制自動生成+手動控制
XML配置需要大量XML零XML
CRUD操作方法命名自動生成需手動編寫內置通用Mapper
學習曲線中等較高低(MyBatis基礎上)
適用場景簡單標準業務復雜SQL業務各種業務場景

MyBatis-Plus的核心優勢

  1. 無侵入:只做增強不做改變,引入它不會對現有工程產生影響

  2. 損耗小:啟動即會自動注入基本CRUD,性能基本無損耗

  3. 強大CRUD:內置通用Mapper、通用Service,少量配置即可實現單表大部分CRUD操作

  4. 多種插件:支持分頁、性能分析、樂觀鎖、邏輯刪除等

二、SpringBoot整合MyBatis-Plus

1. 添加依賴

首先在pom.xml中添加必要依賴:

<!-- SpringBoot Starter -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- MyBatis-Plus Starter -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version>
</dependency><!-- 數據庫驅動(以MySQL為例) -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency><!-- Lombok簡化實體類開發 -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>

2. 配置數據庫連接

application.yml中配置數據源和MyBatis-Plus相關配置:

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mp_demo?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456mybatis-plus:configuration:# 下劃線轉駝峰map-underscore-to-camel-case: true# 日志實現log-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:# 主鍵類型 AUTO:"數據庫ID自增", INPUT:"用戶輸入ID", ID_WORKER:"全局唯一ID", UUID:"全局唯一UUID"id-type: auto# 邏輯刪除字段名logic-delete-field: deleted# 邏輯刪除值logic-delete-value: 1# 邏輯未刪除值logic-not-delete-value: 0

三、實體類注解詳解

MyBatis-Plus通過注解簡化了實體類與數據庫表的映射關系:

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;import java.util.Date;@Data
@TableName("t_user")  // 指定表名,省略時默認使用類名作為表名
public class User {@TableId(type = IdType.AUTO)  // 主鍵自增private Long id;private String username;private String password;@TableField("real_name")  // 指定數據庫字段名private String realName;private Integer age;private String email;@TableField(fill = FieldFill.INSERT)  // 插入時自動填充private Date createTime;@TableField(fill = FieldFill.INSERT_UPDATE)  // 插入和更新時自動填充private Date updateTime;@Version  // 樂觀鎖版本字段private Integer version;@TableLogic  // 邏輯刪除字段private Integer deleted;
}

常用注解說明

  • @TableName:指定實體類對應的表名

  • @TableId:指定主鍵字段,可配置主鍵生成策略

  • @TableField:指定非主鍵字段與數據庫列的映射關系

  • @Version:樂觀鎖注解

  • @TableLogic:邏輯刪除注解

四、Mapper接口與Service層開發

1. 創建Mapper接口

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;public interface UserMapper extends BaseMapper<User> {// 繼承BaseMapper后已包含基本CRUD方法// 可在此添加自定義SQL方法
}

2. Service層實現

MyBatis-Plus提供了通用的Service接口:

public interface UserService extends IService<User> {// 可擴展自定義方法
}@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {// 實現類只需繼承ServiceImpl即可
}

3. 基礎CRUD示例

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;// 新增@PostMappingpublic boolean save(@RequestBody User user) {return userService.save(user);}// 刪除@DeleteMapping("/{id}")public boolean remove(@PathVariable Long id) {return userService.removeById(id);}// 修改@PutMappingpublic boolean update(@RequestBody User user) {return userService.updateById(user);}// 查詢單個@GetMapping("/{id}")public User getById(@PathVariable Long id) {return userService.getById(id);}// 分頁查詢@GetMapping("/page")public IPage<User> page(@RequestParam(defaultValue = "1") Integer current,@RequestParam(defaultValue = "10") Integer size) {return userService.page(new Page<>(current, size));}
}

五、高級功能實戰

1. 分頁插件配置

MyBatis-Plus的分頁功能需要先配置分頁插件:

@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 分頁插件interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}

使用示例:

// 基本分頁
Page<User> page = new Page<>(1, 10);  // 當前頁,每頁大小
userMapper.selectPage(page, null);// 自定義SQL分頁
@Select("SELECT * FROM t_user WHERE age > #{age}")
IPage<User> selectPageByAge(IPage<User> page, @Param("age") Integer age);

2. 自動填充功能

實現MetaObjectHandler接口來處理自動填充字段:

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", Date.class, new Date());this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());}@Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());}
}

3. 條件構造器Wrapper

MyBatis-Plus提供了強大的條件構造器,可以構建復雜查詢條件:

// 查詢年齡大于18且名字包含"張"的用戶
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.gt(User::getAge, 18).like(User::getUsername, "張");
List<User> users = userMapper.selectList(wrapper);// 更新操作
LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(User::getUsername, "張三").set(User::getAge, 25);
userMapper.update(null, updateWrapper);

4. 邏輯刪除配置

application.yml中已經配置了邏輯刪除,實體類字段添加@TableLogic注解后,刪除操作將自動變為更新操作:

// 實際執行的是UPDATE t_user SET deleted=1 WHERE id=? AND deleted=0
userMapper.deleteById(1L);// 查詢時會自動加上WHERE deleted=0條件
userMapper.selectList(null);

5. 樂觀鎖實現

樂觀鎖通過版本號機制實現:

  1. 實體類添加@Version注解

  2. 配置樂觀鎖插件:

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 樂觀鎖插件interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;
}

?使用示例:

// 先查詢獲取version
User user = userMapper.selectById(1L);
// 修改數據
user.setUsername("new name");
// 執行更新,會帶上version條件
userMapper.updateById(user);

六、性能優化建議

  1. 批量操作:使用saveBatchupdateBatchById等方法提高批量操作效率

  2. SQL打印:開發環境可開啟SQL打印方便調試,生產環境應關閉

  3. 索引優化:為常用查詢條件添加數據庫索引

  4. 查詢字段控制:避免使用select *,明確指定查詢字段

  5. 邏輯刪除:對于大表,邏輯刪除可能影響性能,需考慮歸檔策略

七、常見問題解決方案

  1. 表名/字段名不一致

    • 使用@TableName@TableField注解明確指定

    • 配置全局的下劃線轉駝峰命名

  2. 主鍵策略問題

    • IdType.AUTO:數據庫自增

    • IdType.ASSIGN_ID:雪花算法生成ID(默認)

    • IdType.ASSIGN_UUID:UUID生成

  3. 分頁失效

    • 確保配置了分頁插件

    • 檢查Page參數是否正確傳遞

  4. 邏輯刪除無效

    • 檢查application.yml中的邏輯刪除配置

    • 確保實體類字段添加了@TableLogic注解

結語

通過本文的介紹,相信你已經掌握了SpringBoot整合MyBatis-Plus的核心要點。MyBatis-Plus的強大功能可以讓我們從繁瑣的XML配置中解放出來,專注于業務邏輯的實現。在實際項目中,你可以根據需求組合使用各種功能,如分頁+條件查詢、邏輯刪除+自動填充等,構建出高效可靠的數據訪問層。

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

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

相關文章

SpringCloud之Gateway基礎認識-服務網關

0、Gateway基本知識 Gateway 是在 Spring 生態系統之上構建的 API 網關服務&#xff0c;基于 Spring &#xff0c;Spring Boot 和 Project Reactor 等技術。 Gateway 旨在提供一種簡單而有效的方式來對 API 進行路由&#xff0c;以及提供一些強大的過濾器功能&#xff0c;例如…

Redis掃盲

Redis 緩存中間件 基礎篇 鍵值數據庫 key Value 是NoSql數據庫 非結構化、無關聯的、非SQL、BASE&#xff08;無法滿足ACID&#xff09; 命令執行是單線程&#xff0c;符合原子性。 低延遲、速度塊&#xff08;基于內存&#xff0c;IO多路復用&#xff0c;良好的編碼&am…

【FMMT】基于模糊多模態變壓器模型的個性化情感分析

遇到很難的文獻看不懂,不應該感到氣餒,應該激動,因為外審估計也看不太懂,那么學明白了可以嚇唬他 缺陷一:輸入依賴性與上下文建模不足?? ??缺陷描述??: 傳統自注意力機制缺乏因果關系,難以捕捉序列歷史背景多模態數據間的復雜依賴關系未被充分建模CNN/RNN類模型在…

Qt Creator 配置 Android 編譯環境

Qt Creator 配置 Android 編譯環境 環境配置流程下載JDK修改Qt Creator默認android配置文件修改sdk_definitions.json配置修改的內容 Qt Creator配置 異常處理刪除提示占用編譯報錯連接安卓機調試APP閃退無法進入 debug 斷點 環境 Qt Creator 版本 qtcreator-16.0.1Win10 嗯, …

使用聊天模型和提示模板構建一個簡單的 LLM 應用程序

官方教程 官方案例 在上面的鏈接注冊后&#xff0c;請確保設置您的環境變量以開始記錄追蹤 export LANGSMITH_TRACING"true" export LANGSMITH_API_KEY"..."或者&#xff0c;如果在筆記本中&#xff0c;您可以使用以下命令設置它們 import getpass imp…

React vs Vue:點擊外部事件處理的對比與實現

React vs Vue&#xff1a;點擊外部事件處理的對比與實現 在 Web 應用中&#xff0c;“點擊外部事件監聽”是一種常見需求&#xff0c;典型應用如&#xff1a;點擊彈窗外部關閉彈窗、點擊下拉菜單外關閉菜單。雖然在 React 和 Vue 中實現的原理類似——都是通過監聽 document 的…

3335. 字符串轉換后的長度 I

3335. 字符串轉換后的長度 I class Solution:def lengthAfterTransformations(self, s: str, t: int) -> int:# 大質數mod 10**97# 創建一個長度為26的數組cnt&#xff0c;對應26個小寫字母cnt [0]*26# 計算出s中26個字符分別有多少個for ch in s:cnt[ord(ch)-ord(a)] 1f…

Java詳解LeetCode 熱題 100(15):LeetCode 189. 輪轉數組(Rotate Array)詳解

文章目錄 1. 題目描述2. 理解題目3. 解法一&#xff1a;使用額外數組3.1 思路3.2 Java代碼實現3.3 代碼詳解3.4 復雜度分析3.5 適用場景 4. 解法二&#xff1a;環狀替換法&#xff08;原地算法&#xff09;4.1 思路4.2 Java代碼實現4.3 代碼詳解4.4 復雜度分析4.5 陷阱與注意事…

數據治理域——日志數據采集設計

摘要 本文主要介紹了Web頁面端日志采集的設計。首先闡述了頁面瀏覽日志采集&#xff0c;包括客戶端日志采集的實現方式、采集內容及技術亮點。接著介紹了無線客戶端端日志采集&#xff0c;包括UserTrack的核心設計、移動端與瀏覽器端采集差異以及典型應用場景崩潰分析。最后探…

PYTHON訓練營DAY24

# SO代碼我們的感情好像跳樓機 # 元組創建時&#xff0c;可以省略括號&#xff1a;my_tuple4 10, 20, thirty # 字符串要加“ ” 元組 一、創建 my_tuple1 (1, 2, 3) my_tuple2 (a, b, c) my_tuple3 (1, hello, 3.14, [4, 5]) # 可以包含不同類型的元素 print(my_tupl…

超聲波傳感器模塊

歡迎來到 破曉的歷程的 博客 ??不負時光&#xff0c;不負己?? 文章目錄 1.HC-SR04介紹2.HC-SR04原理介紹2.1原理概述3.2原理詳解 4驅動代碼編寫4.1寫前思考4.2硬件連線 5.總結hcsr04.hhcsr04.c 1.HC-SR04介紹 超聲波傳感器有很多種類的型號&#xff1a;HC-SR04、UC-025、…

《Effective Python》第2章 字符串和切片操作——深入理解Python 中的字符數據類型(bytes 與 str)的差異

引言 本篇博客基于學習《Effective Python》第三版 Chapter 2: Strings and Slicing 中的 Item 10: Know the Differences Between bytes and str 的總結與延伸。在 Python 編程中&#xff0c;字符串處理是幾乎每個開發者都會頻繁接觸的基礎操作。然而&#xff0c;Python 中的…

py7zr解壓文件時報錯CrcError(crc32, f.crc32, f.filename)

報錯信息 Traceback (most recent call last):File "/home/hp/project/test/file_util.py", line 130, in extract_archive_7zarchive.extract(targets[fixed_file], pathoutput_dir, recursiveTrue)File "/home/hp/miniconda3/envs/celery/lib/python3.10/sit…

物理:由基本粒子組成的個體能否提煉和重組?

個體差異源于基本粒子組合的復雜性與隨機性,這一假設若成立,確實可能為生物醫學帶來革命性突破——但需要突破技術、理論與系統層級的多重壁壘。以下從科學邏輯與技術路徑展開分析: 一、隨機組合中的共性與穩定結構 1. 自然界的自組織規律 涌現性(Emergence):盡管粒子組…

動態路由EIGRP的配置

動態路由EIGRP的配置 動態路由EIGRP&#xff1a;增強內部網關協議 為何收斂快、不成環&#xff1f; 路由計算的無環路和路由的收斂速度是路由計算的重要指標。EIGRP協議由于使用了DUAL算法&#xff0c;使得EIGRP協議在路由計算中不可能有環路路由產生&#xff0c;同時路由計…

組合問題(多條件)

39. 組合總和 - 力扣&#xff08;LeetCode&#xff09; class Solution { private:vector<vector<int>>result;vector<int>path;void backtracking(vector<int>& candidates, int target,int sum,int startIndex){if(sum>target){return;}if(…

SimScape物理建模實例2--帶控制的單質量彈簧阻尼系統

模型下載&#xff1a; 基于simscape&#xff0c;單質量系統帶位置控制資源-CSDN文庫 在實例1中&#xff0c;我們搭建了不帶控制的單質量彈簧阻尼系統&#xff0c;該系統沒有外界力量介入&#xff0c;只有彈簧的初始彈力&#xff0c;帶著彈簧使勁彈來彈去。 SimScape物理建模實…

OpenAI Text 模型與 Chat 模型調用實戰指南:從基礎配置到創意花店命名

在 AI 應用開發的浪潮中&#xff0c;OpenAI 的大語言模型成為開發者實現創新功能的得力工具。其中&#xff0c;Text 模型和 Chat 模型作為核心接口&#xff0c;被廣泛應用于文本生成、對話交互等場景。本文將以 “為花店起名” 為實際需求&#xff0c;手把手教你如何安全調用這…

網頁常見水印實現方式

文章目錄 1 明水印技術實現1.1 DOM覆蓋方案1.2 Canvas動態渲染1.3 CSS偽元素方案2 暗水印技術解析2.1 空域LSB算法2.2 頻域傅里葉變換3 防篡改機制設計3.1 MutationObserver防護3.2 Canvas指紋追蹤4 前后端實現對比5 攻防博弈深度分析5.1 常見破解手段5.2 進階防御策略6 選型近…

現代化QML組件開發教程

現代化QML組件開發教程 目錄 QML基礎介紹QML項目結構基本組件詳解自定義組件開發狀態與過渡高級主題最佳實踐 QML基礎介紹 什么是QML QML (Qt Meta Language) 是一種聲明式語言&#xff0c;專為用戶界面設計而創建。它是Qt框架的一部分&#xff0c;讓開發者能夠創建流暢、…