MyBatis-Plus邏輯刪除實(shí)現(xiàn)過程
在很多企業(yè)級應(yīng)用中,數(shù)據(jù)刪除操作通常采用 邏輯刪除 的方式,而不是物理刪除。邏輯刪除指的是通過更新字段(例如 is_deleted 或 status)來標(biāo)記數(shù)據(jù)為刪除狀態(tài),而不是真的從數(shù)據(jù)庫中刪除記錄。這樣做的好處是保留數(shù)據(jù)的歷史記錄,方便后續(xù)的數(shù)據(jù)恢復(fù)、審計(jì)以及統(tǒng)計(jì)。
MyBatis-Plus(MP)提供了強(qiáng)大的 邏輯刪除功能,使得開發(fā)者可以快速實(shí)現(xiàn)這一功能。本文將介紹 MyBatis-Plus 如何實(shí)現(xiàn)邏輯刪除,包括自動填充字段、配置與實(shí)現(xiàn)步驟、常見應(yīng)用場景,并展示如何使用 remove 方法進(jìn)行邏輯刪除,而不是手動通過 update 來修改刪除標(biāo)記。
1. 邏輯刪除的必要性
1.1 邏輯刪除的定義
邏輯刪除 是指通過修改某個字段(如 is_deleted)的值,將記錄標(biāo)記為已刪除,而不是將其從數(shù)據(jù)庫中刪除。
這種方式不僅保留了數(shù)據(jù)的完整性,還能避免因誤操作導(dǎo)致的數(shù)據(jù)丟失。
1.2 邏輯刪除的優(yōu)點(diǎn)
- 數(shù)據(jù)恢復(fù):可以在數(shù)據(jù)標(biāo)記為刪除后,依然保留數(shù)據(jù),便于后期的恢復(fù)。
- 歷史審計(jì):可以查看被刪除記錄的歷史數(shù)據(jù),滿足合規(guī)性要求。
- 避免數(shù)據(jù)丟失:比物理刪除更安全,可以減少誤操作帶來的影響。
1.3 適用場景
- 用戶賬號刪除:用戶刪除賬戶時,使用邏輯刪除標(biāo)記賬戶為已刪除,便于后續(xù)恢復(fù)。
- 訂單或產(chǎn)品狀態(tài)管理:刪除訂單或產(chǎn)品記錄時,使用邏輯刪除來標(biāo)記記錄而非物理刪除。
- 內(nèi)容管理系統(tǒng)(CMS):在 CMS 中刪除文章或評論時,使用邏輯刪除來保留數(shù)據(jù)。
2. MyBatis-Plus 支持的邏輯刪除方式
MyBatis-Plus 提供了非常方便的方式來實(shí)現(xiàn)邏輯刪除,主要依賴于 @TableLogic 注解,標(biāo)記字段為邏輯刪除字段。MyBatis-Plus 會自動處理該字段的值,并在查詢時自動排除已刪除的記錄。
2.1 使用@TableLogic注解進(jìn)行邏輯刪除
MyBatis-Plus 提供的 @TableLogic 注解可以標(biāo)識一個字段為邏輯刪除字段。默認(rèn)情況下,字段值為 0 表示未刪除,值為 1 表示已刪除。
示例:User實(shí)體類配置
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:標(biāo)識isDeleted字段為邏輯刪除字段。字段值為0表示未刪除,值為1表示已刪除。
2.2 配置邏輯刪除字段的值
MyBatis-Plus 默認(rèn)將 isDeleted 字段值為 0 表示未刪除,1 表示已刪除。開發(fā)者可以自定義邏輯刪除的字段值。
自定義邏輯刪除值
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusPropertiesCustomizer mybatisPlusPropertiesCustomizer() {
return properties -> {
properties.getGlobalConfig().setLogicDeleteValue("1"); // 設(shè)置邏輯刪除的值為 1
properties.getGlobalConfig().setLogicNotDeleteValue("0"); // 設(shè)置未刪除的值為 0
};
}
}
在這個配置中,設(shè)置了邏輯刪除字段的值為 1 表示已刪除,0 表示未刪除。
3. 使用remove方法進(jìn)行邏輯刪除
3.1remove方法與邏輯刪除
MyBatis-Plus 中的 remove 方法用于刪除記錄,默認(rèn)情況下會執(zhí)行物理刪除操作。
為了啟用 邏輯刪除,需要通過設(shè)置 @TableLogic 注解,并在執(zhí)行刪除操作時,MyBatis-Plus 會自動更新 isDeleted 字段的值,而不是直接刪除記錄。
示例:remove方法進(jìn)行邏輯刪除
public void logicDeleteUser(Long userId) {
userService.removeById(userId); // 使用 remove 方法進(jìn)行邏輯刪除
}
在這個例子中,removeById 方法會自動更新 isDeleted 字段,而不是直接從數(shù)據(jù)庫中刪除記錄。
3.2removeById的原理
removeById 方法的實(shí)現(xiàn)是基于 @TableLogic 注解的字段,通過更新 isDeleted 字段的值來實(shí)現(xiàn)邏輯刪除。
MyBatis-Plus 在執(zhí)行刪除操作時,會自動生成如下 SQL:
UPDATE user SET is_deleted = 1 WHERE id = ?;
該操作將 is_deleted 字段的值更新為 1,表示該記錄已被刪除,而不是從數(shù)據(jù)庫中刪除該記錄。
3.3 查詢時排除邏輯刪除的記錄
MyBatis-Plus 默認(rèn)會在查詢時自動排除邏輯刪除的記錄,即 isDeleted 字段為 1 的記錄不會被返回。
查詢時的自動排除
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John");
List<User> users = userService.list(queryWrapper); // 自動排除邏輯刪除的記錄
在這個查詢中,MyBatis-Plus 會自動忽略 isDeleted = 1 的記錄,只返回未刪除的記錄。
4. 示例:邏輯刪除字段與查詢
4.1 插入數(shù)據(jù)時的邏輯刪除
在插入數(shù)據(jù)時,isDeleted 字段會默認(rèn)設(shè)置為 0,表示數(shù)據(jù)未刪除。
User user = new User();
user.setName("John");
user.setAge(30);
userService.save(user); // 插入時,isDeleted 默認(rèn)為 0
4.2 更新數(shù)據(jù)時的邏輯刪除
在更新數(shù)據(jù)時,可以通過 removeById 方法將某條記錄的 isDeleted 字段更新為 1,表示數(shù)據(jù)已被邏輯刪除。
User user = userService.getById(1L); user.setIsDeleted(1); // 設(shè)置為已刪除 userService.updateById(user); // 執(zhí)行更新操作,實(shí)際是邏輯刪除
4.3 查詢時排除邏輯刪除的數(shù)據(jù)
查詢時,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. 總結(jié)
- 邏輯刪除的必要性:邏輯刪除可以保留數(shù)據(jù)歷史,避免數(shù)據(jù)丟失,適用于需要審計(jì)、數(shù)據(jù)恢復(fù)的場景。
- MyBatis-Plus 支持的邏輯刪除方式:通過
@TableLogic注解,MyBatis-Plus 能夠在插入、更新和查詢時自動處理邏輯刪除字段。 - 實(shí)現(xiàn)步驟:在實(shí)體類中使用
@TableLogic注解標(biāo)識邏輯刪除字段,配置自定義刪除值,并實(shí)現(xiàn)MetaObjectHandler來處理字段填充。 - 使用
remove方法進(jìn)行邏輯刪除:MyBatis-Plus 的removeById方法會自動更新isDeleted字段,實(shí)現(xiàn)邏輯刪除,而不是物理刪除數(shù)據(jù)。
MyBatis-Plus 的邏輯刪除功能簡化了數(shù)據(jù)的刪除操作,保留了刪除記錄的歷史數(shù)據(jù),確保了應(yīng)用的數(shù)據(jù)一致性和安全性。通過合理配置和使用 MyBatis-Plus 的邏輯刪除功能,開發(fā)者能夠更加高效地管理數(shù)據(jù),并滿足業(yè)務(wù)需求。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于Mybatis實(shí)體別名支持通配符掃描問題小結(jié)
MyBatis可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數(shù)據(jù)庫中的記錄,這篇文章主要介紹了Mybatis實(shí)體別名支持通配符掃描的問題,需要的朋友可以參考下2022-01-01
springboot集成普羅米修斯(Prometheus)的方法
這篇文章主要介紹了springboot集成普羅米修斯(Prometheus)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Spring事務(wù)注解@Transactional失效的八種場景分析
最近在開發(fā)采用Spring框架的項(xiàng)目中,使用了@Transactional注解,但發(fā)現(xiàn)事務(wù)注解失效了,所以這篇文章主要給大家介紹了關(guān)于Spring事務(wù)注解@Transactional失效的八種場景,需要的朋友可以參考下2021-05-05
利用ClasserLoader實(shí)現(xiàn)jar包加載并調(diào)用里面的方法
classloader即是類加載,虛擬機(jī)把描述類的數(shù)據(jù)從class字節(jié)碼文件加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行檢驗(yàn)、轉(zhuǎn)換解析和初始化,了解java的類加載機(jī)制,可以快速解決運(yùn)行時的各種加載問題并快速定位其背后的本質(zhì)原因,本文介紹了如何利用ClasserLoader來實(shí)現(xiàn)jar包加載并調(diào)用里面的方法2024-09-09
java中rss解析器(rome.jar和jdom.jar)示例
這篇文章主要介紹了java中rss解析器(rome.jar和jdom.jar)示例,需要的朋友可以參考下2014-03-03
關(guān)于Maven parent.relativePath說明
Maven中的relativePath用于指定父項(xiàng)目pom.xml的相對路徑,默認(rèn)值為../pom.xml,這個配置幫助Maven在構(gòu)建時定位父模塊的位置,確保模塊間的依賴關(guān)系正確,relativePath可以指向本地或遠(yuǎn)程倉庫中的父項(xiàng)目,如果不需要尋找父項(xiàng)目,可以將其設(shè)置為空2024-09-09
Java的Tomcat和Servlet的運(yùn)行原理詳解
這篇文章主要為大家詳細(xì)介紹了Java的Tomcat和Servlet,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03

