<![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$'
分享到:
相关推荐
- `<dynamic>` 标签允许根据传入的参数动态生成 SQL 语句。 - 通过 `<isNotNull>`、`<isGreaterThan>`、`<isLessThan>` 等标签可以实现对条件的灵活控制。 2. **示例代码**: ```xml <select id=...
`<dynamic>`标签是iBATIS动态标签的核心,它允许在其内部包含一系列的条件标签,根据不同的条件来决定哪些部分应该被插入到最终的SQL语句中。`<dynamic>`标签有三个主要属性: 1. `prepend`: 在动态内容前添加的字符...
<spring.version>4.0.2.RELEASE</spring.version> <!-- 其他版本配置 --> </properties> <dependencies> <!-- Spring 核心依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring...
标题中的“ibatis<iterate>标签”指的是在iBATIS框架中用于动态SQL的一个关键功能。iBATIS是一个优秀的持久层框架,它允许将SQL语句直接嵌入到Java代码中,简化了数据库操作。而`<iterate>`标签是iBATIS提供的一个...
<spring.version>4.0.2.RELEASE</spring.version> <mybatis.version>3.2.6</mybatis.version> <slf4j.version>1.7.7</slf4j.version> <log4j.version>1.2.17</log4j.version> </properties> <dependencies> <!...
<property name="initialPoolSize"><value>${jdbc.initialPoolSize}</value></property> <property name="minPoolSize"><value>${jdbc.minPoolSize}</value></property> <property name="maxPoolSize"><value>${...
利用 `<dynamic>` 标签和 `<isNotEmpty>`, `<isNotNull>` 等子标签,可以灵活地控制SQL语句的生成。这对于实现复杂的查询条件非常有用,特别是在处理大量参数和不确定条件的情况下。此外,通过设置 `open` 和 `close...
<spring.version>4.0.2.RELEASE</spring.version> <!-- mybatis 版本号 --> <mybatis.version>3.2.6</mybatis.version> </properties> <dependencies> <!-- Spring 核心库 --> <dependency> <groupId>org....
### Spring与iBatis集成开发详解 #### 一、引言 在Java企业级应用开发领域,Spring...综上所述,Spring与iBatis的集成为企业级应用开发提供了一个强大而灵活的解决方案,对于提高软件开发效率和质量具有重要意义。
<spring.version>4.0.2.RELEASE</spring.version> <mybatis.version>3.2.6</mybatis.version> <slf4j.version>1.7.7</slf4j.version> <log4j.version>1.2.17</log4j.version> </properties> <dependencies> <!...
最近想在最新的Spring5.0中集成ibatis(不是mybatis),发现已经不在支持SqlmapClientTemplate和SqlmapClientFactoryBean,于是搞了这个工具jar来进行支持如下配置 <bean id="sqlMapClient" class="org.spring...
<artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!-- Log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j....
通过`<select>`, `<insert>`, `<update>`, `<delete>`标签,你可以方便地组织和管理SQL。 ```xml <select id="selectUser" resultType="User"> SELECT * FROM users WHERE id = #{id} </select> <update id=...
标题 "ibatis UPDATE 动态XML与insert" 涉及到的是MyBatis框架中对数据库数据进行更新(UPDATE)和插入(INSERT)操作的动态XML配置方式。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,...
iBatis起源于MyBatis的早期版本,它是一个轻量级的ORM(对象关系映射)框架,主要解决了在Java应用中操作数据库时的繁琐工作。iBatis的优势在于它的灵活性,可以自由控制SQL语句,同时提供动态SQL的功能。 ## 二、...
<sqlMap resource="com/lovo/ibatis/student.xml"/> ``` #### 四、SQL 映射文件解析 SQL 映射文件是 Ibaitis 的核心组成部分,它们定义了 SQL 语句以及如何将结果集映射到 Java 对象。 ```xml <sqlMap namespace=...
iBatis 是一款轻量级的Java持久层框架,它主要负责将数据库操作与业务逻辑解耦,使得开发者可以更加专注于SQL和业务代码的编写。本文档将详细讲解iBatis的核心概念、快速入门以及高级特性。 ### iBatis 快速启动 #...
Map<String, Object> params = new HashMap<>(); params.put("param1", 1); UserMapper mapper = sqlSessionFactory.getMapper(UserMapper.class); mapper.callProcedure(params); String result = (String) params....
这个过程旨在利用Spring的强大功能,如依赖注入和事务管理,以及iBATIS提供的灵活的SQL映射机制,实现更高效、可维护的Java应用。 在Spring中整合iBATIS(MyBatis),首先需要添加相应的依赖到项目中。这通常涉及到...