前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何解决mybatis在xml中传入Integer整型参数为0时查询条件失效问题?【亲测有效】

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

作者头像
bug菌
发布2023-05-27 15:04:03
9450
发布2023-05-27 15:04:03
举报
文章被收录于专栏:《项目实战教学》

👨‍🎓作者:bug菌 ✏️博客:​​CSDN​​​、​​掘金​​等 💌公众号:​​猿圈奇妙屋​​ 🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。 🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。

一、前言🔥

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

二、摘要 🔥

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

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

看下控制台sql打印:

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

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

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

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

先请大家见晓:

代码语言:javascript
复制
<if test="model.auditorStatus != null and model.auditorStatus != '' ">
    and a.audit_state = #{model.auditorStatus}
</if>
如何解决mybatis在xml中传入Integer整型参数为0时查询条件失效问题?【亲测有效】_mybatis 0失效问题_07
如何解决mybatis在xml中传入Integer整型参数为0时查询条件失效问题?【亲测有效】_mybatis 0失效问题_07

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

完整截图如下: 

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

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

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

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

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

         字段赋值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 0失效问题_14
如何解决mybatis在xml中传入Integer整型参数为0时查询条件失效问题?【亲测有效】_mybatis 0失效问题_14
如何解决mybatis在xml中传入Integer整型参数为0时查询条件失效问题?【亲测有效】_自定义sql_15
如何解决mybatis在xml中传入Integer整型参数为0时查询条件失效问题?【亲测有效】_自定义sql_15

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

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言🔥
  • 二、摘要 🔥
  • 三、问题排查🔥
  • 四、解决方案🔥
    • 1️⃣方案1
      • 2️⃣方案2
      相关产品与服务
      腾讯云服务器利旧
      云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档