最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis的if從句中的賦值烏龍

 更新時(shí)間:2025年05月28日 09:27:17   作者:shenzhou_yh  
本文主要介紹了Mybatis的if從句中的賦值烏龍,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

最近遇到一個(gè)有點(diǎn)意思的bug,特此記錄一下。

問(wèn)題背景

前臺(tái)參數(shù):前端請(qǐng)求后臺(tái)接口,上送參數(shù)進(jìn)行查詢(xún),上傳參數(shù)如下:

接口上送參數(shù)

可知上送為兩個(gè)參數(shù):activityType: “3”,merchantId: “3a9d21a0d18a4e1c819dac57b1730992”

  • 后臺(tái)邏輯
String activityType = vo.getActivityType();
		String merchantId = vo.getMerchantId();
		List<TbMarketActivity> activity = activityMapper.getActivityByMerchantId(activityType, merchantId);
  • SQL語(yǔ)句
<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>

后臺(tái)直接使用前臺(tái)參數(shù)進(jìn)行數(shù)據(jù)庫(kù)查詢(xún),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

那么問(wèn)題就來(lái)了,中間并沒(méi)有進(jìn)行任何的上傳參數(shù)處理,但是到了SQL語(yǔ)句中,activity_type的值是2,而不是上傳的3

問(wèn)題分析

排查一:確認(rèn)上送參數(shù)

在這里插入圖片描述

如圖,上傳參數(shù)確實(shí)為3,但是到了sql中還是2,很納悶,確定不是上送參數(shù)的問(wèn)題

  • 排查二:SQL語(yǔ)句
    本次sql并不復(fù)雜,就是一個(gè)簡(jiǎn)單的條件過(guò)濾查詢(xún),而且根據(jù)SQL日志來(lái)看,也已經(jīng)成功綁定了

  • 排查三:特么沒(méi)有可排查的啦,簡(jiǎn)直就沒(méi)找到錯(cuò)誤,暫定為懸案

反思:為啥上傳和代碼處理都正確,但是SQL賦值出現(xiàn)錯(cuò)誤,明明上傳的activityType為3,可最后的條件是2;但又為啥不是其他偏偏是2呢。。。。。。

問(wèn)題解決

問(wèn)題的關(guān)鍵點(diǎn)就在于為啥偏偏是2身上,仔細(xì)看一下sql語(yǔ)句,這個(gè)activityType還是和2產(chǎn)生過(guò)聯(lián)系的。如下:

在這里插入圖片描述

這是一個(gè)簡(jiǎn)單的條件判斷,并決定排序字段的語(yǔ)句,但是中間卻使用了等號(hào)作為判斷條件,顯然這兒是不成立的,大抵已經(jīng)找到原因了。
activityType就是在這個(gè)if判斷語(yǔ)句中,被賦值為2的,即使在Mybatis的初始綁定值為3,那這么說(shuō)的話(huà),activityType不為null時(shí),它的值會(huì)一直為2。
繼續(xù)往下面想,這個(gè)if語(yǔ)句的執(zhí)行順序,應(yīng)該是在執(zhí)行SQL查詢(xún)之前,那可以推斷的是,Mybatis在執(zhí)行SQL時(shí),首先是先將所有的標(biāo)簽轉(zhuǎn)化組裝為SQL,然后在執(zhí)行SQL語(yǔ)句。所以這里就已經(jīng)被賦錯(cuò)了值。

解決辦法也特別簡(jiǎn)單,就是再加一個(gè)=就可以了,標(biāo)準(zhǔn)的判斷語(yǔ)句而已。

補(bǔ)充 :mybatis的映射文件中,使用的是ognl表達(dá)式,所以在字符串進(jìn)行判等的時(shí)候,可使用以下兩種方法

<if test="sex=='Y'.toString()">
或者
<if test = 'sex== "Y"'>

唯獨(dú)不能使用

<if test="sex=='Y'">

因?yàn)閙ybatis會(huì)把’Y’解析為字符,java是強(qiáng)類(lèi)型語(yǔ)言,所以不能這樣寫(xiě)。

總結(jié)

確實(shí)覺(jué)得很有意思,一個(gè)很小的錯(cuò)誤,發(fā)生的那么不經(jīng)意,SQL不報(bào)錯(cuò),頁(yè)面也沒(méi)有錯(cuò)誤,排查起來(lái)確實(shí)費(fèi)了點(diǎn)心,以后寫(xiě)代碼還是得多加注意呀!?。?/p>

