場景還原
今天在寫代碼時,因為業務,需要在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