1. 程式人生 > 程式設計 >MybatisPlus中的刪除和邏輯刪除及區別介紹

MybatisPlus中的刪除和邏輯刪除及區別介紹

刪除又分為邏輯刪除和物理刪除,那麼它們有什麼區別呢?
物理刪除:真實刪除,將對應資料從資料庫中刪除,之後查詢不到此條被刪除資料。
邏輯刪除:假刪除,將對應資料中代表是否被刪除欄位狀態修改為“被刪除狀態”,之後在資料庫中仍舊能看到此條資料記錄。
在我們日常開發中,為了保留資料,經常會使用邏輯刪除的方式進行資料刪除,下面我們就來看看物理刪除與邏輯刪除怎麼實現的吧
首先假設我有這樣一張表

在這裡插入圖片描述

實體類:

package com.atguigu.mybatis_plus.entity;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;
@Data
public class User {
  @TableId(type = IdType.AUTO)
  private Long id;
  private String name;
  private Integer age;
  private String email;
  @TableField(fill = FieldFill.INSERT)
  private Date createTime;
  // @TableField(fill = FieldFill.UPDATE)
  @TableField(fill = FieldFill.INSERT_UPDATE)
  private Date updateTime;
  
}

userMapper介面:

package com.atguigu.mybatis_plus.mapper;
import com.atguigu.mybatis_plus.entity.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
// 繼承BaseMapper後UserMapper就具有了CRUD功能
public interface UserMapper extends BaseMapper<User>{
}

一、物理刪除

1、根據id刪除記錄

@Test
  public void testLogicDelete() {
    int count = userMapper.deleteById(1L); // 刪除id為1的資料
    System.out.println("受影響的行數"+count);
  }

2、批量刪除

@Test
public void testDeleteBatchIds() {
  int result = userMapper.deleteBatchIds(Arrays.asList(2,3,4)); // 刪除id為2,3,4的資料
  System.out.println(result);
}

結果:

在這裡插入圖片描述

物理刪除比較簡單,接下來我們看看邏輯刪除怎麼實現吧!

二、邏輯刪除

(1)資料庫修改,新增 deleted欄位

在這裡插入圖片描述

(2)實體類修改,新增deleted 欄位,並加上 @TableLogic 註解

/*
  加@TableLogic的情況下,程式內部會將delete語句變為update語句
  實際上我們寫的程式碼並不需要做出什麼改變
  */
  @TableLogic
  private Integer deleted;

(3)測試

	/**
   * 邏輯刪除
   */
  @Test
  public void testLogicDelete() {
    int count = userMapper.deleteById(5L);
    System.out.println("受影響的行數"+count);
  }

結果:

在這裡插入圖片描述
在這裡插入圖片描述

  • 測試後發現,資料並沒有被刪除,deleted欄位的值由0變成了1
  • 測試後分析列印的sql語句,是一條update
  • 注意:被刪除前,資料的deleted 欄位的值必須是 0,才能被選取出來執行邏輯刪除的操作

(5)測試邏輯刪除後的查詢,MyBatis Plus中查詢操作也會自動新增邏輯刪除欄位的判斷

@Test
  public void testSelect() {
    List<User> users = userMapper.selectList(null); // 查詢所有記錄
    users.forEach(System.out::println); // 遍歷輸出
  }

結果:

在這裡插入圖片描述

總結

到此這篇關於MybatisPlus中的刪除和邏輯刪除及區別介紹的文章就介紹到這了,更多相關MybatisPlus刪除和邏輯刪除內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!