MyBatis 在xml文件中处理大于号小于号的方法

随声附和 提交于 2019-12-16 14:56:24

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

第一种方法:用转义字符(注:对大小写敏感! )

用了转义字符把>和<替换掉,然后就没有问题了。

SELECT * FROM test WHERE 1 = 1 AND start_date  &lt;= CURRENT_DATE AND end_date &gt;= CURRENT_DATE

附:XML转义字符  

显示结果 描述 实体名称 实体编号
  空格 &nbsp; &#160;
< 小于号 &lt; &#60;
> 大于号 &gt; &#62;
& 和号 &amp; &#38;
" 引号 &quot; &#34;
' 撇号  &apos; (IE不支持) &#39;

第二种方法:<![CDATA[ ]]>

因为这个是xml格式的,所以不允许出现类似“>”这样的字符,但是都可以使用<![CDATA[ ]]>符号进行说明,将此类符号不进行解析 ,如下:

<update id="reduceNumber">
    UPDATE seckill
    SET number = number-1
    WHERE seckill_id=#{seckillId}
    AND start_time <![CDATA[ <= ]]> #{killTime} 
    AND end_time >= #{killTime}
    AND number > 0;
</update>

注意点:有动态语句(where,if)的情况,where,if 条件不能放在<![CDATA[ ]]>中,否则将导致无法识别动态判断部分,导致整个sql语句非法.应该缩小范围,只对有字符冲突部分进行合法性调整

错误的形式:以下where 放在<![CDATA[ ]]>中

<select id="getAccountErrorCount" resultType="int" parameterType="map">  
    <![CDATA[ 
    select count(*) from t_acctreg_accounterror 
    <where> 
        <if test="enddate != null and enddate != ''"> 
            createdate <= #{enddate} 
        </if> 
        <if test="acctno != null and acctno != ''"> 
            AND acctno LIKE '%'#{acctno}'%' 
        </if> 
    </where> 
    ]]>  
</select>  

正确的形式:

<select id="getAccountErrorCount" resultType="int" parameterType="map">  
    select count(*) from t_acctreg_accounterror  
    <where>  
        <if test="enddate != null and enddate != ''">  
            <![CDATA[createdate <= #{enddate}]]>  
        </if>  
        <if test="acctno != null and acctno != ''">  
            <![CDATA[AND acctno LIKE CONCAT('%',#{acctno},'%')]]>  
        </if>  
    </where>  
</select>  

补充说明:like的以上两种写法,都是可以的

LIKE '%'#{acctno}'%'

LIKE CONCAT('%',#{acctno},'%')

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!