使用Mybatis-plus更新null字段的問題分析及解決過程
一、起因
業(yè)務(wù)需要對(duì)Oracle數(shù)據(jù)庫(kù)的某個(gè)字段進(jìn)行set為Null的操作。
網(wǎng)上找了很多帖子,不外乎那么幾種解決辦法,但都講的不完全對(duì),而且對(duì)我的場(chǎng)景不適用,大白話就是沒用!
二、網(wǎng)上的解決方案,我這里不適用
1.全局配置:這種方案不考慮,因?yàn)橹挥羞@個(gè)表的這個(gè)字段需要更新為null,其他的表字段不需要更新null
2.在要更新為null的字段上加上注解 strategy = FieldStrategy.IGNORED。
這個(gè)值默認(rèn)是要進(jìn)行非空檢查的,來(lái)看源碼:
//字段策略枚舉類
public enum FieldStrategy {
IGNORED(0, "忽略判斷"),
NOT_NULL(1, "非 NULL 判斷"),
NOT_EMPTY(2, "非空判斷");
//省略部分代碼
}我們要的效果是此處忽略非空檢查,所以應(yīng)該如下配置:
@TableField(value = "BIRTHDAY",strategy = FieldStrategy.IGNORED) private Date birthday;
這里要說(shuō)一句,其實(shí)全局配置也是更改這個(gè)默認(rèn)值,但你改了全局,你覺得行嗎?不行滴,小兄弟?。?!
重點(diǎn)來(lái)了,網(wǎng)上的教程都是到這里就OK了,但不好意思,我的配置了之后依然報(bào)錯(cuò)。不行啊,大兄弟?。?!
三、真正的解決之道,完美
配置了上面的選項(xiàng)后,依然報(bào)錯(cuò),提示javaType的類型是other,看了一下源碼,果然javaType的默認(rèn)值是other。
接下來(lái)重點(diǎn)又來(lái)了,對(duì)于如何配置javaType,網(wǎng)上的解決方案是自己寫sql語(yǔ)句,在sql里面指定javaType,如下所示:
<insert id="save" parameterType="com.tarena.entity.Cost">
insert into cost values(
cost_seq.nextval,
#{name,jdbcType=VARCHAR},
#{base_duration,jdbcType=INTEGER},
#{base_cost,jdbcType=DOUBLE}
)
</insert>這種方案我沒嘗試,應(yīng)該是可以的。但是,但是,但是,我們?yōu)槭裁匆肕ybatis Plus嗎,大家想想,不就是為了不寫SQL嗎,如果要寫SQL我還廢什么話,寫SQL他也不會(huì)給我報(bào)上面的錯(cuò)誤。所以,任性,我就是不想寫SQL,那么,下面就是終極解決方案。
Mybatis Plus支持通過el表達(dá)式指定javaType。先來(lái)看下源碼怎么說(shuō)的,源碼里面說(shuō)的很清楚了。
/**
* <p>
* 當(dāng)該Field為類對(duì)象時(shí), 可使用#{對(duì)象.屬性}來(lái)映射到數(shù)據(jù)表.
* </p>
* <p>
* 支持:@TableField(el = "role, jdbcType=BIGINT)<br>
* 支持:@TableField(el = "role, typeHandler=com.baomidou.springcloud.typehandler.PhoneTypeHandler")
* </p>
*/
String el() default "";還是不知道怎么用?
看最終的配置方式1
/** 檢驗(yàn)結(jié)果單位(碼值:lab_result_unit)*/ @TableField(value="lab_result_unit",strategy = FieldStrategy.IGNORED,el = "labResultUnit,jdbcType=DECIMAL") private Integer labResultUnit;
最終配置方式2
修改application.yml:
mybatis-plus:
configuration:
jdbc-type-for-null: 'null' #注意:?jiǎn)我?hào)網(wǎng)上很多文章都針對(duì)自己的場(chǎng)景能解決問題,但真的還是具體問題需要具體分析,最終才能找到適合自己?jiǎn)栴}的解決之道。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于Synchronized和ReentranLock的區(qū)別及說(shuō)明
文章介紹了Java中的`synchronized`關(guān)鍵字和`ReentrantLock`類,兩者都可以用于解決多線程同步問題,但`ReentrantLock`提供了更多的功能和靈活性2024-12-12
SpringBoot啟動(dòng)時(shí)如何修改上下文
本文介紹了如何在Spring Boot啟動(dòng)時(shí)修改上下文,以便加載封裝JAR中的國(guó)際化文件,通過在resources目錄下的META-INF文件夾中的spring.factories文件中配置指定類,可以實(shí)現(xiàn)這一功能2024-11-11
springcloud中Feign超時(shí)提示Read timed out executing
Feign接口調(diào)用分兩層,Ribbon的調(diào)用和Hystrix調(diào)用,理論上設(shè)置Ribbon的時(shí)間即可,但是Ribbon的超時(shí)時(shí)間和Hystrix的超時(shí)時(shí)間需要結(jié)合起來(lái),這篇文章給大家介紹springcloud之Feign超時(shí)提示Read timed out executing POST問題及解決方法,感興趣的朋友一起看看吧2024-01-01
idea如何自動(dòng)生成serialVersionUID
這篇文章主要介紹了idea如何自動(dòng)生成serialVersionUID,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
Spring Boot Starter中Bean 注冊(cè)與屬性綁定的兩大機(jī)制最佳實(shí)踐方案
在 Spring Boot的世界里,Starter(啟動(dòng)器)是簡(jiǎn)化依賴管理和自動(dòng)化配置的強(qiáng)大工具,本文將深入探討 Spring Boot Starter 中 Bean 初始化的核心機(jī)制,并指出最佳實(shí)踐,感興趣的朋友跟隨小編一起看看吧2025-10-10
SpringBoot 中html的頁(yè)面間跳轉(zhuǎn)問題小結(jié)
這篇文章主要介紹了SpringBoot 中html的頁(yè)面間跳轉(zhuǎn)問題小結(jié),本文給大家分享兩種方法,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
Spring?Data?Jpa?復(fù)雜查詢方式總結(jié)(多表關(guān)聯(lián)及自定義分頁(yè))
這篇文章主要介紹了Spring?Data?Jpa?復(fù)雜查詢方式總結(jié)(多表關(guān)聯(lián)及自定義分頁(yè)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
基于SpringBoot和MongoDB實(shí)現(xiàn)實(shí)時(shí)分析和日志處理功能
實(shí)時(shí)分析和日志處理在現(xiàn)代應(yīng)用程序開發(fā)中扮演著重要的角色,MongoDB是一個(gè)非常流行的NoSQL數(shù)據(jù)庫(kù),其高性能和靈活性使其成為實(shí)時(shí)分析和日志處理的理想選擇,本文將介紹如何使用?Spring?Boot?和?MongoDB?實(shí)現(xiàn)實(shí)時(shí)分析和日志處理的功能2023-06-06

