Mybatis中的<![CDATA[]]>标签在判断日期场景中的使用

在MyBatis中,SQL语句通常写在XML映射文件里,遇到特殊字符如&gt;会被转义。使用CDATA可以防止字符转义,提高代码可读性。文中举例说明了如何在时间字符串比较和时间函数中正确使用CDATA来处理特殊字符。

背景

在使用mybatis 时我们sql是写在xml 映射文件中,如果写的sql中有一些特殊的字符的话,在解析xml文件的时候会被转义。

如大于号>会被转义为&gt;转义后的可读性不是很直观,如果想让其看起来更加直观可读性更强的话,则需要使用<![CDATA[ ]]>来圈起来不被转义的符号以此来解决这个问题。

常见的转义字符,和它们表述的场景:

转义字符原字符说明
&lt;<小于
&gt;'>'大于
&amp;&和号
&apos;'单引号
&quot;"双引号

<![CDATA[ ]]> 是什么

<![CDATA[ ]]> 是什么,这是XML语法。在CDATA内部的所有内容都会被解析器忽略。

术语 CDATA 是不应该由 XML 解析器解析的文本数据。像 “<” 和 “&” 字符在 XML 元素中都是非法的。“<” 会产生错误,因为解析器会把该字符解释为新元素的开始。“&” 会产生错误,因为解析器会把该字符解释为字符实体的开始。

但是有个问题那就是 等这些标签都不会被解析,所以我们只把有特殊字符的语句放在 <![CDATA[ ]]> 尽量缩小 <![CDATA[ ]]> 的范围。

实例如下:

时间字符串比较如:

String createTime = "2020-03-12 00:00:00" <if test="createTime != null and createTime != ''"> <![CDATA[ and a.create_time >= #{createTime } ]]> </if> 利用时间函数: <if test="createTime != null and createTime != ''"> <![CDATA[ and a.create_time >= str_to_date(#{createTime,jdbcType=DATE},'yyyy-MM-dd hh24:mi:ss') ]]> </if>

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。

首发链接:https://www.cnblogs.com/lingyejun/p/17347790.html

select DISTINCT t.workorder_name, <choose> <when test="condition.workSerction == '包装'"> t.upper_item_code AS item_code, </when> <otherwise> t.item_code, </otherwise> </choose> t.workorder_qty, t.uncompleted_qty, t.taskorder_no, t.taskorder_qty, t.plan_start_time, t.factory_line, t.dept_code, d.line_desc, t.dept_name from ( select s.workorder_name, s.item_code, s.workorder_qty, s.uncompleted_qty, s.upper_item_code, j.taskorder_no, j.taskorder_qty, j.plan_start_time, j.factory_line, j.dept_code, j.dept_name from t_supply_require_workorder s left join t_wave_taskorder_juxin j on s.workorder_name = j.workorder_name and j.is_delete = 0 and j.taskorder_status in ('1','2','3','4','6') where s.plan_id = #{condition.planId,jdbcType=VARCHAR} and s.dept_code = #{condition.deptCode,jdbcType=VARCHAR} and s.location_code = #{condition.locationCode,jdbcType=VARCHAR} and s.plan_start_time >= #{condition.itemDate,jdbcType=TIMESTAMP} and s.plan_start_time <![CDATA[ < ]]> (CAST(#{condition.itemDate} AS TIMESTAMP) + INTERVAL '1 day') and s.workorder_name !='/' and s.uncompleted_qty !=0 <choose> <when test="condition.workSerction != null and condition.workSerction == '包装'"> and s.supply_type = '0' AND s.upper_item_code = #{condition.schedulingCode,jdbcType=VARCHAR} </when> <otherwise> and s.supply_type = '1' AND s.item_code = #{condition.schedulingCode,jdbcType=VARCHAR} </otherwise> </choose> ) t left join t_base_line_dept d on t.factory_line = d.line_name order by t.plan_start_time asc </select>转化为sql
09-12
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值