`
caiying0504
  • 浏览: 343014 次
  • 性别: 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的动态查询

    - `&lt;dynamic&gt;` 标签允许根据传入的参数动态生成 SQL 语句。 - 通过 `&lt;isNotNull&gt;`、`&lt;isGreaterThan&gt;`、`&lt;isLessThan&gt;` 等标签可以实现对条件的灵活控制。 2. **示例代码**: ```xml &lt;select id=...

    iBATIS动态标签

    `&lt;dynamic&gt;`标签是iBATIS动态标签的核心,它允许在其内部包含一系列的条件标签,根据不同的条件来决定哪些部分应该被插入到最终的SQL语句中。`&lt;dynamic&gt;`标签有三个主要属性: 1. `prepend`: 在动态内容前添加的字符...

    SSM三大框架的整合.docx

    &lt;spring.version&gt;4.0.2.RELEASE&lt;/spring.version&gt; &lt;!-- 其他版本配置 --&gt; &lt;/properties&gt; &lt;dependencies&gt; &lt;!-- Spring 核心依赖 --&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring...

    ibatis标签

    标题中的“ibatis&lt;iterate&gt;标签”指的是在iBATIS框架中用于动态SQL的一个关键功能。iBATIS是一个优秀的持久层框架,它允许将SQL语句直接嵌入到Java代码中,简化了数据库操作。而`&lt;iterate&gt;`标签是iBATIS提供的一个...

    SSM三大框架整合详细总结(Spring+SpringMVC+MyBatis).pdf

    &lt;spring.version&gt;4.0.2.RELEASE&lt;/spring.version&gt; &lt;mybatis.version&gt;3.2.6&lt;/mybatis.version&gt; &lt;slf4j.version&gt;1.7.7&lt;/slf4j.version&gt; &lt;log4j.version&gt;1.2.17&lt;/log4j.version&gt; &lt;/properties&gt; &lt;dependencies&gt; &lt;!...

    Spring 3.0 整合Ibatis 3

    &lt;property name="initialPoolSize"&gt;&lt;value&gt;${jdbc.initialPoolSize}&lt;/value&gt;&lt;/property&gt; &lt;property name="minPoolSize"&gt;&lt;value&gt;${jdbc.minPoolSize}&lt;/value&gt;&lt;/property&gt; &lt;property name="maxPoolSize"&gt;&lt;value&gt;${...

    ibatis and和or联合查询 .doc

    利用 `&lt;dynamic&gt;` 标签和 `&lt;isNotEmpty&gt;`, `&lt;isNotNull&gt;` 等子标签,可以灵活地控制SQL语句的生成。这对于实现复杂的查询条件非常有用,特别是在处理大量参数和不确定条件的情况下。此外,通过设置 `open` 和 `close...

    SSM三大框架的整合(技术学习).docx

    &lt;spring.version&gt;4.0.2.RELEASE&lt;/spring.version&gt; &lt;!-- mybatis 版本号 --&gt; &lt;mybatis.version&gt;3.2.6&lt;/mybatis.version&gt; &lt;/properties&gt; &lt;dependencies&gt; &lt;!-- Spring 核心库 --&gt; &lt;dependency&gt; &lt;groupId&gt;org....

    spring+ibatis集成文档

    ### Spring与iBatis集成开发详解 #### 一、引言 在Java企业级应用开发领域,Spring...综上所述,Spring与iBatis的集成为企业级应用开发提供了一个强大而灵活的解决方案,对于提高软件开发效率和质量具有重要意义。

    SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

    &lt;spring.version&gt;4.0.2.RELEASE&lt;/spring.version&gt; &lt;mybatis.version&gt;3.2.6&lt;/mybatis.version&gt; &lt;slf4j.version&gt;1.7.7&lt;/slf4j.version&gt; &lt;log4j.version&gt;1.2.17&lt;/log4j.version&gt; &lt;/properties&gt; &lt;dependencies&gt; &lt;!...

    Spring高版本对ibatis的支持

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

    SSM框架详细整合教程

    &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt; &lt;version&gt;5.1.47&lt;/version&gt; &lt;/dependency&gt; &lt;!-- Log4j --&gt; &lt;dependency&gt; &lt;groupId&gt;log4j&lt;/groupId&gt; &lt;artifactId&gt;log4j&lt;/artifactId&gt; &lt;version&gt;${log4j....

    IBATIS入门(第二节)

    通过`&lt;select&gt;`, `&lt;insert&gt;`, `&lt;update&gt;`, `&lt;delete&gt;`标签,你可以方便地组织和管理SQL。 ```xml &lt;select id="selectUser" resultType="User"&gt; SELECT * FROM users WHERE id = #{id} &lt;/select&gt; &lt;update id=...

    ibatis UPDATE 动态XML与insert

    标题 "ibatis UPDATE 动态XML与insert" 涉及到的是MyBatis框架中对数据库数据进行更新(UPDATE)和插入(INSERT)操作的动态XML配置方式。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,...

    ibatis经典示例

    iBatis起源于MyBatis的早期版本,它是一个轻量级的ORM(对象关系映射)框架,主要解决了在Java应用中操作数据库时的繁琐工作。iBatis的优势在于它的灵活性,可以自由控制SQL语句,同时提供动态SQL的功能。 ## 二、...

    java ibaties sqlMap配置文件

    &lt;sqlMap resource="com/lovo/ibatis/student.xml"/&gt; ``` #### 四、SQL 映射文件解析 SQL 映射文件是 Ibaitis 的核心组成部分,它们定义了 SQL 语句以及如何将结果集映射到 Java 对象。 ```xml &lt;sqlMap namespace=...

    iBatis文档\ibatis.doc

    iBatis 是一款轻量级的Java持久层框架,它主要负责将数据库操作与业务逻辑解耦,使得开发者可以更加专注于SQL和业务代码的编写。本文档将详细讲解iBatis的核心概念、快速入门以及高级特性。 ### iBatis 快速启动 #...

    ibatis入门教程

    Map&lt;String, Object&gt; params = new HashMap&lt;&gt;(); params.put("param1", 1); UserMapper mapper = sqlSessionFactory.getMapper(UserMapper.class); mapper.callProcedure(params); String result = (String) params....

    spring ibatis 的整合

    这个过程旨在利用Spring的强大功能,如依赖注入和事务管理,以及iBATIS提供的灵活的SQL映射机制,实现更高效、可维护的Java应用。 在Spring中整合iBATIS(MyBatis),首先需要添加相应的依赖到项目中。这通常涉及到...

Global site tag (gtag.js) - Google Analytics