`
caiying0504
  • 浏览: 335144 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ibatis的<![CDATA]>,dynamic属性和#,$的应用

阅读更多
<![CDATA[   ]]>的正确使用
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"> 
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">
<![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>

正确做法:缩小范围,只对有字符冲突部分进行合法性调整。

<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>

dynamic的正确使用
dynamic可以去除第一个prepend="and"中的字符(这里为and),从而可以帮助你实现一些很实用的功能。具体情况如下:

1.使用dynamic

1.1 xml
select * from Person表
        <dynamic prepend="where"> 
                <isNotNull property="name" prepend="and">
                    name=#name#
                </isNotNull>
                <isNotNull property="sex" prepend="and">
                    sex=#sex#
                </isNotNull>               
        </dynamic>

1.2 结果

       当name、sex都非null时打出如下的sql语句:
select    Person where (and) name= ? , and sex= ?

     显然name前的and被自动去除了,很方便吧。

2.不使用dynamic

2.1 xml
       如果我把dynamic 去掉就会变的很恶心,如下:
select * from Person     
                <isNotNull property="name" prepend="and">
                    name=#name#
                </isNotNull>
                <isNotNull property="sex" prepend="and">
                    sex=#sex#
                </isNotNull>   
      

2.2 结果
      当name、sex都非null时打出如下的sql语句:
select    Person where and name= ? , and sex= ?

      显然name前多个and,sql语句错误。

3.总结

      dynamic 会自动去除第一个 prepend="and中的内容(这里为and),从而方便一些操作。


#和$的区别在Ibatis中我们使用SqlMap进行Sql查询时需要引用参数,在参数引用中遇到的符号#和$之间的区分为,#可以进行与编译,进行类型匹配,而$不进行数据类型匹配,例如:

select * from table where id = #id# ,其中如果字段id为字符型,那么#id#表示的就是'id'类型,如果id为整型,那么#id#就是id类型。

select * from table where id = $id$ ,如果字段id为整型,Sql语句就不会出错,但是如果字段id为字符型,那么Sql语句应该写成 select * from table where id = '$id$'

分享到:
评论
1 楼 远去的渡口 2010-08-04  
很不错,项目中也是用ibatis,你的总结对我挺有帮助。

相关推荐

    ibatis 开发指南(pdf)

    DOCTYPE sqlMapConfig&lt;br&gt;PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"&lt;br&gt;"http://www.ibatis.com/dtd/sql-map-config-2.dtd"&gt;&lt;br&gt;&lt;sqlMapConfig&gt;&lt;br&gt;&lt;settings&lt;br&gt;cacheModelsEnabled="true"&lt;br&gt;...

    Spring高版本对ibatis的支持

    最近想在最新的Spring5.0中集成ibatis(不是mybatis),发现已经不在支持SqlmapClientTemplate和SqlmapClientFactoryBean,于是搞了这个工具jar来进行支持如下配置 &lt;bean id="sqlMapClient" class="org.spring...

    iBATIS动态标签

    iBATIS动态标签 §&lt;dynamic&gt;标签 §二元标签 §一元标签 §&lt;iterate&gt;标签 § 共同的属性 prepend,open,close &lt;dynamic&gt;标签 §&lt;dynamic&gt;标签 §属性 prepend,open,close 二元条件标签

    springmvc-ibatis

    &lt;value&gt;classpath:ibatis-Base.xml&lt;/value&gt; &lt;/property&gt; &lt;property name="dataSource"&gt; &lt;ref bean="dataSource"/&gt; &lt;/property&gt; &lt;/bean&gt; &lt;!-- 配置sqlMapClientTemplate模板 --&gt; &lt;bean id=...

    spring applicationContext 配置文件

    &lt;bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate"&gt; &lt;property name="sqlMapClient"&gt; &lt;ref bean="sqlMapClient" /&gt; &lt;/property&gt; &lt;/bean&gt; &lt;!-- 配置要...

    ibatis 动态代理dtd

    &lt;!ELEMENT dynamic (#PCDATA | include | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | ...

    ibatis标签

    NULL 博文链接:https://duqiangcise.iteye.com/blog/286764

    ibatis应用

    应用框架 ibatis. &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL MAP Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd"&gt; ...

    AppFramework_V1.0

    720&lt;br&gt; 1.59&lt;br&gt;&lt;br&gt;1.53&lt;br&gt; &lt;br&gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;表II –50并发4循环(数据库和测试机分开)&lt;br&gt;&lt;br&gt;对比项目&lt;br&gt; iBatis2.0&lt;br&gt;&lt;br&gt;(毫秒)&lt;br&gt; AppFramework&lt;br&gt;&lt;br&gt;(毫秒)&lt;br&gt; 后者前者性能对比&lt;br&gt;&lt;br&gt;(倍)...

    AppFramework_V1.0_New

    &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;下面三张表格罗列的测试数据,可以明显看出AppFramework数据库访问组件的性能全面超越了IBatisNet: &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;表I –10并发20循环(数据库和测试机分开)&lt;br&gt;&lt;br&gt;对比项目&lt;br&gt;iBatis2.0&lt;br&gt;...

    SSI框架整合实例

    &lt;bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"&gt; &lt;property name="dataSource" ref="dataSource"/&gt; &lt;property name="configLocation"&gt; &lt;value&gt;classpath:...

    java文集

    &lt;br&gt;ext学习笔记一&lt;br&gt;小试iBatis&lt;br&gt;RIA(Rich Internet Application)的现状和未来&lt;br&gt;Java应用中域名解析不过期的解决方法&lt;br&gt;Java编程那些事儿45—数组使用示例1&lt;br&gt;一步步熟悉OFBiz&lt;br&gt;用Java做客户端调用.NET写...

    JTA事务源码示例

    Spring+iBatis+JOTM实现JTA事务: 如何处理跨库事物:spring + jtom 的jta事务是个很好的选择. 这个源码示例非常不错,包括所有的源码和jar包,下载后eclipse 或 myeclipse 导入就能用。 里面有详细的说明和注释,...

    ibatis 学习源码

    &lt;?xml version="1.0" encoding="UTF-8" ?&gt; &lt;!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd"&gt; &lt;sqlMapConfig&gt; &lt;settings ...

    ibatis中输入输出各种类型的参数分析及#与$区别

    ibatis中输入输出各种类型的参数分析及#与$区别

    spring-ibatis

    spring-ibatis 整合 springmvc 配置: &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc=...

    ibatis 开发指南

    相对Hibernate和Apache OJB 等“一站式”ORM解决方案而言,ibatis 是一种“半&lt;br&gt;自动化”的ORM实现。&lt;br&gt;所谓“半自动”,可能理解上有点生涩。纵观目前主流的ORM,无论Hibernate 还是&lt;br&gt;Apache OJB,都对数据库...

    iBatis-设置缓存模式-Java源码(下载)

    &lt;select id="getByLike" resultClass="Account" parameterClass="Account" cacheModel="categoryCache"&gt; select ACC_ID as id, ACC_FIRST_NAME as firstName, ACC_LAST_NAME as lastName, ACC_EMAIL as ...

    一个类似mybatis的查询框架,功能是查询阿里云的sls日志 可快速继承到springboot的一个starter

    一个类似mybatis的查询框架,功能是查询阿里云的sls日志。可快速继承到springboot的一个... &lt;artifactId&gt;spring-boot-starter-aliyun-sls-ibatis&lt;/artifactId&gt; &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt; &lt;/dependency&gt;

    Spring与iBATIS的集成

    ”&lt;br&gt;&lt;br&gt;但别犯愁:SQL本身具备了一些重要的功能,并且通过模板的使用,在Spring应用中采用iBATIS显得轻而易举。在此摘录中,两位作者将和你一起安装iBATIS并将其集成进你的Spring应用中。他们也阐明了怎样取得你...

Global site tag (gtag.js) - Google Analytics