如何解决mybatis在xml中传入Integer整型参数为0时查询条件失效问题?【亲测有效】

845 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

👨‍🎓作者:bug菌

✏️博客:CSDN掘金

💌公众号:猿圈奇妙屋

🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。

🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。

一、前言🔥

       哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又6月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是6月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。

       小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨‍🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻‍♀️,创作不停💕,加油☘️

二、环境说明🔥

**环境:**idea2019.3 + springboot 2.3.1REALSE + mysql5.6 + jdk1.8

三、摘要🔥

       给大家看个很匪夷所思的bug!sql执行逻辑也很简单,使用if test判断,如果前端传的参数有对应的test字段,则将其加入到判断条件中,但是运行结果差强人意。

看下控制台sql打印:

具体看执行sql的后半段,明显是没有拼接auditorStatus 这个字段条件?

我给大家看下我自定义xml中真正执行的sql语句。

先请大家见晓:

<if test="model.auditorStatus != null and model.auditorStatus != '' ">
    and a.audit_state = #{model.auditorStatus}
</if>

       判断该字段值如果不为null或者不等于' ',就进行该sql 字段条件拼接。

完整截图如下:

       我害怕是判断有问题,把auditorStatus 给过滤掉了,于是我再做个测试,我将auditorStatus 值改为1或别的值(除0外),sql竟能成功拼接该auditorStatus 字段。一脸懵b!我???

       此时看控制台执行的sql,auditorStatus = 1是被where 条件成功拼接上,最后返回的结果数也是准确无误的。

字段赋值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 这个字段条件。

       如下是我修改后再次调用接口debug,给大家看一眼,参数值是否有被 拿到,我这里也是直接定义为0.

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

       最后结果返回条数也是正确的,很明显是这一改是没有问题的。大家也可以自行测试一下。

​... ...

       ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~

六、往期推荐🔥

七、文末🔥

       如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入 门》,从无到有,从零到一!希望能帮到大家。

       我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

最后送大家两句我很喜欢的话,与诸君共勉!

**************************************************

☘️做你想做的人,没有时间限制,只要愿意,什么时候都可以start,

🍀你能从现在开始改变,也可以一成不变,这件事,没有规矩可言,你可以活出最精彩的自己。

**************************************************

💌如果文章对您有所帮助,就请留下您的吧!(#^.^#);

💝如果喜欢bug菌分享的文章,就请给bug菌点个关注吧!(๑′ᴗ‵๑)づ╭❤~;

💗如果对文章有任何疑问,还请文末留言或者加群吧【QQ交流群:708072830】;

💞鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复参与讨论(请勿发表攻击言论,谢谢);

💕版权声明:原创不易,转载请附上原文出处链接和本文声明,版权所有,盗版必究!!!谢谢。