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

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

因為數(shù)據(jù)庫沒有調(diào)整時區(qū),所以數(shù)據(jù)庫默認(rèn)的時間看起來有點不太正常,請忽略。至少能看出來更新時間是數(shù)據(jù)庫生成的時間,并不是因為應(yīng)用系統(tǒ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); // 邏輯刪除不能自動填充更新時間
if (count > 0) {
return true;
}
return false;
}尋找原因
查看官網(wǎng)關(guān)于邏輯刪除的章節(jié)描述。查看常見問題小節(jié)。如圖:

官方也有說刪除接口自動填充功能失效。
官方的使用說明也有說明邏輯刪除的使用方法:

解決方法
方法一
根據(jù)官方的提示1. 使用 update 方法并: UpdateWrapper.set(column, value)(推薦)。
代碼實踐如下:
@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語句:

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

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

發(fā)現(xiàn)已經(jīng)被表示為過時了,但是根據(jù)注釋發(fā)現(xiàn),邏輯刪除的時候,可以通過傳入entity參數(shù),這樣就會有可能進(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語句中的確自動填填充了修改時間字段的值,數(shù)據(jù)中也的確更新了修改時間。
補充寫法
@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邏輯刪除自動填充更新時間的文章就介紹到這了,更多相關(guān)mybatis-plus邏輯刪除內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
maven依賴關(guān)系中的<scope>provided</scope>使用詳解
這篇文章主要介紹了maven依賴關(guān)系中的<scope>provided</scope>使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
springboot多模塊項目mvn打包遇到存在依賴但卻無法發(fā)現(xiàn)符號問題
在SpringBoot多模塊項目中,如果遇到依賴存在但無法發(fā)現(xiàn)符號的問題,常見原因可能是pom.xml配置問題,例如,如果某個模塊僅作為依賴而不是啟動工程,不應(yīng)在其pom中配置spring-boot-maven-plugin插件,因為這將影響jar包的生成方式2024-09-09
如何通過自定義spring?invalidator注解校驗數(shù)據(jù)合法性
這篇文章主要介紹了如何通過自定義spring?invalidator注解校驗數(shù)據(jù)合法性,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
Java?Timer與TimerTask類使程序計時執(zhí)行
這篇文章主要介紹了Java定時器中的Timer和TimerTask的原理。Timer主要用于Java線程里指定時間或周期運行任務(wù),它是線程安全的,但不提供實時性(real-time)保證。接下來就跟隨小編一起深入了解Timer和TimerTask吧2022-02-02
Spring profile通過多種方法實現(xiàn)多環(huán)境支持
這篇文章主要介紹了Spring profile通過多種方法實現(xiàn)多環(huán)境支持,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10
SpringBoot從配置文件中獲取屬性的四種方法總結(jié)
這篇文章主要介紹了SpringBoot從配置文件中獲取屬性的四種方法總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02

