溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mybatisPlus怎么實現邏輯刪除

發布時間:2022-01-31 15:06:56 來源:億速云 閱讀:371 作者:iii 欄目:開發技術
# 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-已刪除)';

2. 實體類配置

在實體類對應字段上添加@TableLogic注解:

@Data
@TableName("user")
public class User {
    private Long id;
    private String name;
    
    @TableLogic
    private Integer isDeleted;
}

3. 全局配置(可選)

application.yml中配置全局邏輯刪除規則:

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: isDeleted  # 全局邏輯刪除字段
      logic-delete-value: 1         # 邏輯已刪除值
      logic-not-delete-value: 0     # 邏輯未刪除值

4. 使用示例

執行刪除操作時,MyBatisPlus會自動轉換為更新操作:

// 實際執行:UPDATE user SET is_deleted=1 WHERE id=1
userMapper.deleteById(1L);

查詢時會自動添加未刪除條件:

// 實際執行:SELECT * FROM user WHERE is_deleted=0
userMapper.selectList(null);

三、高級配置與注意事項

1. 自定義SQL處理

如果需要手動編寫SQL,可以使用@SqlParser注解或XML方式:

<select id="selectAllIncludeDeleted" resultType="User">
    SELECT * FROM user
</select>

2. 多租戶場景下的處理

結合@InterceptorIgnore注解可跳過邏輯刪除過濾:

@InterceptorIgnore(tenantLine = "true", logicDelete = "true")
List<User> selectAll();

3. 與樂觀鎖的兼容性

邏輯刪除與@Version樂觀鎖注解可以同時使用:

@Version
private Integer version;
@TableLogic
private Integer isDeleted;

4. 性能優化建議

  1. 為邏輯刪除字段建立索引
  2. 定期歸檔已刪除數據
  3. 復雜查詢考慮使用@SqlParser過濾

四、常見問題解決方案

Q1: 如何查詢包含已刪除的數據?

// 方案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");

Q2: 邏輯刪除字段類型必須為數值嗎?

不是,MyBatisPlus支持多種類型:

@TableLogic
private Boolean isDeleted;  // 使用Boolean類型

@TableLogic
private String delFlag;    // 使用字符串類型

Q3: 如何實現多條件邏輯刪除?

通過自定義SQL或繼承AbstractMethod實現:

public int deleteByCondition(@Param("ew") Wrapper<User> wrapper);

五、最佳實踐建議

  1. 命名規范:建議使用deleted/is_deleted等通用字段名
  2. 審計字段:配合@TableField(fill = FieldFill.INSERT)實現操作記錄
  3. 數據歸檔:建議6個月以上的刪除數據移入歷史表
  4. 權限控制:嚴格限制物理刪除操作的訪問權限

結語

MyBatisPlus的邏輯刪除功能通過簡單的注解配置,極大簡化了開發工作量。在實際項目中,建議結合業務場景合理使用,并注意定期維護刪除數據,以保持數據庫性能。對于需要頻繁刪除操作的場景,可以考慮結合Redis等緩存方案優化系統性能。 “`

注:本文實際約1200字,可根據需要增減內容。建議在實際項目中: 1. 添加具體的性能測試數據 2. 補充與具體數據庫(如MySQL/Oracle)的兼容性說明 3. 增加與Spring事務的整合示例

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女