今天朋友问了一个问题,说MyBatis中怎么将 * 转义,当时心想直接用 <![CDATA[ ]]> 就ok了,后来发出代码原来是想将 if 条件中 test 的内容写成 * ,直接看代码:
<if test='param != "*"'>
index_code_${param}
</if>
说是第一行会报错,认为是转义问题。
其实这里并非转义问题,在标签 <if test=""> </if> 中的内容,MyBatis是使用的OGNL表达式来进行解析的,这个地方有一个坑需要注意下,单引号内有一个字符的情况下,OGNL会将其以 java 中的 char 类型进行解析,那么此时 char 类型与参数 String 类型用等号进行比较的时候结果都是false。解决方案也很简单,就是讲 test 中的单个字符用双引号括起来。
解决方案如下:
<if test="param != '*'">
index_code_${param}
</if>
另外,MyBatis的if、when里面的test表达式对参数进行判断时,可以调用java的java.lang.String中定义的方法。例如:
<if test='param != "*"'>
<choose>
<when test='param.indexOf("sub") != -1'>
</when>
<otherwise>
</otherwise>
</choose>
</if>
然后在说下 <![CDATA[ ]]>
在使用 MyBatis 时我们 sql 是写在 xml 映射文件中,如果写的 sql 中有一些特殊的字符的话,在解析 xml 文件的时候会被转义,但我们不希望他被转义,所以我们要使用<![CDATA[ ]]>来解决。这是 XML 的语法,在 CDATA 内部的内容都会被解析器忽略。
还有就是 mybatis 中常用的几个需要转义的字符:
特殊字符 替代符号
& &
< <
> >
" "
' '