MyBatis-Plus 邏輯刪除實現

在很多企業級應用中,數據刪除操作通常采用 邏輯刪除 的方式,而不是物理刪除。邏輯刪除指的是通過更新字段(例如 is_deletedstatus)來標記數據為刪除狀態,而不是真的從數據庫中刪除記錄。這樣做的好處是保留數據的歷史記錄,方便后續的數據恢復、審計以及統計。

MyBatis-Plus(MP)提供了強大的 邏輯刪除功能,使得開發者可以快速實現這一功能。本文將介紹 MyBatis-Plus 如何實現邏輯刪除,包括自動填充字段、配置與實現步驟、常見應用場景,并展示如何使用 remove 方法進行邏輯刪除,而不是手動通過 update 來修改刪除標記。


1. 邏輯刪除的必要性

1.1 邏輯刪除的定義

邏輯刪除 是指通過修改某個字段(如 is_deleted)的值,將記錄標記為已刪除,而不是將其從數據庫中刪除。這種方式不僅保留了數據的完整性,還能避免因誤操作導致的數據丟失。

1.2 邏輯刪除的優點

  • 數據恢復:可以在數據標記為刪除后,依然保留數據,便于后期的恢復。
  • 歷史審計:可以查看被刪除記錄的歷史數據,滿足合規性要求。
  • 避免數據丟失:比物理刪除更安全,可以減少誤操作帶來的影響。

1.3 適用場景

  • 用戶賬號刪除:用戶刪除賬戶時,使用邏輯刪除標記賬戶為已刪除,便于后續恢復。
  • 訂單或產品狀態管理:刪除訂單或產品記錄時,使用邏輯刪除來標記記錄而非物理刪除。
  • 內容管理系統(CMS):在 CMS 中刪除文章或評論時,使用邏輯刪除來保留數據。

2. MyBatis-Plus 支持的邏輯刪除方式

MyBatis-Plus 提供了非常方便的方式來實現邏輯刪除,主要依賴于 @TableLogic 注解,標記字段為邏輯刪除字段。MyBatis-Plus 會自動處理該字段的值,并在查詢時自動排除已刪除的記錄。

2.1 使用 @TableLogic 注解進行邏輯刪除

MyBatis-Plus 提供的 @TableLogic 注解可以標識一個字段為邏輯刪除字段。默認情況下,字段值為 0 表示未刪除,值為 1 表示已刪除。

示例:User 實體類配置
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;public class User {@TableId(value = "id", type = IdType.AUTO)private Long id;private String name;private Integer age;@TableLogic  // 邏輯刪除字段private Integer isDeleted;// Getters and Setters
}

在這個示例中:

  • @TableLogic:標識 isDeleted 字段為邏輯刪除字段。字段值為 0 表示未刪除,值為 1 表示已刪除。

2.2 配置邏輯刪除字段的值

MyBatis-Plus 默認將 isDeleted 字段值為 0 表示未刪除,1 表示已刪除。開發者可以自定義邏輯刪除的字段值。

