關(guān)于mybatis-plus邏輯刪除自動(dòng)填充更新時(shí)間的問(wèn)題
前言
mybatis-plus是對(duì)mybatis的增強(qiáng),mybatis-plus更像是面向?qū)ο缶幊?,?shù)據(jù)庫(kù)基本CRUD的操作可以不用手動(dòng)編寫SQL語(yǔ)句,大大提高了開(kāi)發(fā)的效率。
mybatis-plus有一個(gè)擴(kuò)展功能:自動(dòng)填充。此功能常見(jiàn)的應(yīng)用場(chǎng)景為,插入數(shù)據(jù)的時(shí)候自動(dòng)添加創(chuàng)建時(shí)間、創(chuàng)建人、修改時(shí)間、修改人、刪除標(biāo)記。通過(guò)實(shí)現(xiàn)MetaObjectHandler接口,重寫insertFill、updateFill方法,當(dāng)我們插入和修改數(shù)據(jù)的時(shí)候可以自動(dòng)添加指定字段的值。
mybatis-plus還有另一個(gè)擴(kuò)展功能:邏輯刪除。當(dāng)我刪除某條數(shù)據(jù)時(shí),其實(shí)是通過(guò)一條update語(yǔ)句修改數(shù)據(jù)的刪除標(biāo)記字段。
問(wèn)題發(fā)現(xiàn)
當(dāng)配置了自動(dòng)填充,然后通過(guò)mapper的deleteById方法可以實(shí)現(xiàn)修改刪除標(biāo)記,但是無(wú)法自動(dòng)填充修改時(shí)間字段,即修改了數(shù)據(jù),但是更新時(shí)間沒(méi)有被修改為當(dāng)前時(shí)間。
刪除前數(shù)據(jù)狀態(tài),刪除標(biāo)記為0,更新時(shí)間為:2022-06-30 14:56:16。如圖:

調(diào)用接口進(jìn)行刪除,刪除標(biāo)記為1,因?yàn)楦聲r(shí)間字段設(shè)置了如果為空的時(shí)候利用數(shù)據(jù)庫(kù)生成的默認(rèn)時(shí)間,系統(tǒng)未設(shè)置更新時(shí)間,所以更新時(shí)間為:2022-06-30 09:15:59。如圖:
@Transactional(rollbackFor = Exception.class)
public boolean removeById(Long id) {
int count = orderInfoMapper.deleteById(id);// 邏輯刪除不能自動(dòng)填充更新時(shí)間
if (count > 0) {
return true;
}
return false;
}
應(yīng)用系統(tǒng)的打印的SQL語(yǔ)句沒(méi)有設(shè)置時(shí)間。如圖:

因?yàn)閿?shù)據(jù)庫(kù)沒(méi)有調(diào)整時(shí)區(qū),所以數(shù)據(jù)庫(kù)默認(rèn)的時(shí)間看起來(lái)有點(diǎn)不太正常,請(qǐng)忽略。至少能看出來(lái)更新時(shí)間是數(shù)據(jù)庫(kù)生成的時(shí)間,并不是因?yàn)閼?yīng)用系統(tǒng)設(shè)置的時(shí)間。
以下的寫法也不能自動(dòng)填充更新時(shí)間。
@Transactional(rollbackFor = Exception.class)
public boolean removeById(Long id) {
LambdaQueryWrapper<OrderInfo> queryWrapper = new QueryWrapper<OrderInfo>().lambda();
queryWrapper.eq(OrderInfo::getId,id);
nt count = orderInfoMapper.delete(queryWrapper); // 邏輯刪除不能自動(dòng)填充更新時(shí)間
if (count > 0) {
return true;
}
return false;
}尋找原因
查看官網(wǎng)關(guān)于邏輯刪除的章節(jié)描述。查看常見(jiàn)問(wèn)題小節(jié)。如圖:

官方也有說(shuō)刪除接口自動(dòng)填充功能失效。
官方的使用說(shuō)明也有說(shuō)明邏輯刪除的使用方法:

解決方法
方法一
根據(jù)官方的提示1. 使用 update 方法并: UpdateWrapper.set(column, value)(推薦)。
代碼實(shí)踐如下:
@Transactional(rollbackFor = Exception.class)
public boolean removeById(Long id) {
LambdaUpdateWrapper<OrderInfo> updateWrapper = new UpdateWrapper<OrderInfo>().lambda();
updateWrapper.eq(OrderInfo::getId, id).set(OrderInfo::getDeleteFlag, 1);
int count = orderInfoMapper.update(new OrderInfo(), updateWrapper);
if (count > 0) {
return true;
}
return false;
}執(zhí)行SQL語(yǔ)句:

數(shù)據(jù)結(jié)果:

方法二
根據(jù)官方的提示1. 使用Sql注入器注入com.baomidou.mybatisplus.extension.injector.methods.LogicDeleteByIdWithFill并使用(推薦)。查看LogicDeleteByIdWithFill類。

