MybatisPlus使用@TableLogic實(shí)現(xiàn)邏輯刪除過程
使用@TableLogic實(shí)現(xiàn)邏輯刪除
接下來要講解是刪除中比較重要的一個操作,邏輯刪除,先來分析下問題:

這是一個員工和其所簽的合同表,關(guān)系是一個員工可以簽多個合同,是一個一(員工)對多(合同)的表
員工ID為1的張業(yè)績,總共簽了三個合同,如果此時他離職了,我們需要將員工表中的數(shù)據(jù)進(jìn)行刪除,會執(zhí)行delete操作
如果表在設(shè)計的時候有主外鍵關(guān)系,那么同時也得將合同表中的前三條數(shù)據(jù)也刪除掉

后期要統(tǒng)計所簽合同的總金額,就會發(fā)現(xiàn)對不上,原因是已經(jīng)將員工1簽的合同信息刪除掉了
如果只刪除員工不刪除合同表數(shù)據(jù),那么合同的員工編號對應(yīng)的員工信息不存在,那么就會出現(xiàn)垃圾數(shù)據(jù),就會出現(xiàn)無主合同,根本不知道有張業(yè)績這個人的存在
所以經(jīng)過分析,我們不應(yīng)該將表中的數(shù)據(jù)刪除掉,而是需要進(jìn)行保留,但是又得把離職的人和在職的人進(jìn)行區(qū)分,這樣就解決了上述問題,如:

區(qū)分的方式,就是在員工表中添加一列數(shù)據(jù)deleted,如果為0說明在職員工,如果離職則將其改完1,(0和1所代表的含義是可以自定義的)
對于刪除操作業(yè)務(wù)問題來說有:
- 物理刪除:業(yè)務(wù)數(shù)據(jù)從數(shù)據(jù)庫中丟棄,執(zhí)行的是delete操作
- 邏輯刪除:為數(shù)據(jù)設(shè)置是否可用狀態(tài)字段,刪除時設(shè)置狀態(tài)字段為不可用狀態(tài),數(shù)據(jù)保留在數(shù)據(jù)庫中,執(zhí)行的是update操作
MybatisPlus中邏輯刪除具體該如何實(shí)現(xiàn)
步驟1:修改數(shù)據(jù)庫表添加deleted列
字段名可以任意,內(nèi)容也可以自定義,比如0代表正常,1代表刪除,可以在添加列的同時設(shè)置其默認(rèn)值為0正常。

步驟2:實(shí)體類添加屬性
(1)添加與數(shù)據(jù)庫表的列對應(yīng)的一個屬性名,名稱可以任意,如果和數(shù)據(jù)表列名對不上,可以使用@TableField進(jìn)行關(guān)系映射,如果一致,則會自動對應(yīng)。
(2)標(biāo)識新增的字段為邏輯刪除字段,使用@TableLogic
@Data
//@TableName("tbl_user") 可以不寫是因?yàn)榕渲昧巳峙渲?
public class User {
@TableId(type = IdType.ASSIGN_UUID)
private String id;
private String name;
@TableField(value="pwd",select=false)
private String password;
private Integer age;
private String tel;
@TableField(exist=false)
private Integer online;
@TableLogic(value="0",delval="1")
//value為正常數(shù)據(jù)的值,delval為刪除數(shù)據(jù)的值
private Integer deleted;
}
步驟3:運(yùn)行刪除方法
@SpringBootTest
class Mybatisplus03DqlApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testDelete(){
userDao.deleteById(1L);
}
}

從測試結(jié)果來看,邏輯刪除最后走的是update操作,會將指定的字段修改成刪除狀態(tài)對應(yīng)的值。
思考
邏輯刪除,對查詢有沒有影響呢?
執(zhí)行查詢操作
@SpringBootTest
class Mybatisplus03DqlApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testFind(){
System.out.println(userDao.selectList(null));
}
}
運(yùn)行測試,會發(fā)現(xiàn)打印出來的sql語句中會多一個查詢條件,如:

可想而知,MP的邏輯刪除會將所有的查詢都添加一個未被刪除的條件,也就是已經(jīng)被刪除的數(shù)據(jù)是不應(yīng)該被查詢出來的。
如果還是想把已經(jīng)刪除的數(shù)據(jù)都查詢出來該如何實(shí)現(xiàn)呢?
@Mapper
public interface UserDao extends BaseMapper<User> {
//查詢所有數(shù)據(jù)包含已經(jīng)被刪除的數(shù)據(jù)
@Select("select * from tbl_user")
public List<User> selectAll();
}
如果每個表都要有邏輯刪除,那么就需要在每個模型類的屬性上添加@TableLogic注解,如何優(yōu)化?
在配置文件中添加全局配置,如下:
mybatis-plus:
global-config:
db-config:
# 邏輯刪除字段名
logic-delete-field: deleted
# 邏輯刪除字面值:未刪除為0
logic-not-delete-value: 0
# 邏輯刪除字面值:刪除為1
logic-delete-value: 1
介紹完邏輯刪除,邏輯刪除的本質(zhì)為:
邏輯刪除的本質(zhì)其實(shí)是修改操作。如果加了邏輯刪除字段,查詢數(shù)據(jù)時也會自動帶上邏輯刪除字段。
執(zhí)行的SQL語句為:
UPDATE tbl_user SET deleted=1 where id = ? AND deleted=0
執(zhí)行數(shù)據(jù)結(jié)果為:

知識點(diǎn):@TableLogic
| 名稱 | @TableLogic |
|---|---|
| 類型 | 屬性注解 |
| 位置 | 模型類中用于表示刪除字段的屬性定義上方 |
| 作用 | 標(biāo)識該字段為進(jìn)行邏輯刪除的字段 |
| 相關(guān)屬性 | value:邏輯未刪除值delval: 邏輯刪除值 |
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)從PLC讀取數(shù)據(jù)的常見主流且可行方案
要從PLC讀取數(shù)據(jù),Java本身并不直接支持PLC的通信協(xié)議,所以你需要借助一些中間件或庫來實(shí)現(xiàn),以下是幾種主流且可行的方案,大家可以根據(jù)自己的需要進(jìn)行選擇2026-03-03
ElasticSearch學(xué)習(xí)之文檔API相關(guān)操作
這篇文章主要為大家介紹了ElasticSearch學(xué)習(xí)之文檔API相關(guān)操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
如何在Mac上安裝并配置JDK環(huán)境變量詳細(xì)步驟
這篇文章主要介紹了如何在Mac上安裝并配置JDK環(huán)境變量詳細(xì)步驟,包括下載JDK、安裝JDK、配置環(huán)境變量、驗(yàn)證JDK配置以及可選地設(shè)置PowerShell為默認(rèn)終端,需要的朋友可以參考下2025-04-04
Springboot定時任務(wù)Scheduled重復(fù)執(zhí)行操作
這篇文章主要介紹了Springboot定時任務(wù)Scheduled重復(fù)執(zhí)行操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
SpringBoot自動配置的實(shí)現(xiàn)原理
這篇文章主要介紹了詳解SpringBoot自動配置原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01
Java圖片與二進(jìn)制相互轉(zhuǎn)換實(shí)現(xiàn)示例講解
這篇文章主要介紹了Java圖片與二進(jìn)制相互轉(zhuǎn)換實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-03-03

