本文為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
歡迎關注我的博客,里面有很多精品合集
- 本文轉載注明出處(必須帶連接,不能只轉文字):字母哥博客,
覺得對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創作動力! ,另外,筆者最近一段時間輸出了如下的精品內容,期待您的關注,
- 《手摸手教你學Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《實戰前后端分離RBAC權限管理系統》
- 《實戰SpringCloud微服務從青銅到王者》
- 《VUE深入淺出系列》
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/136618.html
標籤:Java
上一篇:java開發-flyway
