使用Mybatis-plus策略自動(dòng)更新數(shù)據(jù)庫時(shí)間失敗問題解決

引言

在mybatis項(xiàng)目中,我們一般會(huì)使用它的插件plus以擴(kuò)充它的基本查詢功能。另一方面,在阿里巴巴開發(fā)手冊的規(guī)范中也提到,在數(shù)據(jù)庫表創(chuàng)建的時(shí)候,一般會(huì)有一個(gè)create_time和update_time字段,它們的建表語句往往如下:

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

創(chuàng)建者則是希望在行insert的時(shí)候會(huì)自動(dòng)生成create_time,同時(shí)在其它行進(jìn)行修改后,執(zhí)行update操作會(huì)自動(dòng)更新update_time字段。

博主在開發(fā)過程中,首先采用了mybatis plus的selectOne,查詢出某一個(gè)對象XXX,并對其某一值進(jìn)行修改(比如狀態(tài)status從0修改成1),然后想利用數(shù)據(jù)庫的自動(dòng)時(shí)間更新策略,即ON UPDATE CURRENT_TIMESTAMP去自動(dòng)修改時(shí)間。于是用xxxService.updateById(XXX)。

但是,這樣子的更新方法并不會(huì)自動(dòng)更新時(shí)間。因?yàn)閟electOne出來的對象是有一個(gè)明確時(shí)間了,然后update的時(shí)候就會(huì)注入這個(gè)原時(shí)間。

解決辦法

方法一:

自己書寫數(shù)據(jù)庫字段策略,進(jìn)行updateFill(),可以參考:https://fearlessroy.net/2018/03/13/mybatis-plus/
這種方法的確定其博主也說了“注意這種方式只會(huì)在使用Mybatis-plus封裝好的方法時(shí)才會(huì)有 效,使用自己定義的service并不會(huì)生效,這是個(gè)坑”。同時(shí),我認(rèn)為這種方法要求每個(gè)表的updateTime都是要在修改的時(shí)候改變的。有些情況下,修改個(gè)別字段可能不需要改變。在這樣像切面一樣,一刀切的注入感覺靈活性不夠。

方法二:

自己寫原生的update sql,只修改要修改的字段,不更改updateTime字段。這樣子在保存的時(shí)候就會(huì)自動(dòng)更新時(shí)間了。

方法三:

利用plus提供的注解,在對應(yīng)的entity的字段注解@TableField中加入update = "now()",其中update = "now()"表示使用數(shù)據(jù)庫時(shí)間,輸出 SQL 為:update 表 set 字段=now() where ...,同時(shí)字段 update set 部分注入, 該注解優(yōu)于 el 注解使用。


圖1.注解書寫示意圖

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

總結(jié)

我們在生成實(shí)體的時(shí)候明確知道該表的update_time字段就是要做自動(dòng)更新的,那就用方法二所述的plus下TableField注解進(jìn)行更新。同時(shí)注意updateAllColumnById的情況就好。
至于方法一采用的insertFill和updateFill,這種適合全部的情況下的切面。除非在早期就明確了,如果是在中后期突然要增加的,務(wù)必確保是之前表中沒有采用的字段,否則有的時(shí)候沖突了,寫入的時(shí)候被串改,會(huì)導(dǎo)致很難查詢到數(shù)據(jù)錯(cuò)誤來源。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 秭歸好人 韓裕平 好人是什么呢? 就是暗夜里的燈塔,照亮過往船只回家的路;就是家門口高高掛起的紅燈籠;就是雪天一盆...
    秭歸秀才9條命兒閱讀 352評論 0 1
  • 我知道,不是所有的付出有應(yīng)該有回報(bào),但,就是會(huì)生氣生氣╰_╯ 在微博上看過一句話,很喜歡。 知世故...
    半Summer夏閱讀 212評論 0 0
  • 對云南的向往,持續(xù)好多年。曾經(jīng)考慮畢業(yè)旅行去,曾經(jīng)考慮拍婚紗去,曾經(jīng)考慮度蜜月去,最后總是不了了之。但是向往的心,...
    李燕萍閱讀 1,490評論 1 0
  • 幾年家里發(fā)生第一件大喜事就是我家有了雞寶寶,下面給看看我們的小公舉,嘻嘻 哈哈,可愛不,睡覺時(shí)候,她的小手就這樣放...
    幸運(yùn)的馬小樣閱讀 201評論 0 0

友情鏈接更多精彩內(nèi)容