ibatis作为一种半自动化的OR Mapping工具,其灵活性日益体现出来,越来越多的人都倾向于在项目中使用。由于Sql中经常有与xml规范相冲突的字符对xml映射文件的合法性造成影响。许多人都知道使用<![CDATA[ ]]>标记来避免冲突,但是在sql配置中有动态语句的时候,还是有一些细节需要特别注意的。 在使用ibatis时,经常需要配置待执行的sql语句。使用过ibatis的朋友都知道,无可避免的都会碰到一些不兼容、冲突的字符,多数人也都知道用<![CDATA[ ]]>标记避免Sql中与xml规范相冲突的字符对xml映射文件的合法性造成影响。但是,如果在ibatis中使用了动态语句的时候,还是有一些细节需要注意。下面举例说明一下:环境:Oracle、ibatis、java 错误例1:符号“<=”会对xml映射文件的合法性造成影响
- <select id="find" parameterClass="java.util.Map" resultClass="java.lang.Long">
- <![CDATA[
- select id
- from tableA a,
- tableB b
- <dynamic prepend="WHERE">
- <isNotNull prepend="AND" property="startDate">
- a.act_time >= #startDate#
- and a.act_time <= #endDate#
- and a.id = b.id
- </isNotNull>
- </dynamic>
- ]]>
- </select>
错误例2:将整个sql语句用<![CDATA[ ]]>标记来避免冲突,在一般情况下都是可行的,但是由于该sql配置中有动态语句(where部分),将导致系统无法识别动态判断部分,导致整个sql语句非法。
- <select id="find" parameterClass="java.util.Map" resultClass="java.lang.Long">
- select id
- from tableA a,
- tableB b
- <dynamic prepend="WHERE">
- <isNotNull prepend="AND" property="startDate">
- a.act_time >= #startDate#
- and a.act_time <= #endDate#
- and a.id = b.id
- </isNotNull>
- </dynamic>
- </select>
正确做法:缩小范围,只对有字符冲突部分进行合法性调整。
- <select id="find" parameterClass="java.util.Map" resultClass="java.lang.Long">
- select id
- from tableA a,
- tableB b
- <dynamic prepend="WHERE">
- <isNotNull prepend="AND" property="startDate">
- a.act_time >= #startDate#
- <![CDATA[ and a.act_time <= #endDate# ]]>
- and a.id = b.id
- </isNotNull>
- </dynamic>
- </select>
总结:在用CDATA的时候,只用把可能产生冲突的那段代码包含就可以了,不要盲目的包含。PL/SQL Developer 登陆分组管理 以及 保存用户名密码Oracle:listener does not currently know of SID given in connect descriptor相关资讯 Oracle教程
- Oracle中纯数字的varchar2类型和 (07/29/2015 07:20:43)
- Oracle教程:Oracle中查看DBLink密 (07/29/2015 07:16:55)
- [Oracle] SQL*Loader 详细使用教程 (08/11/2013 21:30:36)
| - Oracle教程:Oracle中kill死锁进程 (07/29/2015 07:18:28)
- Oracle教程:ORA-25153 临时表空间 (07/29/2015 07:13:37)
- Oracle教程之管理安全和资源 (04/08/2013 11:39:32)
|
本文评论 查看全部评论 (0)