自定義邏輯刪除值
@Configuration
public class MybatisPlusConfig {@Beanpublic MybatisPlusPropertiesCustomizer mybatisPlusPropertiesCustomizer() {return properties -> {properties.getGlobalConfig().setLogicDeleteValue("1");  // 設置邏輯刪除的值為 1properties.getGlobalConfig().setLogicNotDeleteValue("0");  // 設置未刪除的值為 0};}
}

在這個配置中,設置了邏輯刪除字段的值為 1 表示已刪除,0 表示未刪除。


3. 使用 remove 方法進行邏輯刪除

3.1 remove 方法與邏輯刪除

MyBatis-Plus 中的 remove 方法用于刪除記錄,默認情況下會執行物理刪除操作。為了啟用 邏輯刪除,需要通過設置 @TableLogic 注解,并在執行刪除操作時,MyBatis-Plus 會自動更新 isDeleted 字段的值,而不是直接刪除記錄。

示例:remove 方法進行邏輯刪除
public void logicDeleteUser(Long userId) {userService.removeById(userId);  // 使用 remove 方法進行邏輯刪除
}

在這個例子中,removeById 方法會自動更新 isDeleted 字段,而不是直接從數據庫中刪除記錄。

3.2 removeById 的原理

removeById 方法的實現是基于 @TableLogic 注解的字段,通過更新 isDeleted 字段的值來實現邏輯刪除。MyBatis-Plus 在執行刪除操作時,會自動生成如下 SQL:

UPDATE user SET is_deleted = 1 WHERE id = ?;

該操作將 is_deleted 字段的值更新為 1,表示該記錄已被刪除,而不是從數據庫中刪除該記錄。

3.3 查詢時排除邏輯刪除的記錄

MyBatis-Plus 默認會在查詢時自動排除邏輯刪除的記錄,即 isDeleted 字段為 1 的記錄不會被返回。

查詢時的自動排除
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John");
List<User> users = userService.list(queryWrapper);  // 自動排除邏輯刪除的記錄

在這個查詢中,MyBatis-Plus 會自動忽略 isDeleted = 1 的記錄,只返回未刪除的記錄。


4. 示例:邏輯刪除字段與查詢

4.1 插入數據時的邏輯刪除

在插入數據時,isDeleted 字段會默認設置為 0,表示數據未刪除。

User user = new User();
user.setName("John");
user.setAge(30);
userService.save(user);  // 插入時,isDeleted 默認為 0

4.2 更新數據時的邏輯刪除

在更新數據時,可以通過 removeById 方法將某條記錄的 isDeleted 字段更新為 1,表示數據已被邏輯刪除。

User user = userService.getById(1L);
user.setIsDeleted(1);  // 設置為已刪除
userService.updateById(user);  // 執行更新操作,實際是邏輯刪除

4.3 查詢時排除邏輯刪除的數據

查詢時,MyBatis-Plus 會自動過濾掉邏輯刪除的記錄。你無需顯式地排除已刪除記錄。

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John");
List<User> users = userService.list(queryWrapper);  // 自動排除邏輯刪除的記錄

4.4 查詢已刪除的記錄

如果需要查詢已刪除的記錄,可以通過 QueryWrapper 手動指定查詢條件:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("is_deleted", 1);  // 查詢已刪除的記錄
List<User> deletedUsers = userService.list(queryWrapper);

5. 總結

