關(guān)于Mybatis-Plus字段策略與數(shù)據(jù)庫(kù)自動(dòng)更新時(shí)間的一些問(wèn)題
字段策略 0:”忽略判斷”,1:”非 NULL 判斷”),2:”非空判斷”
問(wèn)題描述:
當(dāng)字段策略為 0 “忽略判斷” 的時(shí)候,如果實(shí)體和數(shù)據(jù)庫(kù)有字段是需要自動(dòng)更新的,例如update_time,更新某條記錄的時(shí)候自動(dòng)刷新update_time,理論上我們?cè)跇I(yè)務(wù)控制的時(shí)候是不需要設(shè)置update_time的,利用數(shù)據(jù)庫(kù)特性就好,但是在該字段策略下,業(yè)務(wù)邏輯要更新字段(沒有主動(dòng)設(shè)置 update_time),這時(shí)候因?yàn)楹雎耘袛?,?shù)據(jù)庫(kù)(我這里是MySql)是不會(huì)去更新update_time的,即使這個(gè)字段在數(shù)據(jù)庫(kù)中是這樣定義的:update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE,在這種字段策略下,該字段會(huì)被設(shè)為null,具體的執(zhí)行語(yǔ)句時(shí)insert into table(….,update_time) values(…,null)。
解決方法
實(shí)現(xiàn)MetaObjectHandler的insertFill()方法和updateFill()方法
@Component public class MyMetaObjectHandler extends MetaObjectHandler { //新增填充 @Override public void insertFill(MetaObject metaObject){ // 獲取當(dāng)前時(shí)間,自動(dòng)更新以下數(shù)據(jù)庫(kù)字段 setFieldValByName("updateTime", new Date(), metaObject); } //更新填充 @Override public void updateFill(MetaObject metaObj ct) { // 獲取當(dāng)前時(shí)間,自動(dòng)更新以下數(shù)據(jù)庫(kù)字段 setFieldValByName("updateTime", new Date(), metaObject); } }
新增一個(gè)Component,繼承MetaObjectHandler,重寫 insertFill()和updateFill()兩個(gè)方法,自定義插入和更新規(guī) 則,繼承基類中的這兩個(gè)方法都為空。
注意這種方式只會(huì)在使用Mybatis-plus封裝好的方法時(shí)才會(huì)有 效,使用自己定義的service并不會(huì)生效,這是個(gè)坑,所以這種 方式我并不推薦。
將字段策略設(shè)為 2 “非空判斷”
這時(shí)候,無(wú)論是插入還是更新語(yǔ)句都只會(huì)完成對(duì)已設(shè)置具體值得屬性進(jìn)行操作。例如:表中除了update_time以外,還有user_name字段,我們?cè)诖a中設(shè)置了這個(gè)字段的值,那么在insert的時(shí)候執(zhí)行的語(yǔ)句是: insert into table (user_name) valuse(userName),而不會(huì)去對(duì)沒有設(shè)置值得字段做任何操作,這樣,有關(guān)時(shí)間的字段就可以直接交給數(shù)據(jù)庫(kù)了。
字段策略為 ““非空判斷”” 的一個(gè)問(wèn)題
假設(shè)有個(gè)Entity User,這個(gè)Entity屬性沒有默認(rèn)值,我們 new 一個(gè)實(shí)例,User user = new User(),然后啥也沒做,調(diào)用UserService.insert(),這時(shí)候就會(huì)出現(xiàn)一個(gè)問(wèn)題,Mybatis-plus不知道你想插入哪些值,因?yàn)闆]有顯示setter,這是一個(gè)需要注意的問(wèn)題。
到此這篇關(guān)于關(guān)于Mybatis-Plus字段策略與數(shù)據(jù)庫(kù)自動(dòng)更新時(shí)間的一些問(wèn)題的文章就介紹到這了,更多相關(guān)Mybatis-Plus 字段策略內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot用JdbcTemplates操作Mysql實(shí)例代碼詳解
JdbcTemplate是Spring框架自帶的對(duì)JDBC操作的封裝,目的是提供統(tǒng)一的模板方法使對(duì)數(shù)據(jù)庫(kù)的操作更加方便、友好,效率也不錯(cuò),這篇文章主要介紹了SpringBoot用JdbcTemplates操作Mysql2022-10-10SpringBoot利用Redis解決海量重復(fù)提交問(wèn)題
本文主要介紹了SpringBoot利用Redis解決海量重復(fù)提交問(wèn)題,介紹了三種常見的解決方案,包括使用Redis計(jì)數(shù)器,使用Redis分布式鎖和使用Redis發(fā)布/訂閱機(jī)制,感興趣的可以了解一下2024-03-03Java多線程編程中synchronized關(guān)鍵字的基礎(chǔ)用法講解
Java的synchronized關(guān)鍵字用于修飾線程同步,用以線程資源共享的目的等,下面就帶來(lái)簡(jiǎn)單的Java多線程編程中synchronized關(guān)鍵字的基礎(chǔ)用法講解2016-06-06在SpringBoot環(huán)境中使用Mockito進(jìn)行單元測(cè)試的示例詳解
Mockito特別適用于在Spring Boot環(huán)境中進(jìn)行單元測(cè)試,因?yàn)樗軌蜉p松模擬Spring應(yīng)用中的服務(wù)、存儲(chǔ)庫(kù)、客戶端和其他組件,通過(guò)使用Mockito,開發(fā)者可以模擬外部依賴,從而使單元測(cè)試更加獨(dú)立和可靠,本文給大家介紹了在Spring Boot環(huán)境中使用Mockito進(jìn)行單元測(cè)試2024-01-01java返回的List進(jìn)行add操作報(bào)錯(cuò)
本文主要介紹了java返回的List進(jìn)行add操作報(bào)錯(cuò),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06詳解通過(guò)maven運(yùn)行項(xiàng)目的兩種方式
這篇文章主要介紹了通過(guò)maven運(yùn)行項(xiàng)目的兩種方式,給大家提到了通過(guò)tomcat的方式來(lái)啟動(dòng)maven項(xiàng)目的方法,通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12Java中使用Hutool的DsFactory操作多數(shù)據(jù)源的實(shí)現(xiàn)
在Java開發(fā)中,管理多個(gè)數(shù)據(jù)源是一項(xiàng)常見需求,Hutool作為一個(gè)全能的Java工具類庫(kù),提供了DsFactory工具,幫助開發(fā)者便捷地操作多數(shù)據(jù)源,感興趣的可以了解一下2024-09-09