關于mybatis-plus邏輯刪除自動填充更新時間的問題
前言
mybatis-plus是對mybatis的增強,mybatis-plus更像是面向?qū)ο缶幊?,?shù)據(jù)庫基本CRUD的操作可以不用手動編寫SQL語句,大大提高了開發(fā)的效率。
mybatis-plus有一個擴展功能:自動填充。此功能常見的應用場景為,插入數(shù)據(jù)的時候自動添加創(chuàng)建時間、創(chuàng)建人、修改時間、修改人、刪除標記。通過實現(xiàn)MetaObjectHandler
接口,重寫insertFill
、updateFill
方法,當我們插入和修改數(shù)據(jù)的時候可以自動添加指定字段的值。
mybatis-plus還有另一個擴展功能:邏輯刪除。當我刪除某條數(shù)據(jù)時,其實是通過一條update
語句修改數(shù)據(jù)的刪除標記字段。
問題發(fā)現(xiàn)
當配置了自動填充,然后通過mapper
的deleteById
方法可以實現(xiàn)修改刪除標記,但是無法自動填充修改時間
字段,即修改了數(shù)據(jù),但是更新時間沒有被修改為當前時間。
刪除前數(shù)據(jù)狀態(tài),刪除標記為0,更新時間為:2022-06-30 14:56:16。如圖:
調(diào)用接口進行刪除,刪除標記為1,因為更新時間字段設置了如果為空的時候利用數(shù)據(jù)庫生成的默認時間,系統(tǒng)未設置更新時間,所以更新時間為: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; }
應用系統(tǒng)的打印的SQL語句沒有設置時間。如圖:
因為數(shù)據(jù)庫沒有調(diào)整時區(qū),所以數(shù)據(jù)庫默認的時間看起來有點不太正常,請忽略。至少能看出來更新時間是數(shù)據(jù)庫生成的時間,并不是因為應用系統(tǒng)設置的時間。
以下的寫法也不能自動填充更新時間。
@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)關于邏輯刪除的章節(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ù),這樣就會有可能進行字段字段填充。
代碼如下:
@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; }
到此這篇關于mybatis-plus邏輯刪除自動填充更新時間的文章就介紹到這了,更多相關mybatis-plus邏輯刪除內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring?Boot小型項目如何使用異步任務管理器實現(xiàn)不同業(yè)務間的解耦
這篇文章主要介紹了Spring?Boot小型項目如何使用異步任務管理器實現(xiàn)不同業(yè)務間的解耦,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08java中SynchronizedList和Vector的區(qū)別詳解
這篇文章主要介紹了java中SynchronizedList和Vector的區(qū)別詳解,Vector是java.util包中的一個類。 SynchronizedList是java.util.Collections中的一個靜態(tài)內(nèi)部類。,需要的朋友可以參考下2019-06-06SpringBoot高并發(fā)下控制限流的幾種實現(xiàn)方法
隨著業(yè)務的發(fā)展,高并發(fā)成為很多系統(tǒng)不得不面對的問題,限流作為一種常用的技術手段,可以幫助我們有效地控制請求的流量,避免系統(tǒng)因過載而崩潰,本文將介紹在Spring Boot應用中實現(xiàn)限流的幾種方法,需要的朋友可以參考下2024-06-06解決eclipse啟動tomcat時不能加載web項目的問題
這篇文章主要介紹了解決eclipse啟動tomcat時不能加載web項目的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06