场景还原
今天在写代码时,因为业务,需要在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>
以上就是笔者实际需求提炼的心得,望能够帮助更多的伙伴!
原文链接:
1、https://blog.csdn.net/weixin_40278209/article/details/78262173?locationNum=10&fps=1
2、https://blog.csdn.net/gisredevelopment/article/details/27870833