您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Mybatis-Plus字段策略與數據庫自動更新時間,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
字段策略 0:”忽略判斷”,1:”非 NULL 判斷”),2:”非空判斷”
問題描述:
當字段策略為 0 “忽略判斷” 的時候,如果實體和數據庫有字段是需要自動更新的,例如update_time,更新某條記錄的時候自動刷新update_time,理論上我們在業務控制的時候是不需要設置update_time的,利用數據庫特性就好,但是在該字段策略下,業務邏輯要更新字段(沒有主動設置 update_time),這時候因為忽略判斷,數據庫(我這里是MySql)是不會去更新update_time的,即使這個字段在數據庫中是這樣定義的:update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE,在這種字段策略下,該字段會被設為null,具體的執行語句時insert into table(….,update_time) values(…,null)。
解決方法
實現MetaObjectHandler的insertFill()方法和updateFill()方法
@Component public class MyMetaObjectHandler extends MetaObjectHandler { //新增填充 @Override public void insertFill(MetaObject metaObject){ // 獲取當前時間,自動更新以下數據庫字段 setFieldValByName("updateTime", new Date(), metaObject); } //更新填充 @Override public void updateFill(MetaObject metaObj ct) { // 獲取當前時間,自動更新以下數據庫字段 setFieldValByName("updateTime", new Date(), metaObject); } }
新增一個Component,繼承MetaObjectHandler,重寫 insertFill()和updateFill()兩個方法,自定義插入和更新規 則,繼承基類中的這兩個方法都為空。
注意這種方式只會在使用Mybatis-plus封裝好的方法時才會有 效,使用自己定義的service并不會生效,這是個坑,所以這種 方式我并不推薦。
將字段策略設為 2 “非空判斷”
這時候,無論是插入還是更新語句都只會完成對已設置具體值得屬性進行操作。例如:表中除了update_time以外,還有user_name字段,我們在代碼中設置了這個字段的值,那么在insert的時候執行的語句是: insert into table (user_name) valuse(userName),而不會去對沒有設置值得字段做任何操作,這樣,有關時間的字段就可以直接交給數據庫了。
字段策略為 ““非空判斷”” 的一個問題
假設有個Entity User,這個Entity屬性沒有默認值,我們 new 一個實例,User user = new User(),然后啥也沒做,調用UserService.insert(),這時候就會出現一個問題,Mybatis-plus不知道你想插入哪些值,因為沒有顯示setter,這是一個需要注意的問題。
看完上述內容,你們對Mybatis-Plus字段策略與數據庫自動更新時間有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。