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>
这世界上所有光鲜亮丽的背后,都透着无比的寂寞。但每次努力之后的平静安详,都映射着人生轨迹的跳跃。不管前方的路有多苦,只要走的方向正确,不管多么崎岖不平,都比站在原地更接近幸福。——宫崎骏《千与千寻》
参考链接
写文章的时候,偶然查到这个。