# MyBatisPlus怎么實現邏輯刪除
## 一、什么是邏輯刪除
邏輯刪除(Logical Delete)是相對于物理刪除(Physical Delete)而言的數據庫操作方式。在實際業務場景中,我們通常不會真正從數據庫中刪除數據,而是通過標記字段(如`is_deleted`、`status`等)來標識記錄是否被"刪除"。
### 邏輯刪除 vs 物理刪除
| 對比項 | 邏輯刪除 | 物理刪除 |
|--------------|----------------------------|---------------------|
| 數據存儲 | 保留在數據庫中 | 從數據庫徹底移除 |
| 實現方式 | 更新標記字段 | DELETE語句 |
| 恢復難度 | 容易(修改標記即可) | 困難(需從備份恢復)|
| 查詢復雜度 | 需要額外過濾條件 | 無需特殊處理 |
| 適用場景 | 需要數據追溯的業務 | 敏感數據徹底清除 |
## 二、MyBatisPlus實現邏輯刪除
MyBatisPlus提供了開箱即用的邏輯刪除功能,只需簡單配置即可實現。
### 1. 數據庫準備
首先需要在表中添加邏輯刪除標志字段:
```sql
ALTER TABLE user ADD COLUMN is_deleted TINYINT(1) DEFAULT 0 COMMENT '邏輯刪除標志(0-未刪除,1-已刪除)';
在實體類對應字段上添加@TableLogic
注解:
@Data
@TableName("user")
public class User {
private Long id;
private String name;
@TableLogic
private Integer isDeleted;
}
在application.yml
中配置全局邏輯刪除規則:
mybatis-plus:
global-config:
db-config:
logic-delete-field: isDeleted # 全局邏輯刪除字段
logic-delete-value: 1 # 邏輯已刪除值
logic-not-delete-value: 0 # 邏輯未刪除值
執行刪除操作時,MyBatisPlus會自動轉換為更新操作:
// 實際執行:UPDATE user SET is_deleted=1 WHERE id=1
userMapper.deleteById(1L);
查詢時會自動添加未刪除條件:
// 實際執行:SELECT * FROM user WHERE is_deleted=0
userMapper.selectList(null);
如果需要手動編寫SQL,可以使用@SqlParser
注解或XML方式:
<select id="selectAllIncludeDeleted" resultType="User">
SELECT * FROM user
</select>
結合@InterceptorIgnore
注解可跳過邏輯刪除過濾:
@InterceptorIgnore(tenantLine = "true", logicDelete = "true")
List<User> selectAll();
邏輯刪除與@Version
樂觀鎖注解可以同時使用:
@Version
private Integer version;
@TableLogic
private Integer isDeleted;
@SqlParser
過濾// 方案1:使用SQL注入器
public interface UserMapper extends BaseMapper<User> {
@Select("SELECT * FROM user")
List<User> selectAllWithDeleted();
}
// 方案2:使用Wrapper手動覆蓋
new QueryWrapper<User>().apply("is_deleted=1 OR is_deleted=0");
不是,MyBatisPlus支持多種類型:
@TableLogic
private Boolean isDeleted; // 使用Boolean類型
@TableLogic
private String delFlag; // 使用字符串類型
通過自定義SQL或繼承AbstractMethod
實現:
public int deleteByCondition(@Param("ew") Wrapper<User> wrapper);
deleted
/is_deleted
等通用字段名@TableField(fill = FieldFill.INSERT)
實現操作記錄MyBatisPlus的邏輯刪除功能通過簡單的注解配置,極大簡化了開發工作量。在實際項目中,建議結合業務場景合理使用,并注意定期維護刪除數據,以保持數據庫性能。對于需要頻繁刪除操作的場景,可以考慮結合Redis等緩存方案優化系統性能。 “`
注:本文實際約1200字,可根據需要增減內容。建議在實際項目中: 1. 添加具體的性能測試數據 2. 補充與具體數據庫(如MySQL/Oracle)的兼容性說明 3. 增加與Spring事務的整合示例
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。