Mybatis If判断踩坑

Mybatis If判断字符串踩坑

前言

在开发中用Mybatis写SQL的时候,遇到了一个离奇的问题,看了好久才解决掉。所以来记录一下问题点,让看到文章的你也节省一点时间。

问题现象

问题很简单,就是我写的 if 判断他不好使。这个东西就很难受了,因为也不能打断点看(也有可能有办法,知道的大佬可以为我指指路),然后就只能硬看代码,查查别人怎么写的,再和自己的对比。
代码如下:

接口层代码

List<MemberVo> findMemberList(QueryMemberParm param);

XML代码

<select id="findMemberList" resultType="com.ai.cnr.sys.rest.pc.vo.MemberVo">
	<!---此处省略无关代码---->
	<where>
	     1 = 1
	     <if test="roleType == '2'">
	         and chan.chl_type = 2
	     </if>
	     <if test="roleType == '3'">
	         and chan.chl_type = 1
	     </if>
	</where>
</select>

前端请求参数为

{
    "memberName": "",
    "roleType":"2"
}

后端request参数接收方式: private String roleType;

运行结果如图:
在这里插入图片描述
可以看到上面加的判断都没有生效。这离奇的问题让我研究了很久。一直在研究是不是我传值有问题,根本没有意识到是不是判断写的有问题。后来看了看别人的代码,终于找到了问题

我后来学着把“为什么偏偏发生在我身上的想法,替换成了这件事想教会我什么?”,然后发现身边的一切都改变了

正确写法

<where>
    1 = 1
     <if test='roleType == "2"'>
         and chan.chl_type = 2
     </if>
     <if test='roleType == "3"'>
         and chan.chl_type = 1
     </if>
</where>

运行结果:
在这里插入图片描述
这里可以看到,条件已经带上了。那么到底哪里有区别呢?没错就是单引号与双引号的区别。在错误的时候写的是双引号中嵌套单引号,而正确的是 单引号中嵌套双引号。没错就是这个区别,离奇的问题往往是愚蠢导致的。

当然办法也不是只有这一种,还可以保留之前的双引号嵌套单引号,不过需要稍微做一点改动,在原来的基础上,增加.toString()。代码如下:

<where>
    1 = 1
     <if test="roleType == '2'.toString()">
       and chan.chl_type = 2
      </if>
      <if test="roleType == '3'.toString()">
          and chan.chl_type = 1
      </if>
</where>

也是可以实现的。效果图如下:
在这里插入图片描述

总结

所以开发中还是要注意细小的点,不然可能会花费很多很多的时间。

对于String 类型的判断可以有以下两种方式:

<!--方式1-->
<if test='roleType == "2"'>
</if>
<!--方式2-->
<if test="roleType == '2'.toString()">
</if>

错误写法❌

<if test="roleType == '2'">
</if>

这世界上所有光鲜亮丽的背后,都透着无比的寂寞。但每次努力之后的平静安详,都映射着人生轨迹的跳跃。不管前方的路有多苦,只要走的方向正确,不管多么崎岖不平,都比站在原地更接近幸福。——宫崎骏《千与千寻》

参考链接

写文章的时候,偶然查到这个。

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值