正常情况下,写动态sql的if test或when test语句时,条件引用为双引号括单引号,如下:
<select id="sel1" resultType="User">
select * from tb_user
<where>
<choose>
<when test="user != null and user != ''">
and user = #{user}
</when>
<when test="passwd != null and passwd != ''">
and passwd = #{passwd}
</when>
<otherwise>
and 1 = 1
</otherwise>
</choose>
</where>
</select>
但是今天发现一个问题,当传入的值为0或者1时,sql失效不被执行。如下:
<when test="user == ’1‘ ">
and user = #{user}
</when>
之后,发现是MyBatis自身解析的问题,在标签 中的内容,MyBatis是使用的OGNL表达式来进行解析的,这个地方需要注意下,单引号内有一个字符的情况下,OGNL会将其以 java 中的 char 类型进行解析,那么此时 char 类型与参数 String 类型用等号进行比较的时候结果都是false。解决方案也很简单,就是把test 中的单个字符用双引号括起来。
<if test='param != "*"'>
<choose>
<when test='param.indexOf("sub") != -1'>
</when>
<otherwise>
</otherwise>
</choose>
</if>