  • 邏輯刪除的必要性:邏輯刪除可以保留數據歷史,避免數據丟失,適用于需要審計、數據恢復的場景。
  • MyBatis-Plus 支持的邏輯刪除方式:通過 @TableLogic 注解,MyBatis-Plus 能夠在插入、更新和查詢時自動處理邏輯刪除字段。
  • 實現步驟:在實體類中使用 @TableLogic 注解標識邏輯刪除字段,配置自定義刪除值,并實現 MetaObjectHandler 來處理字段填充。
  • 使用 remove 方法進行邏輯刪除:MyBatis-Plus 的 removeById 方法會自動更新 isDeleted 字段,實現邏輯刪除,而不是物理刪除數據。

MyBatis-Plus 的邏輯刪除功能簡化了數據的刪除操作,保留了刪除記錄的歷史數據,確保了應用的數據一致性和安全性。通過合理配置和使用 MyBatis-Plus 的邏輯刪除功能,開發者能夠更加高效地管理數據,并滿足業務需求。 🚀

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

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

相關文章

STM32_IIC外設工作流程

STM32 IC 外設工作流程&#xff08;基于寄存器&#xff09; 在 STM32 中&#xff0c;IC 通信主要通過一系列寄存器控制。理解這些寄存器的作用&#xff0c;能夠幫助我們掌握 IC 硬件的運行機制&#xff0c;實現高效的數據傳輸。本文以 STM32F1&#xff08;如 STM32F103&#x…

集合遍歷的多種方式

目錄 1.增強for 2.迭代器&#xff08;在遍歷的過程中需要刪除元素&#xff0c;請使用迭代器&#xff09; 3.雙列集合 4.Lambda表達式(forEach方法) 1.單列集合&#xff1a; 2.雙列集合&#xff1a; 4.Stream 流 5.普通for循環 6.列表迭代器 7.總結 1.增強for 注&…

DeepSeek在MATLAB上的部署與應用

在科技飛速發展的當下&#xff0c;人工智能與編程語言的融合不斷拓展著創新邊界。DeepSeek作為一款備受矚目的大語言模型&#xff0c;其在自然語言處理領域展現出強大的能力。而MATLAB&#xff0c;作為科學計算和工程領域廣泛應用的專業軟件&#xff0c;擁有豐富的工具包和高效…

value_counts()和unique()

我今天發現一個很有意思的問題哈 import scanpy as sc import numpy as npX np.random.randn(10,3) adata1 sc.AnnData(X) adata1.obs["sample"] "H1" print(adata1)X np.random.randn(20,3) adata2 sc.AnnData(X) adata2.obs["sample"] &…

每日OJ_牛客_游游的字母串_枚舉_C++_Java

目錄 牛客_游游的字母串_枚舉 題目解析 C代碼 Java代碼 牛客_游游的字母串_枚舉 游游的字母串 描述&#xff1a; 對于一個小寫字母而言&#xff0c;游游可以通過一次操作把這個字母變成相鄰的字母。a和b相鄰&#xff0c;b和c相鄰&#xff0c;以此類推。特殊的&#xff0…

【AI深度學習基礎】Pandas完全指南入門篇:數據處理的瑞士軍刀 (含完整代碼)

&#x1f4da; Pandas 系列文章導航 入門篇 &#x1f331;進階篇 &#x1f680;終極篇 &#x1f30c; &#x1f4cc; 一、引言 在大數據與 AI 驅動的時代&#xff0c;數據預處理和分析是深度學習與機器學習的基石。Pandas 作為 Python 生態中最強大的數據處理庫&#xff0c;以…

數字萬用表的使用教程

福祿克經濟型數字萬用表前面板按鍵功能介紹示意圖 1. 萬用表簡單介紹 萬用表是一種帶有整流器的、可以測量交、直流電流、電壓及電阻等多種電學參量的磁電式儀表。分為數字萬用表&#xff0c;鉗形萬用表&#xff0c; &#xff08;1&#xff09;表筆分為紅、黑二只。使用時黑色…

C# IComparable<T> 使用詳解

總目錄 前言 在C#編程中&#xff0c;IComparable<T> 是一個非常重要的接口&#xff0c;它允許我們為自定義類型提供默認的比較邏輯。這對于實現排序、搜索和其他需要基于特定規則進行比較的操作特別有用。本文將詳細介紹 IComparable<T> 的使用方法、應用場景及其…

DeepSeek使用手冊分享-附PDF下載連接

本次主要分享DeepSeek從技術原理到使用技巧內容&#xff0c;這里展示一些基本內容&#xff0c;后面附上詳細PDF下載鏈接。 DeepSeek基本介紹 DeepSeek公司和模型的基本簡介&#xff0c;以及DeepSeek高性能低成本獲得業界的高度認可的原因。 DeepSeek技術路線解析 DeepSeek V3…

Hugging Face 推出 FastRTC:實時語音視頻應用開發變得得心應手

估值超過 40 億美元的 AI 初創公司 Hugging Face 推出了 FastRTC&#xff0c;這是一個開源 Python 庫&#xff0c;旨在消除開發者在構建實時音頻和視頻 AI 應用時的主要障礙。 "在 Python 中正確構建實時 WebRTC 和 Websocket 應用一直都很困難&#xff0c;"FastRTC…

for循環相關(循環的過程中對數據進行刪除會踩坑)

# 錯誤方式&#xff0c; 有坑&#xff0c;結果不是你想要的。 user_list ["劉的話", "范德彪", "劉華強", 劉尼古拉斯趙四, "宋小寶", "劉能"] for item in user_list: if item.startswith("劉"): …

Qt顯示一個hello world

一、顯示思路 思路一&#xff1a;通過圖形化方式&#xff0c;界面上創建出一個控件顯示。 思路二&#xff1a;通過編寫C代碼在界面上創建控件顯示。 二、思路一實現 點開 Froms 的 widget.ui&#xff0c;拖拽 label 控件&#xff0c;顯示 hello world 即可。 qmake 基于 .…

復合機器人為 CNC 毛坯件上下料注入 “智能強心針”

在競爭日益激烈的 CNC 加工行業&#xff0c;如何提升生產效率、保證產品質量、實現智能化生產成為眾多企業亟待解決的問題。富唯智能憑借其先進的復合機器人技術&#xff0c;成功為多家 CNC 加工企業提供了毛坯件上下料的優質解決方案&#xff0c;有效提升了生產效能&#xff0…

電商業務數據測試用例參考

1. 數據采集層測試 用例編號測試目標測試場景預期結果TC-001驗證用戶行為日志采集完整性模擬用戶瀏覽、點擊、加購行為Kafka Topic中日志記錄數與模擬量一致TC-002驗證無效數據過濾規則發送爬蟲請求&#xff08;高頻IP&#xff09;清洗后數據中無該IP的日志記錄 2. 數據處理層…

Spring Cloud Gateway 網關的使用

在之前的學習中&#xff0c;所有的微服務接口都是對外開放的&#xff0c;這就意味著用戶可以直接訪問&#xff0c;為了保證對外服務的安全性&#xff0c;服務端實現的微服務接口都帶有一定的權限校驗機制&#xff0c;但是由于使用了微服務&#xff0c;就需要每一個服務都進行一…

webstorm的Live Edit插件配合chrome擴展程序JetBrains IDE Support實現實時預覽html效果

前言 我們平時在前端網頁修改好代碼要點擊刷新再去看修改的效果&#xff0c;這樣比較麻煩&#xff0c;那么很多軟件都提供了實時預覽的功能&#xff0c;我們一邊編輯代碼一邊可以看到效果。下面說的是webstorm。 1 Live Edit 首先我們需要在webstorm的settings里安裝插件Live …

map的operator[]的實現

map的operator[]的實現 operator[]里包含插入操作&#xff0c;所以我們先看一下首先看一下map的insert函數 返回值是一個pair類型。正常的常見的insert&#xff0c;插入成功返回true&#xff0c;失敗返回false 這里設計的insert不單單返回布爾值&#xff0c;而是返回一個pair…

定時器的編碼器接口模式

選擇編碼器接口模式的方法是&#xff1a;如果計數器只在TI2的邊沿計數&#xff0c;則置TIMx_SMCR寄存器中的SMS001&#xff0c;如果只在TI1邊沿計數&#xff0c;則置SMS010&#xff0c;如果計數器同時在TI1和TI2邊沿計數&#xff0c;則置SMS 011 明確一點&#xff0c;計數器…

Openshift配置默認調度

配置默認調度選擇角色為worker的機器運行pod。 編輯scheduler oc edit schedulers.config.openshift.iospec:defaultNodeSelector: node-role.kubernetes.io/worker ## 添加這一段如果pod需要運行在非worker主機&#xff0c;需要配置pod所在的項目添加注解 openshift.io/node…

突破光學成像局限:全視野光學血管造影技術新進展

全視野光學血管造影&#xff08;FFOA&#xff09;作為一種實時、無創的成像技術&#xff0c;能夠提取生物血液微循環信息&#xff0c;為深入探究生物組織的功能和病理變化提供關鍵數據。然而&#xff0c;傳統FFOA成像方法受到光學鏡頭景深&#xff08;DOF&#xff09;的限制&am…