到此這篇關(guān)于Mybatis的if從句中的賦值烏龍的文章就介紹到這了,更多相關(guān)Mybatis if從句賦值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • hadoop中實(shí)現(xiàn)java網(wǎng)絡(luò)爬蟲(chóng)(示例講解)

    hadoop中實(shí)現(xiàn)java網(wǎng)絡(luò)爬蟲(chóng)(示例講解)

    下面小編就為大家?guī)?lái)一篇hadoop中實(shí)現(xiàn)java網(wǎng)絡(luò)爬蟲(chóng)(示例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • springboot簡(jiǎn)單集成Security配置的教程

    springboot簡(jiǎn)單集成Security配置的教程

    這篇文章主要介紹了springboot簡(jiǎn)單集成Security配置的教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 關(guān)于java中線(xiàn)程安全問(wèn)題詳解

    關(guān)于java中線(xiàn)程安全問(wèn)題詳解

    最近工作中遇到不少多線(xiàn)程問(wèn)題,但自己一直對(duì)多線(xiàn)程的理解比較表層,所以深入研究了一番,下面這篇文章主要給大家介紹了關(guān)于java中線(xiàn)程安全問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • java 終止線(xiàn)程的4種方式小結(jié)

    java 終止線(xiàn)程的4種方式小結(jié)

    本文主要介紹了java終止線(xiàn)程的4種方式小結(jié),包含布爾標(biāo)志位,interrupt()方法,stop()方法和Thread.interrupt()方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • Spring Boot實(shí)現(xiàn)簡(jiǎn)單的定時(shí)任務(wù)

    Spring Boot實(shí)現(xiàn)簡(jiǎn)單的定時(shí)任務(wù)

    這篇文章主要給大家介紹了關(guān)于利用Spring Boot實(shí)現(xiàn)簡(jiǎn)單的定時(shí)任務(wù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 解決沒(méi)有@RunWith 和 @SpringBootTest注解或失效問(wèn)題

    解決沒(méi)有@RunWith 和 @SpringBootTest注解或失效問(wèn)題

    這篇文章主要介紹了解決沒(méi)有@RunWith 和 @SpringBootTest注解或失效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • IDEA 2022 CPU占用100%的問(wèn)題及解決方法

    IDEA 2022 CPU占用100%的問(wèn)題及解決方法

    這篇文章主要介紹了IDEA 2022 CPU占用100%問(wèn)題及解決方法,其實(shí)解決方法很簡(jiǎn)單,只需要禁用三個(gè)插件然后重啟idea即可成功解決,需要的朋友可以參考下本文
    2022-08-08
  • IntelliJ?IDEA中如何使用Checkstyle對(duì)Java代碼規(guī)范檢查

    IntelliJ?IDEA中如何使用Checkstyle對(duì)Java代碼規(guī)范檢查

    這篇文章主要介紹了IntelliJ IDEA中如何使用Checkstyle對(duì)Java代碼規(guī)范檢查的相關(guān)資料,checkstyle是提高代碼質(zhì)量,檢查代碼規(guī)范的很好用的一款工具,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-03-03
  • SpringCloud?客戶(hù)端Ribbon負(fù)載均衡的實(shí)現(xiàn)方法

    SpringCloud?客戶(hù)端Ribbon負(fù)載均衡的實(shí)現(xiàn)方法

    Ribbon 是 Netflix 提供的一個(gè)基于 Http 和 TCP 的客戶(hù)端負(fù)載均衡工具,且已集成在 Eureka 依賴(lài)中,這篇文章主要介紹了SpringCloud?客戶(hù)端Ribbon負(fù)載均衡的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2022-06-06
  • Java中替代equals,compareTo和toString的方法

    Java中替代equals,compareTo和toString的方法

    這篇文章主要介紹了Java中替代equals,compareTo和toString的方法,文中代碼十分詳細(xì),幫助大家更好的理解的學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06

最新評(píng)論

濮阳县| 天祝| 巨鹿县| 叶城县| 安康市| 海安县| 韩城市| 晋城| 延安市| 松原市| 万荣县| 巴楚县| 辽阳县| 洪江市| 梁河县| 呼伦贝尔市| 察雅县| 阳江市| 西贡区| 天柱县| 神木县| 三河市| 太和县| 乌海市| 汉沽区| 宁河县| 巴彦县| 巢湖市| 河西区| 礼泉县| 忻州市| 纳雍县| 崇义县| 新和县| 鹿邑县| 普陀区| 保德县| 石景山区| 青龙| 曲靖市| 阳城县|