mybatis使用过程中SAXParseException错误说明及大于号、小于号转义使用。

场景还原

今天在写代码时,因为业务,需要在mybatis中,使用到大于号,小于号,所以就在SQL中直接使用了。 
SELECT * FROM test WHERE 1 = 1 AND start_date <= CURRENT_DATE AND end_date >= CURRENT_DATE

可是,在执行时,总报错误:

Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 74; columnNumber: 17; 元素内容必须由格式正确的字符数据或标记组成。 
把AND start_date >= CURRENT_DATE AND end_date <= CURRENT_DATE去掉,就没有问题,所以确定是因为大于号,小于号引起的问题。 
于是就想到了特殊符号,于是用了转义字符把>和<替换掉,然后就没有问题了。 
SELECT * FROM test WHERE 1 = 1 AND start_date <= CURRENT_DATE AND end_date >= CURRENT_DATE

实现方案

以下介绍两种可行方法:

①转义法

大于:&gt;

小于:&lt;

大于等于:&gt;=

小于等于:&lt;=

笔者案例:

<select id="view" parameterType="map" resultMap="BaseResultMap">
    SELECT * FROM task t,staff s,product p WHERE t.staff_id = s.id AND t.product_id = p.id
    <if test="processId != null">
        AND  t.process_id = #{processId}
    </if>
    <if test="@Ognl@isNotEmpty(equipmentId)">
        AND  t.equipment_id = #{equipmentId}
    </if>
    <if test="dateStart != null and dateStart !='' ">
        AND UNIX_TIMESTAMP(t.date_work)  >= UNIX_TIMESTAMP(#{dateStart})
    </if>
    <if test="dateEnd != null and dateEnd !='' ">
        AND UNIX_TIMESTAMP(t.date_work)  <= UNIX_TIMESTAMP(#{dateEnd})
    </if>
    GROUP BY t.order_no
    ORDER BY t.date_work
</select>

②<![CDATA[  sql语句  ]]>

<![CDATA[  sql语句  ]]>中的<![CDATA[    ]]>在mybatis中自动注释

笔者案例:

<select id="selectByTime" resultType="Date" parameterType="map">
    SELECT
    r.stop_time
    FROM
    rtg r   <![CDATA[
    WHERE  UNIX_TIMESTAMP(r.stop_time) >= UNIX_TIMESTAMP(#{startTime})
    AND UNIX_TIMESTAMP(r.stop_time) <= UNIX_TIMESTAMP(#{endTime}) ]]>
</select>

以上就是笔者实际需求提炼的心得,望能够帮助更多的伙伴!