`
yjhexy
  • 浏览: 331097 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

Ibatis 再议动态查询语句

阅读更多

一,ibatis 的<isNotNull>标签。


当属性不为空的时候可以插入。这个时候你是否有过疑问。

如果属性为原生类型 (例如int类型)怎么办?

查看了Ibatis的文档可以发现如果原生类型的话,那么这个标签就显得力不从心了。为什么?

因为原生类型肯定有值,不可能为空。

比如有这么个DO类:

 

public class BabyDO implements Serializable {

	private static final long serialVersionUID = -579987226803641422L;
	private int id;
	private String name; // 姓名
	private SexEnum sex; // 性别
	private Date birthday; // 生日
	private String hobby; // 喜好
	private int age; // 年龄 注意这里是原生类型
	private List<AddressDO> address; // 地址复杂类型

// getters and setters 省略

 

然后有这么个XML代码:

 

<update id="updateBabysPartitialByParams" parameterClass="baby">
		update Baby set
		<dynamic prepend=" ">
			 <isNotNull property="name" prepend='",">
					name=#name#
			    </isNotNull>
			<isNotNull property="sex" prepend=",">
				sex=#sex#
			</isNotNull>
			<isNotNull property="birthday" prepend=",">
				birthday=#birthday#
			</isNotNull>
			<isNotNull property="hobby" prepend=",">
				hobby=#hobby#
			</isNotNull>
			<isNotNull property="age" prepend=",">
				age=#age#
			</isNotNull>
		</dynamic>
		where id = #id#
	</update>

 

那么isNotNull将不起任何作用。

 

读者可以自己尝试一下。


那么同时可想而知 <isNotEmpty>这个标签对原生类型也是不起作用的。读者可以再度尝试将<isNotNull>标签改成<isNotEmpty>标签。

 

 

二,你可能已经注意到上面的XML中有个<dynamic prepend=" ">

 

这个是不是多余的?

 

我曾有这种疑惑,但是当你把他去掉的时候错误也随之而来了。

看了日志居然打印出这种SQL来:

 

2009-09-21 21:47:14,873 DEBUG [java.sql.PreparedStatement] - {pstm-100001} Executing Statement:    update Baby set       ,           name=?                             ,     age=?          where id > 10

 

 

跟踪了好久代码没看懂,到底是哪里的问题,可能我读代码的能力有限。所以查了google,终于找到原因了:

http://issues.apache.org/jira/browse/IBATIS-430

显然已经有人发现了这个现象,并提出了疑问。最终代码到底什么问题我确实是没找到,但是这个现象的确是存在的。


于是在使用的时候就要注意了 。


1,dynamic标签 如果要使标签里面的内容的第一个prepend无效,那么必须要有dynamic标签的prepend属性即使是空的

2,dynamic标签的prepend属性还不能真的为空,至少要一个空格!!!


尝试到这里我还真是有点吐血,看到很早有人提的这个BUG,却没有人去修正。

 

 

 

 

分享到:
评论
2 楼 yjhexy 2010-08-30  
luofuxing 写道
这不是bug,而是ibatis很方便的特性,看看ibatis开发指南中的原话:
<dynamic>元素和条件元素都有“prepend”属性,它是动态SQL代码的一部分,在必要情况下,可以被父元素的“prepend”属性覆盖。……prepend属性……将覆盖第一个为“真”的条件元素。这对于确保生成正确的SQL语句是有必要的。例如,在第一个为“真”的条件元素中,“AND”是不需要的,事实上,加上它肯定会出错。


其实我觉得奇怪的是为什么一定要空格,另外apache官网也open了这个BUG
1 楼 luofuxing 2010-08-27  
这不是bug,而是ibatis很方便的特性,看看ibatis开发指南中的原话:
<dynamic>元素和条件元素都有“prepend”属性,它是动态SQL代码的一部分,在必要情况下,可以被父元素的“prepend”属性覆盖。……prepend属性……将覆盖第一个为“真”的条件元素。这对于确保生成正确的SQL语句是有必要的。例如,在第一个为“真”的条件元素中,“AND”是不需要的,事实上,加上它肯定会出错。

相关推荐

    ibatis中使用安全的拼接语句,动态查询,大于、小于、等于.doc

    iBatis 中使用安全的拼接语句、动态查询、大于、小于、等于 iBatis 是一个流行的持久层框架,提供了许多强大的功能来帮助开发者构建高效、安全的数据库交互应用程序。本文将详细介绍 iBatis 中使用安全的拼接语句、...

    Ibatis查询语句里,可以使用多表查询

    iBatis 支持在查询语句中进行多表查询,并能够将结果映射到相应的 Java 对象上。多表查询通常涉及到 JOIN 操作,例如内连接(INNER JOIN)、左连接(LEFT JOIN)等,这些操作可以帮助我们从多个相关联的表中获取所需...

    iBatis的动态SQL语句

    ### iBatis中的动态SQL语句详解 #### 引言 在进行数据库操作时,我们经常需要根据不同的条件构建不同的SQL语句。这种需求在实际开发中极为常见,尤其是在处理复杂的查询逻辑时。iBatis(现在通常被称为MyBatis)...

    IBATIS动态查询语句.doc

    本文将深入探讨IBATIS动态查询语句的运用,解析其背后的逻辑与机制,以及如何利用这些特性来增强查询的灵活性与安全性。 ### IBATIS动态查询基础 IBATIS,现在更广为人知的名字为MyBatis,是一种半自动映射的持久...

    动态ibatis查询语句配置

    动态查询语句配置是Ibatis的一个重要特性,它允许我们在运行时根据业务需求构建灵活多变的SQL语句。这篇博文主要探讨的是如何在Ibatis中设置和使用动态SQL,以便实现更高效、更灵活的数据查询。 首先,我们需要理解...

    ibatis16个常用sql语句

    iBatis 16个常用SQL语句 iBatis是一个基于Java的持久层框架,提供了一个简洁的方式来访问和操作数据库。在iBatis中,SQL语句是...iBatis提供了一个灵活的方式来配置SQL语句,支持各种类型的输入参数和复杂的查询语句。

    ibatis_动态查询条件

    iBatis 是一个基于 Java 的持久层框架,它提供了动态查询条件的功能,可以根据不同的条件生成不同的 SQL 语句。在 iBatis 中,动态查询条件是通过 `&lt;dynamic&gt;` 元素来实现的,该元素可以根据参数的值来生成不同的 ...

    Ibatis复杂查询语句.doc

    总结起来,这个Ibatis查询语句充分展示了Ibatis处理复杂查询的能力,包括动态SQL、子查询、多表联接、条件判断、数据类型映射和迭代处理等功能。在实际开发中,这种灵活性使得Ibatis能够适应各种复杂的业务场景,...

    iBatis.net使用动态sql语句

    因为要下载其它的文件,所以从网站复制了一些其它的资源进行上传。但是这个资源是相当有用的。这里感谢之前总结相关技术的人员。谢谢

    Ibatis常用sql语句

    根据给定的文件信息,以下是对“Ibatis常用SQL语句”的详细解析,涵盖了一系列Ibatis在数据操作中的应用实例。 ### Ibatis简介 Ibatis是一个支持普通SQL查询、存储过程以及高级映射的优秀持久层框架。Ibatis可以让...

    iBatis执行非查询语句(CRUD,函数和过程)

    这篇博客“iBatis执行非查询语句(CRUD,函数和过程)”深入探讨了如何在iBatis中执行创建、读取、更新和删除(CRUD)操作,以及调用数据库存储过程和函数。 一、iBatis简介 iBatis最初由MyBatis的创始人Clinton ...

    ibatis的动态查询

    ### ibatis的动态查询知识点详解 #### 一、模糊查询 **知识点1:** 在进行模糊查询时,ibatis支持两种不同的语法标记:`#` 和 `$`。 1. **使用 `$value$` 进行模糊查询:** - 在进行模糊查询时,使用 `$value$` ...

    ibatis常用sql语句

    通过`&lt;select&gt;`标签,可以构建带有动态条件的SQL查询语句。`HashMap`的键值对可以用作查询条件,如`#memberId#`和`#start#`、`#end#`,分别代表成员ID和时间范围。这样的设计允许开发人员根据不同的业务需求灵活构建...

    在ibatis日志信息中打印SQL语句的方法(个人总结)

    在使用iBatis(现为MyBatis)作为持久层框架进行开发时,有时我们需要调试SQL语句,以便查看执行的SQL、优化性能或者解决查询问题。本文将详细讲解如何在iBatis日志信息中打印SQL语句,以便更好地理解和优化数据库...

    ibatis动态SQL标签用法

    iBatis是Java持久层框架,提供了动态SQL标签来实现动态查询。动态SQL标签可以根据不同的条件生成不同的SQL语句,从而提高查询效率和灵活性。 动态SQL片段 iBatis提供了动态SQL片段的功能,可以将SQL语句拆分成小的...

    Ibatis查询Id列表.doc

    通过上述分析可以看出,文档中的内容主要是关于如何在Ibatis中构建动态SQL语句以查询特定条件下的ID列表。这些技巧对于提高数据库查询的灵活性和效率非常重要。开发者可以根据具体的业务需求调整各个动态SQL元素中的...

    ibatis UPDATE 动态XML与insert

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

    ibatis_with_memcached

    Ibatis是一个基于Java的SQL映射框架,它允许开发者编写SQL语句并与Java对象进行绑定,从而避免了传统的JDBC代码带来的繁琐。Ibatis提供了一种灵活的方式来控制SQL的执行,同时保持了SQL与业务逻辑的分离,使得数据库...

    操作数据库 iBATIS查询

    iBATIS推荐的写法是在SQL字符串中动态添加`%`,如下所示: ```xml SELECT * FROM t_stu WHERE s_name LIKE '%' || #name# || '%' ``` 在这个例子中,`#name#`代表传入的参数,而`'||'`是字符串拼接操作符。这样...

    ibatis查询语句配对.doc

    ### ibatis查询语句配对知识点详解 #### 一、ibatis简介 ibatis(现称为MyBatis)是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。ibatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。...

Global site tag (gtag.js) - Google Analytics