Mybatis的if從句中的賦值烏龍
最近遇到一個有點意思的bug,特此記錄一下。
問題背景
前臺參數(shù):前端請求后臺接口,上送參數(shù)進行查詢,上傳參數(shù)如下:

可知上送為兩個參數(shù):activityType: “3”,merchantId: “3a9d21a0d18a4e1c819dac57b1730992”
- 后臺邏輯
String activityType = vo.getActivityType(); String merchantId = vo.getMerchantId(); List<TbMarketActivity> activity = activityMapper.getActivityByMerchantId(activityType, merchantId);
- SQL語句
<select id="getActivityByMerchantId"
resultType="cn.buyforyou.aipc.small.api.entity.marketActivity.TbMarketActivity">
SELECT
<include refid="tbMarketActivityColumns"/>,
b.product_discount as "productDiscount"
FROM
tb_market_activity a
left join tb_market_activity_product b on a.activity_id = b.activity_id
<where>
a.status = '2'
and a.activity_type = #{activityType}
and a.merchant_id = #{merchantId}
</where>
<if test="activityType != null and activityType = '2'.toString()">
order by product_discount
</if>
limit 1
</select>
后臺直接使用前臺參數(shù)進行數(shù)據(jù)庫查詢,sql日志如下:
==> Preparing: SELECT a.activity_id AS "activityId", b.product_discount as "productDiscount" FROM tb_market_activity a left join tb_market_activity_product b on a.activity_id = b.activity_id WHERE a.status = '2' and a.activity_type = ? and a.merchant_id = ? order by product_discount limit 1 ==> Parameters: 2(String), 3a9d21a0d18a4e1c819dac57b1730992(String) <== Total: 0
那么問題就來了,中間并沒有進行任何的上傳參數(shù)處理,但是到了SQL語句中,activity_type的值是2,而不是上傳的3
問題分析
排查一:確認上送參數(shù)

如圖,上傳參數(shù)確實為3,但是到了sql中還是2,很納悶,確定不是上送參數(shù)的問題
排查二:SQL語句
本次sql并不復(fù)雜,就是一個簡單的條件過濾查詢,而且根據(jù)SQL日志來看,也已經(jīng)成功綁定了排查三:特么沒有可排查的啦,簡直就沒找到錯誤,暫定為懸案
反思:為啥上傳和代碼處理都正確,但是SQL賦值出現(xiàn)錯誤,明明上傳的activityType為3,可最后的條件是2;但又為啥不是其他偏偏是2呢。。。。。。
問題解決
問題的關(guān)鍵點就在于為啥偏偏是2身上,仔細看一下sql語句,這個activityType還是和2產(chǎn)生過聯(lián)系的。如下:

這是一個簡單的條件判斷,并決定排序字段的語句,但是中間卻使用了等號作為判斷條件,顯然這兒是不成立的,大抵已經(jīng)找到原因了。
activityType就是在這個if判斷語句中,被賦值為2的,即使在Mybatis的初始綁定值為3,那這么說的話,activityType不為null時,它的值會一直為2。
繼續(xù)往下面想,這個if語句的執(zhí)行順序,應(yīng)該是在執(zhí)行SQL查詢之前,那可以推斷的是,Mybatis在執(zhí)行SQL時,首先是先將所有的標簽轉(zhuǎn)化組裝為SQL,然后在執(zhí)行SQL語句。所以這里就已經(jīng)被賦錯了值。
解決辦法也特別簡單,就是再加一個=就可以了,標準的判斷語句而已。
補充 :mybatis的映射文件中,使用的是ognl表達式,所以在字符串進行判等的時候,可使用以下兩種方法
<if test="sex=='Y'.toString()"> 或者 <if test = 'sex== "Y"'>
唯獨不能使用
<if test="sex=='Y'">
因為mybatis會把’Y’解析為字符,java是強類型語言,所以不能這樣寫。
總結(jié)
確實覺得很有意思,一個很小的錯誤,發(fā)生的那么不經(jīng)意,SQL不報錯,頁面也沒有錯誤,排查起來確實費了點心,以后寫代碼還是得多加注意呀?。?!
到此這篇關(guān)于Mybatis的if從句中的賦值烏龍的文章就介紹到這了,更多相關(guān)Mybatis if從句賦值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
hadoop中實現(xiàn)java網(wǎng)絡(luò)爬蟲(示例講解)
下面小編就為大家?guī)硪黄猦adoop中實現(xiàn)java網(wǎng)絡(luò)爬蟲(示例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
Spring Boot實現(xiàn)簡單的定時任務(wù)
這篇文章主要給大家介紹了關(guān)于利用Spring Boot實現(xiàn)簡單的定時任務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用Spring Boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2020-07-07
解決沒有@RunWith 和 @SpringBootTest注解或失效問題
這篇文章主要介紹了解決沒有@RunWith 和 @SpringBootTest注解或失效問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
IntelliJ?IDEA中如何使用Checkstyle對Java代碼規(guī)范檢查
這篇文章主要介紹了IntelliJ IDEA中如何使用Checkstyle對Java代碼規(guī)范檢查的相關(guān)資料,checkstyle是提高代碼質(zhì)量,檢查代碼規(guī)范的很好用的一款工具,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2026-03-03
SpringCloud?客戶端Ribbon負載均衡的實現(xiàn)方法
Ribbon 是 Netflix 提供的一個基于 Http 和 TCP 的客戶端負載均衡工具,且已集成在 Eureka 依賴中,這篇文章主要介紹了SpringCloud?客戶端Ribbon負載均衡的實現(xiàn)方法,需要的朋友可以參考下2022-06-06
Java中替代equals,compareTo和toString的方法
這篇文章主要介紹了Java中替代equals,compareTo和toString的方法,文中代碼十分詳細,幫助大家更好的理解的學習,感興趣的朋友可以了解下2020-06-06

