針對資料庫邏輯刪除操作簡單實現方案
阿新 • • 發佈:2022-12-07
資料庫邏輯刪除
定義
邏輯刪除是指在刪除資料庫的某條記錄時,並不是真正的將該條記錄刪除,而是通過某個欄位來標識其狀態為“刪除”,在接下來的查詢等操作時,根據此欄位來過濾調被刪除的記錄。
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進行刪除操作。