mybatis寫xml時(shí)數(shù)字類型千萬別用 !=‘‘(不為空串)進(jìn)行判斷的示例詳解
前言
最近項(xiàng)目內(nèi)更新數(shù)據(jù)時(shí),發(fā)現(xiàn)數(shù)字類型字段設(shè)置為0時(shí)不能正常的更新進(jìn)數(shù)據(jù)庫,我們打印了下mybatis的sql日志發(fā)現(xiàn)字段為0的sql沒有被拼接。
樣例
下面的是錯(cuò)誤示例 ❌
<update id="update" parameterType="com.chengfengfeng.test.domain.People">
update people
set
<if test="age!=null and age !=''">
age=#{age},
</if>,
modified = sysdate()
where user_id = #{userId}
</update>
age是個(gè)int類型的數(shù)據(jù),我們在寫age判斷的時(shí)候就增加上了判斷age!='',這個(gè)是存在問題的。
正確的示例 ✅
<update id="update" parameterType="com.chengfengfeng.test.domain.People">
update people
set
<if test="age!=null">
age=#{age},
</if>,
modified = sysdate()
where user_id = #{userId}
</update>
原因是什么呢
跟蹤了下代碼,發(fā)現(xiàn)在解析xml時(shí)數(shù)字類型會(huì)走下面的判斷
public abstract class OgnlOps implements NumericTypes {
//省略其他無用代碼
public static double doubleValue(Object value) throws NumberFormatException {
if (value == null) {
return 0.0D;
} else {
Class c = value.getClass();
if (c.getSuperclass() == Number.class) {
return ((Number)value).doubleValue();
} else if (c == Boolean.class) {
return (Boolean)value ? 1.0D : 0.0D;
} else if (c == Character.class) {
return (double)(Character)value;
} else {
String s = stringValue(value, true);
//這個(gè)位置會(huì)把'‘空串處理成0
return s.length() == 0 ? 0.0D : Double.parseDouble(s);
}
}
}
}
我們看上面最后一段代碼,會(huì)把''轉(zhuǎn)換成0.0D,那么我們的最開始的if判斷就變成了age != 0,所以當(dāng)我們把a(bǔ)ge設(shè)置為0時(shí),結(jié)果就變成了false,導(dǎo)致sql不會(huì)進(jìn)行拼接,更新數(shù)據(jù)失敗。
到此這篇關(guān)于mybatis寫xml時(shí)數(shù)字類型千萬別用 !=‘‘(不為空串)進(jìn)行判斷的示例詳解的文章就介紹到這了,更多相關(guān)mybatis寫xml數(shù)字類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解springboot如何更新json串里面的內(nèi)容
這篇文章主要為大家介紹了springboot 如何更新json串里面的內(nèi)容,文中有詳細(xì)的解決方案供大家參考,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-10-10
Spring項(xiàng)目接入DeepSeek的兩種超簡單的方式分享
DeepSeek?作為一款卓越的國產(chǎn)?AI?模型,越來越多的公司考慮在自己的應(yīng)用中集成,本文為大家?分享了Spring項(xiàng)目接入DeepSeek的兩種超簡單的方式,希望對大家有所幫助2025-02-02
spring使用Filter過濾器對Response返回值進(jìn)行修改的方法
這篇文章主要介紹了spring使用Filter過濾器對Response返回值進(jìn)行修改,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
Java實(shí)現(xiàn)圖章或簽名插在pdf的固定位置
使用Java技術(shù)在word轉(zhuǎn)換成pdf過程中實(shí)現(xiàn)將圖章或者簽名插入在pdf中,并生成帶圖章或者簽名的pdf,來完成某些特定場景的需求,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-10-10
Spring如何基于Proxy及cglib實(shí)現(xiàn)動(dòng)態(tài)代理
這篇文章主要介紹了Spring如何基于Proxy及cglib實(shí)現(xiàn)動(dòng)態(tài)代理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Spring Boot 中的 @EnableDiscoveryClient 注解
@EnableDiscoveryClient 注解是 Spring Boot 應(yīng)用程序注冊到服務(wù)注冊中心的關(guān)鍵注解,這篇文章主要介紹了Spring Boot 中的 @EnableDiscoveryClient 注解,需要的朋友可以參考下2023-07-07
springboot中swagger、異步/定時(shí)/郵件任務(wù)的問題
這篇文章主要介紹了springboot中swagger、異步/定時(shí)/郵件任務(wù)的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07

