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

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

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

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

步驟2:實(shí)體類添加屬性
(1)添加與數(shù)據(jù)庫(kù)表的列對(duì)應(yīng)的一個(gè)屬性名,名稱可以任意,如果和數(shù)據(jù)表列名對(duì)不上,可以使用@TableField進(jìn)行關(guān)系映射,如果一致,則會(huì)自動(dòng)對(duì)應(yīng)。
(2)標(biāo)識(shí)新增的字段為邏輯刪除字段,使用@TableLogic
@Data
//@TableName("tbl_user") 可以不寫(xiě)是因?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);
}
}

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

可想而知,MP的邏輯刪除會(huì)將所有的查詢都添加一個(gè)未被刪除的條件,也就是已經(jīng)被刪除的數(shù)據(jù)是不應(yīng)該被查詢出來(lái)的。
如果還是想把已經(jīng)刪除的數(shù)據(jù)都查詢出來(lái)該如何實(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();
}
如果每個(gè)表都要有邏輯刪除,那么就需要在每個(gè)模型類的屬性上添加@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ù)時(shí)也會(huì)自動(dòng)帶上邏輯刪除字段。
執(zhí)行的SQL語(yǔ)句為:
UPDATE tbl_user SET deleted=1 where id = ? AND deleted=0
執(zhí)行數(shù)據(jù)結(jié)果為:

知識(shí)點(diǎn):@TableLogic
| 名稱 | @TableLogic |
|---|---|
| 類型 | 屬性注解 |
| 位置 | 模型類中用于表示刪除字段的屬性定義上方 |
| 作用 | 標(biāo)識(shí)該字段為進(jìn)行邏輯刪除的字段 |
| 相關(guān)屬性 | value:邏輯未刪除值delval: 邏輯刪除值 |
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)從PLC讀取數(shù)據(jù)的常見(jiàn)主流且可行方案
要從PLC讀取數(shù)據(jù),Java本身并不直接支持PLC的通信協(xié)議,所以你需要借助一些中間件或庫(kù)來(lái)實(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定時(shí)任務(wù)Scheduled重復(fù)執(zhí)行操作
這篇文章主要介紹了Springboot定時(shí)任務(wù)Scheduled重復(fù)執(zhí)行操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
SpringBoot自動(dòng)配置的實(shí)現(xiàn)原理
這篇文章主要介紹了詳解SpringBoot自動(dòng)配置原理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
Java圖片與二進(jìn)制相互轉(zhuǎn)換實(shí)現(xiàn)示例講解
這篇文章主要介紹了Java圖片與二進(jìn)制相互轉(zhuǎn)換實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-03-03

