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

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

1、物理刪除與邏輯刪除

  • 物理刪除:指文件存儲所用到的磁存儲區域被真正的擦除或清零,這樣刪除的文件是不能夠恢復的,物理刪除是計算機處理數據時的一個概念。若是在數據庫中直接使用delete、drop刪除了表數據,若是沒有備份的話,數據就很難恢復了。
  • 邏輯刪除(軟刪除):邏輯刪除就是對要被刪除的數據打上一個刪除標記,一般使用一個deleted字段標示行記錄是否是被刪除,好比該數據有一個字段deleted,當其值爲0表示未刪除,值爲1表示刪除。那麼邏輯刪除就是將0變成1。在邏輯上是數據是被刪除的,但數據自己是依然存在的。

二者的優劣:vue

  • 物理刪除必定程度上刪除了「無用」的數據,下降了表的數據量,對性能確定是有好處的;可是若是沒有備份的話,數據很難恢復。也沒法對歷史數據進行數據分析。
  • 邏輯刪除恢復的話只要修改ideleted等相似的狀態標示字段就能夠了,可是表的數據量確定會比物理刪除增長了,而且查詢時常常要考慮到deleted字段,對索引都會有影響。

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

2、邏輯刪除實現

  • 首先爲須要邏輯刪除的表增長一個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

3、API使用方法

3.1.插入一條數據

插入數據的時候,不須要爲deleted字段賦值spring

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

  int row = userMapper.insert(user);
}

deleted採用默認值0(未刪除),新插入的數據都是未刪除的數據sql

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 springboot

SELECT id,name,age,email,deleted
FROM user 
WHERE deleted=0
  • 當咱們查詢數據時,查詢結果不但願包含邏輯刪除字段,能夠加以下的註解
@TableLogic
@TableField(select = false)
private Integer deleted;

執行的SQL以下(注意查詢結果不包含deleted字段):mybatis

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

4、全局配置參數

一般在一個比較正規的管理項目中,邏輯刪除字段不容許隨意命名,全部表的邏輯刪除字段使用相同的名稱(好比:deleted)。咱們能夠在application.yml中添加全局配置,這樣就不須要在每個實體類上面都添加 @TableLogic註解了:app

注意:當全局配置和 @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

歡迎關注個人博客,裏面有不少精品合集

  • 本文轉載註明出處(必須帶鏈接,不能只轉文字):字母哥博客

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

相關文章
相關標籤/搜索