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
实现方案
以下介绍两种可行方法:
①转义法
大于:>
小于:<
大于等于:>=
小于等于:<=
笔者案例:
<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>
以上就是笔者实际需求提炼的心得,望能够帮助更多的伙伴!