天天看點

如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】

👨‍🎓作者:bug菌

✏️部落格:​​CSDN​​​、​​掘金​​等

💌公衆号:​​猿圈奇妙屋​​

🚫特别聲明:原創不易,轉載請附上原文出處連結和本文聲明,謝謝配合。

🙏版權聲明:文章裡可能部分文字或者圖檔來源于網際網路或者百度百科,如有侵權請聯系bug菌處理。

一、前言🔥

       小夥伴們在批閱文章的過程中如果覺得文章對您有一絲絲幫助,還請别吝啬您手裡的贊呀,大膽的把文章點亮👍吧,您的點贊三連(收藏⭐️+關注👨‍🎓+留言📃)就是對bug菌我創作道路上最好的鼓勵與支援😘。時光不棄🏃🏻‍♀️,創作不停💕,加油☘️

示範環境:idea2019.3 + springboot 2.3.1REALSE + mysql5.6 + jdk1.8

二、摘要 🔥

        給大家看個很匪夷所思的bug!sql執行邏輯也很簡單,使用if test判斷,如果前端傳的參數有對應的test字段,則将其加入到判斷條件中,但是運作結果差強人意。

如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】
如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】

看下控制台sql列印:

如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】
如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】

具體看執行sql的後半段,明顯是沒有拼接auditorStatus 這個字段條件?

如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】
如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】

我給大家看下我自定義xml中真正執行的sql語句。

先請大家見曉:

<if test="model.auditorStatus != null and model.auditorStatus != '' ">
    and a.audit_state = #{model.auditorStatus}
</if>      
如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】

判斷該字段值如果不為null或者不等于' ',就進行該sql 字段條件拼接。

完整截圖如下: 

如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】
如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】

        我害怕是判斷有問題,把auditorStatus 給過濾掉了,于是我再做個測試,我将auditorStatus 值改為1或别的值(除0外),sql竟能成功拼接該auditorStatus 字段。一臉懵b!我???

如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】
如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】

        此時看控制台執行的sql,auditorStatus = 1是被where 條件成功拼接上,最後傳回的結果數也是準确無誤的。

如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】
如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】

         字段指派0就不行,這是為啥啊???見鬼了?

三、問題排查🔥

        後端用Integer接收的0傳入 以model.auditorStatus 這一步進行取值,現在有兩種情況,要麼值沒傳進去被判空false,要麼if判斷 auditorStatus 有值但執行内部邏輯判斷時出了問題,前者肯定可以排除,那就隻剩後者了,花了一刻鐘,查閱相關源碼資料才發現,model.auditorStatus != '' 執行結果竟然真的為false,0 != '',這明顯為true啊。但是啊底層源碼執行卻不是簡單的是0 與 ''的判斷,而是會預設将""和 0 都轉換成double進行比較 都是0.0,這也就是為什麼 auditorStatus為0卻判斷auditorStatus != ' ' 會傳回false。有空的同學可以重點去研究研究哈。

        是以接下來,你們所關心的重點來了,如何去解決這種問題呢?

四、解決方案🔥

1️⃣方案1

        做法:不用Integer接收,使用String類型接收。

2️⃣方案2

        做法:去掉【model.auditorStatus!= ''】 的這條非空判斷.

        而我是直接采取了方式2,如下是去除model.auditorStatus!= ''這條判斷後,model.auditorStatus = 0的情況下,sql也是正常拼接 auditorStatus 這個字段條件。

如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】
如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】

         如下是我修改後再次調用接口debug,給大家看一眼,參數值是否有被 拿到,我這裡也是直接定義為0. 

如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】

如下 是控制台sql列印,大家可以看下: 

如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】
如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】

        最後結果傳回條數也是正确的,很明顯是這一改是沒有問題的。大家也可以自行測試一下。  

... .... 

        好啦,以上就是這期的全部内容啦,如果對你有所幫助,還請不要忘記給bug菌[三連支援]喲。如果想獲得更多的學習資源或者想和更多的技術愛好者一起交流,可以關注我的公衆号『​​猿圈奇妙屋​​』,背景回複關鍵詞領取學習資料、大廠面經、面試模闆等海量資源,就等你來拿。

五、文末🔥

        如果你還想要學習更多,小夥伴們大可關注bug菌專門為你們建立的專欄《bug調優》,都是我一手打下的江山,持續更新中,希望能幫助到更多小夥伴們。

       我是bug菌,一名想走👣出大山改變命運的程式猿。接下來的路還很長,都等待着我們去突破、去挑戰。來吧,小夥伴們,我們一起加油!未來皆可期,fighting!

最後送大家兩句話,與諸君共勉!

☘️做你自己想做的人,沒有時間限制,隻要願意,什麼時候都可以開始。

🍀你能從現在開始改變,也可以一成不變;這件事,沒有規矩可言,你可以活出最精彩的自己。

如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】
如何解決mybatis在xml中傳入Integer整型參數為0時查詢條件失效問題?【親測有效】

💌如果文章對您有所幫助,就請留下您的贊吧!(#^.^#);

💝如果喜歡bug菌分享的文章,就請給bug菌點個關注吧!(๑′ᴗ‵๑)づ╭❤~;

💗如果對文章有任何疑問,還請文末留言或者加群吧。

💞鑒于個人經驗有限,所有觀點及技術研點,如有異議,請直接回複參與讨論(請勿發表言論,謝謝);