1. 程式人生 > 程式設計 >使用Mybatis-plus策略自動更新資料庫時間失敗問題解決

使用Mybatis-plus策略自動更新資料庫時間失敗問題解決

引言

在mybatis專案中,我們一般會使用它的外掛plus以擴充它的基本查詢功能。另一方面,在阿里巴巴開發手冊的規範中也提到,在資料庫表建立的時候,一般會有一個create_time和update_time欄位,它們的建表語句往往如下:

'create_time' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,'update_time' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

建立者則是希望在行insert的時候會自動生成create_time,同時在其它行進行修改後,執行update操作會自動更新update_time欄位。

博主在開發過程中,首先採用了mybatis plus的selectOne,查詢出某一個物件XXX,並對其某一值進行修改(比如狀態status從0修改成1),然後想利用資料庫的自動時間更新策略,即ON UPDATE CURRENT_TIMESTAMP去自動修改時間。於是用xxxService.updateById(XXX)。

但是,這樣子的更新方法並不會自動更新時間。因為selectOne出來的物件是有一個明確時間了,然後update的時候就會注入這個原時間。

解決辦法

方法一:

自己書寫資料庫欄位策略,進行updateFill(),可以參考:https://www.jb51.net/article/197456.htm

這種方法的確定其博主也說了“注意這種方式只會在使用Mybatis-plus封裝好的方法時才會有 效,使用自己定義的service並不會生效,這是個坑”。同時,我認為這種方法要求每個表的updateTime都是要在修改的時候改變的。有些情況下,修改個別欄位可能不需要改變。在這樣像切面一樣,一刀切的注入感覺靈活性不夠。

方法二:

自己寫原生的update sql,只修改要修改的欄位,不更改updateTime欄位。這樣子在儲存的時候就會自動更新時間了。

方法三:

利用plus提供的註解,在對應的entity的欄位註解@TableField中加入update = "now()",其中update = "now()"表示使用資料庫時間,輸出 SQL 為:update 表 set 欄位=now() where ...,同時欄位 update set 部分注入,該註解優於 el 註解使用。

使用Mybatis-plus策略自動更新資料庫時間失敗問題解決

圖1.註解書寫示意圖

注意:這種方法在執行updateById的時候有效,執行updateAllColumnById的時候是無效的。updateAllColumnById必須設定時間

總結

我們在生成實體的時候明確知道該表的update_time欄位就是要做自動更新的,那就用方法二所述的plus下TableField註解進行更新。同時注意updateAllColumnById的情況就好。
至於方法一採用的insertFill和updateFill,這種適合全部的情況下的切面。除非在早期就明確了,如果是在中後期突然要增加的,務必確保是之前表中沒有采用的欄位,否則有的時候衝突了,寫入的時候被串改,會導致很難查詢到資料錯誤來源。

到此這篇關於使用Mybatis-plus策略自動更新資料庫時間失敗問題解決的文章就介紹到這了,更多相關Mybatis-plus自動更新資料庫時間內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!