小書MybatisPlus第8篇-邏輯刪除實現及API細節精講

字母哥部落格發表於2020-07-25

本文為Mybatis Plus系列文章的第8篇,前7篇訪問地址如下:

一、物理刪除與邏輯刪除

  • 物理刪除:指檔案儲存所用到的磁儲存區域被真正的擦除或清零,這樣刪除的檔案是不可以恢復的,物理刪除是計算機處理資料時的一個概念。如果在資料庫中直接使用delete、drop刪除了表資料,如果沒有備份的話,資料就很難恢復了。
  • 邏輯刪除(軟刪除):邏輯刪除就是對要被刪除的資料打上一個刪除標記,通常使用一個deleted欄位標示行記錄是不是被刪除,比如該資料有一個欄位deleted,當其值為0表示未刪除,值為1表示刪除。那麼邏輯刪除就是將0變成1。在邏輯上是資料是被刪除的,但資料本身是依然存在的。

兩者的優劣:

  • 物理刪除一定程度上刪除了“無用”的資料,降低了表的資料量,對效能肯定是有好處的;但是如果沒有備份的話,資料很難恢復。也無法對歷史資料進行資料分析。
  • 邏輯刪除恢復的話只要修改ideleted等類似的狀態標示欄位就可以了,但是表的資料量肯定會比物理刪除增加了,並且查詢時經常要考慮到deleted欄位,對索引都會有影響。

所以一張表的資料是否採用邏輯刪除,還要根據資料的重要性、資料量、查詢效能以及業務需求等因素綜合判斷。

二、邏輯刪除實現

  • 首先為需要邏輯刪除的表增加一個deleted欄位作為邏輯刪除欄位,並且設定其預設值為0,如下:
CREATE TABLE `user` (
	`id` BIGINT(20) NOT NULL COMMENT '主鍵ID',
	`name` VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	`age` INT(11) NULL DEFAULT NULL COMMENT '年齡',
	`email` VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',
	`deleted` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '邏輯刪除標記',
	PRIMARY KEY (`id`)
);
  • 給資料庫表對應的實體類欄位上加上@TableLogic註解:

mybatisplus-logicdelete

三、API使用方法

3.1.插入一條資料

插入資料的時候,不需要為deleted欄位賦值

@Test
public void testInsert() {
  User user = new User();
  user.setName("字母哥");
  user.setAge(18);

  int row = userMapper.insert(user);
}

deleted採用預設值0(未刪除),新插入的資料都是未刪除的資料

mybatisplus-logicdelete-1

3.2.刪除一條記錄:

執行如下Mybatis Plus API刪除操作

userMapper.deleteById(1286797255805796354L);

mybatisplus-logicdelete-2

檢視資料庫可以發現這條資料仍然存在,只不過邏輯刪除欄位值被設定為1:

UPDATE user SET deleted=1 WHERE id=? AND deleted=0

3.3.查詢一條記錄

  • 當我們使用MP邏輯刪除的功能之後,比如執行查詢、修改的方法,MP會為我們自動加上未刪除的條件。是不會查到被邏輯刪除的記錄:
userMapper.selectList(null);

會自動新增過濾條件WHERE deleted=0

SELECT id,name,age,email,deleted
FROM user 
WHERE deleted=0 
  • 當我們查詢資料時,查詢結果不希望包含邏輯刪除欄位,可以加如下的註解
@TableLogic
@TableField(select = false)
private Integer deleted;

執行的SQL如下(注意查詢結果不包含deleted欄位):

SELECT id,name,age,email 
FROM user 
WHERE deleted=0

四、全域性配置引數

通常在一個比較正規的管理專案中,邏輯刪除欄位不允許隨意命名,所有表的邏輯刪除欄位使用相同的名稱(比如:deleted)。我們可以在application.yml中新增全域性配置,這樣就不需要在每一個實體類上面都新增 @TableLogic註解了:

注意:當全域性配置和@TableLogic區域性配置同時存在,則以實體上註解為準,優先順序更高。

#全域性邏輯刪除欄位值
mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted

預設情況下,邏輯已刪除值為1,邏輯未刪除值為0。我們也可以在application.yml中進行修改:

#邏輯已刪除值(預設為 1)
#邏輯未刪除值(預設為 0)
mybatis-plus:
  global-config:
    db-config:
      logic-delete-value: 1
      logic-not-delete-value: 0

歡迎關注我的部落格,裡面有很多精品合集

  • 本文轉載註明出處(必須帶連線,不能只轉文字):字母哥部落格

覺得對您有幫助的話,幫我點贊、分享!您的支援是我不竭的創作動力! 。另外,筆者最近一段時間輸出瞭如下的精品內容,期待您的關注。

相關文章