發(fā)現(xiàn)已經(jīng)被表示為過(guò)時(shí)了,但是根據(jù)注釋發(fā)現(xiàn),邏輯刪除的時(shí)候,可以通過(guò)傳入entity參數(shù),這樣就會(huì)有可能進(jìn)行字段字段填充。
代碼如下:
@Transactional(rollbackFor = Exception.class)
public boolean removeById(Long id) {
OrderInfo orderInfo = new OrderInfo();
int count = orderInfoMapper.deleteById(orderInfo.setId(id));
if (count > 0) {
return true;
}
return false;
}
SQL語(yǔ)句中的確自動(dòng)填填充了修改時(shí)間字段的值,數(shù)據(jù)中也的確更新了修改時(shí)間。
補(bǔ)充寫法
@Transactional(rollbackFor = Exception.class)
public boolean removeById(Long id) {
LambdaUpdateWrapper<OrderInfo> updateWrapper = new UpdateWrapper<OrderInfo>().lambda();
updateWrapper.eq(OrderInfo::getId,id);
OrderInfo orderInfo = new OrderInfo();
orderInfo.setDeleteFlag(true);
int count = orderInfoMapper.update(orderInfo, updateWrapper);
// updateWrapper.eq(OrderInfo::getId, id).set(OrderInfo::getDeleteFlag, 1);
// int count = orderInfoMapper.update(new OrderInfo(), updateWrapper);
if (count > 0) {
return true;
}
return false;
}@Transactional(rollbackFor = Exception.class)
public boolean removeById(Long id) {
LambdaUpdateWrapper<OrderInfo> updateWrapper = new UpdateWrapper<OrderInfo>().lambda();
updateWrapper.eq(OrderInfo::getId, id).set(OrderInfo::getDeleteFlag, 1);
int count = orderInfoMapper.update(new OrderInfo(), updateWrapper);
if (count > 0) {
return true;
}
return false;
}到此這篇關(guān)于mybatis-plus邏輯刪除自動(dòng)填充更新時(shí)間的文章就介紹到這了,更多相關(guān)mybatis-plus邏輯刪除內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Boot小型項(xiàng)目如何使用異步任務(wù)管理器實(shí)現(xiàn)不同業(yè)務(wù)間的解耦
這篇文章主要介紹了Spring?Boot小型項(xiàng)目如何使用異步任務(wù)管理器實(shí)現(xiàn)不同業(yè)務(wù)間的解耦,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
springmvc+kindeditor文件上傳實(shí)例詳解
這篇文章主要為大家詳細(xì)介紹了springmvc+kindeditor文件上傳實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
Java詳解對(duì)象終止方法finalize()的用法
在前面的 jvm 中, 需要補(bǔ)充幾個(gè)部分的內(nèi)容, 接著來(lái)看 finalize() 機(jī)制, 它可以使接近死亡的對(duì)象復(fù)活, 下來(lái)我們來(lái)看是怎么一回事2022-05-05
java使用DOM4J對(duì)XML文件進(jìn)行增刪改查操作
這篇文章主要為大家詳細(xì)介紹了java使用DOM4J對(duì)XML文件進(jìn)行增刪改查操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
Java拖曳鼠標(biāo)實(shí)現(xiàn)畫線功能的方法
這篇文章主要介紹了Java拖曳鼠標(biāo)實(shí)現(xiàn)畫線功能的方法,需要的朋友可以參考下2014-07-07
Java中轉(zhuǎn)換器設(shè)計(jì)模式深入講解
這篇文章主要給大家介紹了關(guān)于Java中轉(zhuǎn)換器設(shè)計(jì)模式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
java中SynchronizedList和Vector的區(qū)別詳解
這篇文章主要介紹了java中SynchronizedList和Vector的區(qū)別詳解,Vector是java.util包中的一個(gè)類。 SynchronizedList是java.util.Collections中的一個(gè)靜態(tài)內(nèi)部類。,需要的朋友可以參考下2019-06-06
SpringBoot高并發(fā)下控制限流的幾種實(shí)現(xiàn)方法
隨著業(yè)務(wù)的發(fā)展,高并發(fā)成為很多系統(tǒng)不得不面對(duì)的問(wèn)題,限流作為一種常用的技術(shù)手段,可以幫助我們有效地控制請(qǐng)求的流量,避免系統(tǒng)因過(guò)載而崩潰,本文將介紹在Spring Boot應(yīng)用中實(shí)現(xiàn)限流的幾種方法,需要的朋友可以參考下2024-06-06
解決eclipse啟動(dòng)tomcat時(shí)不能加載web項(xiàng)目的問(wèn)題
這篇文章主要介紹了解決eclipse啟動(dòng)tomcat時(shí)不能加載web項(xiàng)目的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

