1. 程式人生 > 其它 >針對資料庫邏輯刪除操作簡單實現方案

針對資料庫邏輯刪除操作簡單實現方案

資料庫邏輯刪除

定義

邏輯刪除是指在刪除資料庫的某條記錄時,並不是真正的將該條記錄刪除,而是通過某個欄位來標識其狀態為“刪除”,在接下來的查詢等操作時,根據此欄位來過濾調被刪除的記錄。

java中常用的orm框架有mybatis和hibernate,下面說下兩種框架在使用中簡單的邏輯刪除操作。

mybatis-plus

SpringBoot 配置方式:

  • application.yml 加入配置(如果你的預設值和mp預設的一樣,該配置可無):
mybatis-plus:
  global-config:
    db-config:
      logic-delete-value: 1 # 邏輯已刪除值(預設為 1)
      logic-not-delete-value: 0 # 邏輯未刪除值(預設為 0)

對於邏輯刪除攔截器的bean的注入方式

import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class MyBatisPlusConfiguration {

    @Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }
}
  • 實體類欄位上加上@TableLogic註解

    @TableLogic
    private Integer deleted;
    
  • 效果: 使用mp自帶方法刪除和查詢都會附帶邏輯刪除功能 (自己寫的xml不會)

    example
    刪除時 update user set deleted=1 where id =1 and deleted=0
    查詢時 select * from user where deleted=0
    

附件說明

  • 邏輯刪除是為了方便資料恢復和保護資料本身價值等等的一種方案,但實際就是刪除。
  • 當進行邏輯刪除後,再通mp的api進行資料查詢時會自動過濾掉已經刪除(邏輯刪除)掉的資料。

如: 員工離職,賬號被鎖定等都應該是一個狀態欄位,此種場景不應使用邏輯刪除。

  • 若確需查詢刪除資料,如老闆需要檢視歷史所有資料的統計彙總資訊,請單獨手寫sql。

注意:通過mapper檔案寫的sql語句不會通過以上方式自動新增邏輯刪除條件

hibernate

在hibernate中有@SQLDelete和@Where註解也可以幫我們實現邏輯刪除操作。

在entity中使用這兩個註解,如圖所示

在sql中寫上刪除的時候的SQL語句,到呼叫delete方法的時候,hibernate將自動執行該語句將實現軟刪除。

下面將展示效果:

首先資料庫中建立一條刪除狀態為1(未刪除)的資料

執行程式進行查詢


此時的查詢操作會自動拼接我們在@Where註解提供的sql片段。

執行邏輯刪除操作

hibernate刪除只是操作了@SQLDelete中的SQL語句。因為hibernate刪除前會先執行一次查詢操作,所以顯示了兩個sql。

再次執行上面的查詢語句

操作後查詢出的資料為空,表明已經刪除成功。

以上就是兩種框架的邏輯刪除簡單流程。

個人感覺在開發過程中,針對於邏輯刪除使用這種框架提供的註解方式去實現有點不好維護,建議手寫sql進行刪除操作。