在常用的单体SSM架构之中,
基于xml编写的mybatis在动态sql之中,当我们遇到if标签判断某个属性是否等于单个字符的时候,会出现如下的问题。
先看下数据库表的数据如下:
然后动态sql是这么写的
<if test="member.password != null and member.password == '4'">
AND password = #{member.password}
</if>
然后进行下面的查询,照我们惯常常理来讲会查询到password=4的那条数据
但是,事与愿违,结果如下,我们发现动态的if条件没起作用。
我们看到发出的sql如下,根本没有带上编写的条件
所以导致该条password=4的数据查询失败。
我们可以更换写法如下,参见password等于 5,6,7的那三种,就可以解决这个问题。查
<if test="member.password != null and member.password == '4'">
AND password = #{member.password}
</if>
<if test="member.password != null and member.password eq '5'.toString() ">
AND password = #{member.password}
</if>
<if test="member.password != null and member.password == '6'.toString() ">
AND password = #{member.password}
</if>
<if test='member.password != null and member.password == "7" '>
AND password = #{member.password}
</if>
测试,查询结果如下
此时,动态sql的条件成功有效。
这个问题的主要原因是Mybatis用OGNL表达式来解析的,在OGNL的表达式中,单个字符,比如,'4'会被解析成字符,java是强类型的,char 和 一个string 会导致不等导致的,所以if的条件就没成立。