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