小書MybatisPlus第8篇-邏輯刪除實現及API細節精講
本文爲Mybatis Plus系列文章的第8篇,前7篇訪問地址如下:
- 小書MybatisPlus第1篇-整合SpringBoot快速開始增刪改查
- 小書MybatisPlus第2篇-條件構造器的應用及總結
- 小書MybatisPlus第3篇-自定義SQL
- 小書MybatisPlus第4篇-表格分頁與下拉分頁查詢
- 小書MybatisPlus第5篇-Active Record模式精講
- 小書MybatisPlus第6篇-主鍵生成策略精講
- 小書MybatisPlus第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註解:
三、API使用方法
3.1.插入一條數據
插入數據的時候,不需要爲deleted字段賦值
@Test public void testInsert() { User user = new User(); user.setName("字母哥"); user.setAge(18); int row = userMapper.insert(user); }
deleted採用默認值0(未刪除),新插入的數據都是未刪除的數據
3.2.刪除一條記錄:
執行如下Mybatis Plus API刪除操作
userMapper.deleteById(1286797255805796354L);
查看數據庫可以發現這條數據仍然存在,只不過邏輯刪除字段值被設置爲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
歡迎關注我的博客,裏面有很多精品合集
- 本文轉載註明出處(必須帶連接,不能只轉文字): 字母哥博客 。
覺得對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創作動力!。另外,筆者最近一段時間輸出瞭如下的精品內容,期待您的關注。