iBatis 开发指南告诉我们,当 Person 对象的 name 属性不为 null 时启用 name 查询条件在映射文件 person.xml 中的配置为
<select id="getPersonsByName" resultClass="com.unmi.Person">
select id as id,name as name,passwd as passwd from person
<dynamic prepend="WHERE">
<isNotNull prepend="AND" property="name">
(name like #name#)
</isNotNull>
</dynamic>
</select>
再用如下的代码调用
Person person = new Person();
person.setName("unmi");
List list = sqlMap.queryForList("getPersonsByName", person);
执行效果翻译成 sql 语句就是
- select * from person where name like 'unmi'
select * from person where name like 'unmi'
这实际上是一个完全匹配的查询,与用等号写成如下语句是一致的
- select * from person where name = 'unmi'
select * from person where name = 'unmi'
我们之所以要用 like 谓词,一般都想实现模糊查询,比如说 name 以 'unmi' 开始、结束或包含 'unmi' 的记录,如下
- select * from person where name like 'unmi%';
-
select * from person where name like '%unmi';
-
select * from person where name like '%unmi%';
select * from person where name like 'unmi%'; select * from person where name like '%unmi'; select * from person where name like '%unmi%';
也就是如上的 like 语义在 person.xml中应该怎么表述呢?我曾经是想当然的尝试把
(name like #name#) 写成 (name like '%#name#%') 或 (name like %#name#%) ,都没法通过,分别报错
java.sql.SQLException: Invalid argument in JDBC call: parameter index out of range: 1
和
java.sql.SQLException: Unexpected token: % in statement [ select id......
那么正确的写法是什么呢?在网上找到一个解答 How do I use LIKE in my queries,方法有两种
1. 是把上面 (name like '%#name#%') 的 # 换成 $, 也就是 (name like '%$name$%')
2. 是用 || 连接字符串的方式,写成 (name like '%' || #name# || '%')
但却不能写成 (name like '%'||$name$||'%') ,不能又要出错
java.sql.SQLException: Column not found: UNMI in statement [select id......
总结一下,在 iBatis 中用 like 的模糊查询的配置如下(两种方式)
<select id="getPersonsByName" resultClass="com.unmi.Person">
select id as id,name as name,passwd as passwd from person
<dynamic prepend="WHERE">
<isNotNull prepend="AND" property="name">
(name like '%$name$%')
<!-- (name like '%'||#name#||'%') -->
</isNotNull>
</dynamic>
</select>
不知细心的诸位注意到没有,这同时也是我在组织上面文字时产生的疑问:
1. 写成 (name like '%'||$name$||'%') 为什就不行呢?# 和 $ 有什么区别呢?
2. 还有明明是写成的 unmi,为什么报错的时候又是全大写的 UNMI 呢?
具体的异同我们可能还需从源代码中找,简单的只要知道,$name$ 是字面意义的替换,这种形式要注意 SQL 注入的漏洞;#name# 是带类型的替换。至于unmi被转换成大写,还需再研究研究,对于以上两个疑问必要时还可以发挥一下。也要权衡一下花那个时间值不值。
以上转自http://hi.baidu.com/edmond80/blog/item/44b31afa42aef18b9f51467e.html
网上搜了一下ibatis的关于like的使用,相信看到这篇文章的XDJM也应该知道如何解决了 ,我在这里就不重复了,只想补充说明一下:
撇开 '%$xxx$%' 不讲。网上的解决方法如下:
- SELECT *
- FROM user
- WHERE username like '%' || #username# || '%'
其实上面的语句是正对Oracle 的,对于不同数据字符串连接符不一样。现列举mysql和SQLServer如下:
Mysql:
- SELECT *
- FROM user
- WHERE username like CONCAT('%', #username#, '%')
SQLServer:
- SELECT *
- FROM user
- WHERE username like '%' + #username# + '%'
-----------------------------------------------------------------------------------------------------------------------------
关于数据库字符串连接符简单列举我使用过的一些数据库如下:
Oracle |
SQLServer |
Mysql |
DB2 |
|| 或 CONCAT() |
+ |
CONCAT() |
|| 或CONCAT()
|
以上内容转自http://lawuu.iteye.com/blog/230791
分享到:
相关推荐
iBATIS模糊查询 iBATIS模糊查询是指使用iBATIS框架实现模糊查询的方法。模糊查询是指在数据库中搜索包含指定字符串的记录,通常使用LIKE谓词来实现。 在iBATIS中,模糊查询可以通过在映射文件中定义SQL语句来实现...
标题 "IBatis完成单表基本的数据库操作 模糊查询" 涉及到的是使用iBatis这个轻量级的持久层框架进行数据库的基本操作,特别是模糊查询。iBatis是一个优秀的SQL映射框架,它允许开发者将SQL语句与Java代码分离,提高...
在本教程"07_ibatis教程_模糊查询实体对象"中,我们将深入学习如何使用iBatis这个流行的Java持久层框架进行模糊查询操作,尤其是在处理实体对象时。iBatis作为一个轻量级的ORM(Object-Relational Mapping)工具,它...
在Ibatis教程中,"07_传智播客ibatis教程_模糊查询实体对象"这部分内容可能涵盖了如何将用户输入的实体对象与SQL语句中的模糊查询条件相结合,例如如何将一个User对象的属性作为模糊查询的关键词。教程可能通过实际...
#### 一、iBATIS中的LIKE查询技巧 iBATIS是一款优秀的Java持久层框架,它简化了基于SQL的程序编写,避免了程序员手动处理结果集和手工编写SQL语句。在进行数据库查询时,LIKE查询是一种常见的需求,特别是在搜索...
以上内容详细介绍了 ibatis 中动态查询的基本原理及具体实现方法,包括模糊查询、多条件组合查询以及使用 Map 作为参数的高级用法。这些知识点对于深入理解 ibatis 的动态查询机制非常重要,可以帮助开发者更高效地...
本篇将详细讲解Ibatis在实现模糊查询、关联查询以及增删改查操作时的关键知识点。 首先,模糊查询是数据库操作中常见的功能,Ibatis通过`<if>`标签或`<where>`标签配合`#{}`占位符来实现。例如,如果你有一个用户...
- 在编写SQL时,应避免使用全模糊匹配`LIKE '%text%'`,而应尽可能使用带有前缀或后缀的模糊匹配,如`LIKE 'text%'`,这可以显著提升查询效率。 - 使用`EXISTS`子查询通常比直接关联查询更高效,尤其是在数据量大...
描述部分提到的“返回新建数据ID,分页查询,查询条件,模糊查询,date时间段,list集合,截止日期”则是在iBatis配置中常见的几种操作场景,这些场景在数据持久化的操作中非常实用。下面详细解释这些知识点: 1. 返回...
模糊查询常用于文本搜索,Ibatis支持在SQL语句中使用`LIKE`关键字结合通配符进行模糊匹配。例如,用户输入的部分关键词可以与数据库中的数据进行比较。 ```xml SELECT * FROM users WHERE username LIKE CONCAT('...
模糊查询通常涉及SQL的`LIKE`操作,可以在iBatis的映射文件中配置,然后在JSF页面提供搜索框,将输入传递给后台进行模糊匹配。 9. **错误处理和验证**:JSF提供了内置的验证机制,可以对用户输入进行校验,防止无效...
除了使用JDBC,还可以使用ORM(Object-Relational Mapping)框架,如ProGuard或iBatis,它们可以帮助简化数据库操作,将Java对象与数据库表映射起来,从而更方便地实现模糊查询。 在J2ME中进行模糊查询时,还需要...
可以看到,可以针对不同的字段设置各种条件,例如模糊匹配、范围查询等。 #### 4.3 设置排序 ```java if (record.getSortfield() != null && record.getDir() != null) example.setOrderByClause(record....
在Ibatis的XML配置文件中,可以使用`<if>`标签来插入动态SQL部分,结合`#{}`占位符和通配符,实现动态模糊查询。例如: ```xml SELECT * FROM my_table WHERE column_name LIKE #{searchKeyword} ``` 在...
在Ibatis中,可以使用SQL的LIKE操作符结合通配符(%或_)来实现模糊查询。例如,`WHERE column LIKE '%pattern%'` 将找到所有在指定列中包含"pattern"的行。 5. **多参数查询**: 当需要根据多个条件进行查询时,...
Mybatis 中 Oracle 的拼接模糊查询及用法详解 Mybatis 是一个基于 Java 的持久层框架,提供了强大的数据库交互能力,而 Oracle 则是业界最流行的关系数据库管理系统。本文将详细介绍 Mybatis 中 Oracle 的拼接模糊...
例如,在实现模糊查询功能时,用户的搜索关键词可能包含SQL中的特殊字符,比如`%`、`_`等。如果不做任何处理,这些特殊字符将会被SQL引擎视为通配符,从而导致查询结果出现偏差。 #### 二、特殊字符处理方法 #####...
本篇文章将深入探讨如何使用Ibatis框架实现对`student`表的增删改查操作,包括模糊查询以及利用序列自动生成主键。 首先,我们来理解Ibatis的基本概念。Ibatis是由Apache基金会维护的一个开源项目,它是一个SQL映射...
在 SQL 映射文件中,可以编写带有 LIKE 子句的 SQL 语句来进行模糊查询。例如,要查询所有名字包含特定字符的用户,可以编写如下 SQL: ```xml SELECT * FROM users WHERE username LIKE '%' || #keyword# || '%'...
对于模糊查询,可以在SQL中使用`LIKE`关键字配合`%`通配符,例如:`SELECT * FROM user WHERE username LIKE #{username}%`。 **修改(Update)**: 在`updateUser()`方法上使用`@Update`注解,传入待更新的对象,...