亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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)行查詢,上傳參數(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ù)查詢,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ò)濾查詢,而且根據(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ō)的話,activityType不為null時(shí),它的值會(huì)一直為2。
繼續(xù)往下面想,這個(gè)if語(yǔ)句的執(zhí)行順序,應(yīng)該是在執(zhí)行SQL查詢之前,那可以推斷的是,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)類型語(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ě)代碼還是得多加注意呀?。?!

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

相關(guān)文章

  • 簡(jiǎn)單談一談Java中的Unsafe類

    簡(jiǎn)單談一談Java中的Unsafe類

    其實(shí)Java官方不推薦使用Unsafe類,因?yàn)楣俜秸J(rèn)為,這個(gè)類別人很難正確使用,非正確使用會(huì)給JVM帶來(lái)致命錯(cuò)誤。但還是要會(huì)使用,下面這篇文章就來(lái)給大家簡(jiǎn)單的談一談關(guān)于Java中Unsafe類的相關(guān)資料,需要的朋友可以參考下
    2018-05-05
  • SpringBoot整合Shiro框架,實(shí)現(xiàn)用戶權(quán)限管理

    SpringBoot整合Shiro框架,實(shí)現(xiàn)用戶權(quán)限管理

    Apache Shiro是一個(gè)強(qiáng)大且易用的Java安全框架,執(zhí)行身份驗(yàn)證、授權(quán)、密碼和會(huì)話管理。作為一款安全框架Shiro的設(shè)計(jì)相當(dāng)巧妙。Shiro的應(yīng)用不依賴任何容器,它不僅可以在JavaEE下使用,還可以應(yīng)用在JavaSE環(huán)境中。
    2021-06-06
  • 最大子數(shù)組和Java實(shí)現(xiàn)代碼示例

    最大子數(shù)組和Java實(shí)現(xiàn)代碼示例

    這篇文章主要介紹了最大子數(shù)組和Java實(shí)現(xiàn)的相關(guān)資料,文中介紹了兩種方法來(lái)解決尋找具有最大和的連續(xù)子數(shù)組的問(wèn)題,第一種方法是動(dòng)態(tài)規(guī)劃,第二種方法是分治法,需要的朋友可以參考下
    2024-11-11
  • java開(kāi)發(fā)flyway的方法

    java開(kāi)發(fā)flyway的方法

    這篇文章主要介紹了java開(kāi)發(fā)flyway的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • java 數(shù)據(jù)結(jié)構(gòu)之刪除鏈表中的元素實(shí)例代碼

    java 數(shù)據(jù)結(jié)構(gòu)之刪除鏈表中的元素實(shí)例代碼

    這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu)之刪除鏈表中的元素實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • spring boot application properties配置實(shí)例代碼詳解

    spring boot application properties配置實(shí)例代碼詳解

    本文通過(guò)代碼給大家介紹了spring boot application properties配置方法,需要的的朋友參考下吧
    2017-07-07
  • Java中@DS+@Transactional注解切換數(shù)據(jù)源失效解決方案

    Java中@DS+@Transactional注解切換數(shù)據(jù)源失效解決方案

    本文主要介紹了@DS+@Transactional注解切換數(shù)據(jù)源失效解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • java運(yùn)行windows的cmd命令簡(jiǎn)單代碼

    java運(yùn)行windows的cmd命令簡(jiǎn)單代碼

    這篇文章主要介紹了java運(yùn)行windows的cmd命令簡(jiǎn)單代碼,有需要的朋友可以參考一下
    2013-12-12
  • java  異常詳解及應(yīng)用實(shí)例

    java 異常詳解及應(yīng)用實(shí)例

    這篇文章主要介紹了java 異常詳解及應(yīng)用實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 一步步教你把SpringBoot項(xiàng)目打包成Docker鏡像

    一步步教你把SpringBoot項(xiàng)目打包成Docker鏡像

    Docker可以讓開(kāi)發(fā)者打包他們的應(yīng)用以及依賴包到一個(gè)輕量級(jí)、可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化,下面這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目打包成Docker鏡像的相關(guān)資料,需要的朋友可以參考下
    2023-02-02

最新評(píng)論