mybatis的坑-integer類型為0的數(shù)據(jù)if?test失效問題
integer類型為0的數(shù)據(jù)if test失效
mybatis的where動(dòng)態(tài)判斷語句if test 遇到tinyint類型為0的數(shù)據(jù)失效
發(fā)現(xiàn)一個(gè)mybatis的坑,有個(gè)支付表,通過狀態(tài)去篩選已支付/未支付的數(shù)據(jù),支付狀態(tài)用status字段表示,status=0表示未支付,status=1表示已支付,且status類型為Integer。當(dāng)選擇已支付即status=1時(shí),可以篩選成功已支付的數(shù)據(jù)列表,但是當(dāng)選擇未支付即status=0時(shí),查出來的數(shù)據(jù)是未支付和已支付的所有數(shù)據(jù)。
此時(shí)就有點(diǎn)懵逼了,后面debug一層層去追蹤,發(fā)現(xiàn)status=0時(shí),mybatis構(gòu)建的sql中where條件沒有把status字段拼接上去,但是status=1時(shí),sql中可以看到where中有status字段。
經(jīng)過后面找資料發(fā)現(xiàn),integer類型的字段,在mybatis中的if test 條件中,會(huì)把值為0的當(dāng)成false處理,因?yàn)闀?huì)將integer=0的參數(shù)默認(rèn)為‘’(空串),即status=0的判斷結(jié)果為false,所以未支付的條件永遠(yuǎn)不可能出現(xiàn),查出來的數(shù)據(jù)就是所有狀態(tài)的數(shù)據(jù)。
以下圖為出錯(cuò)時(shí)的語句:
<where> <trim prefixOverrides="and"> <if test="status != null and status !=''">and status=#{status}</if> <if test="createdDtBegin != null">and created_dt <![CDATA[ >= ]]> #{createdDtBegin, jdbcType=TIMESTAMP} </if> <if test="createdDtEnd != null">and created_dt <![CDATA[ <= ]]> #{createdDtEnd, jdbcType=TIMESTAMP} </if> </trim> </where>
解決方式
改成 **<if test=“status != null”>and status=#{status, jdbcType=TINYINT}</if>
這樣即可,即把 status != ''去掉
或者還有一種做法,即:
如果status為integer,<if test=“status != null and status != -1”>或者:如果status為integer,<if test=“status != null and status != ‘’ or status == 0”>
mybatis if 判斷 Integer 類型的坑
當(dāng)POJO中的屬性類型為 Integer 時(shí),傳入 0,此時(shí)在 xxxMapper.xml的 if 判斷中總是不能滿足條件,進(jìn)而導(dǎo)致查詢條件無效,這是因?yàn)?mybatis 針對(duì) integer 類型的 0 進(jìn)行了特殊處理,當(dāng)成了 ‘’ 來處理,進(jìn)行如下判斷即可:
payStatus 為 Integer 類型
<if test="payStatus != null and payStatus != '' or payStatus == 0"> ? ? and a.pay_status = #{payStatus} </if>
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot整合mybatis實(shí)現(xiàn)多表查詢的實(shí)戰(zhàn)記錄
SpringBoot對(duì)數(shù)據(jù)庫(kù)操作有多種方式,下面這篇文章主要給大家介紹了關(guān)于springboot整合mybatis實(shí)現(xiàn)多表查詢的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下2021-08-08如何基于springcloud模擬RPC調(diào)用(Feign)
這篇文章主要介紹了如何基于springcloud模擬RPC調(diào)用(Feign),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04RocketMQ之NameServer架構(gòu)設(shè)計(jì)及啟動(dòng)關(guān)閉流程源碼分析
這篇文章主要為大家介紹了RocketMQ之NameServer架構(gòu)設(shè)計(jì)及啟動(dòng)關(guān)閉流程源碼分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11