iBatis 中 Like 的写法实现模糊查询
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%';
也就是如上的 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......
那么正确的写法是什么呢?在网上找到一个解答方法有两种:
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被转换成大写,还需再研究研究,对于以上两个疑问必要时还可以发挥一下。也要权衡一下花那个时间值不值。
附:
为了防止SQL注入,iBatis模糊查询时也要避免使用$$来进行传值。下面是三个不同数据库的ibatis的模糊查询传值。
mysql: select * from stu where name like concat('%',#name #,'%')
oracle: select * from stu where name like '%'||#name #||'%' SQL Server:
select * from stu where name like '%'+#name #+'%
iBatis 中 Like 的写法实现模糊查询的更多相关文章
- neo4j中cypher语句多个模糊查询
总结一下经验: neo4j中,cypher语句的模糊查询,好像是个正则表达式结构. 对于一个属性的多个模糊查询,可以使用如下写法: 比如,查询N类型中,属性attr包含'a1'或者'a2'的所有节点. ...
- django中多个字段的模糊查询
django中多个字段的模糊查询 使用Entity.objects.filter(name_contains='kris').filter(address='beijing') 这个方法是指名字包含k ...
- 在JDBC中实现SQL语句的模糊查询
在JDBC中实现SQL语句的模糊查询 在大多数情况下我们可以在JDBC中写入sql语句通过占位符的方式来直接查询,但是如果要进行模糊查询,需要转义字符才能够正常查询. sql语句: select * ...
- python中的mysql数据库like模糊查询
%在python中是个特殊的符号,如%s,%d分别代表了字符串占位符和数字占位符. 大家知道,mysql的模糊查询也需要用到%. 所以,可以先把需要查的字符串抽出来,再以参数方式传入. args = ...
- Java中使用PrepateStatement并且like模糊查询
在使用PreparedStatement进行模糊查询的时候废了一番周折,以前一直都没有注意这个问题.一般情况下我们进行精确查询,sql语句类似:select * from table where na ...
- java中实现对list的模糊查询
比如我有下面这样一个List,里面存放的是多个Employee对象.然后我想对这个List进行按照Employee对象的名字进行模糊查询.有什么好的解决方案么?比如我输入的查询条件为“wang”,那么 ...
- Mybatis 中在xxx.mapper书写模糊查询
1.在mybatis中,书写sql,有时候会有一些不细心,如: <!-- 首页商品 关键字搜索--> <select id="getGoodsByLikeTitle&quo ...
- MySQL模糊查询中通配符的转义
sql中经常用like进行模糊查询,而模糊查询就要用到百分号“%”,下划线“_”这些通配符,其中“%”匹配任意多个字符,“_”匹配单个字符.如果我们想要模糊查询带有通配符的字符串,如“60%”,“us ...
- oracle 语句之对数据库的表名就行模糊查询,对查询结果进行遍历,依次获取每个表名结果中的每个字段(存储过程)
语句的执行环境是plsql的sql窗口, 语句的目的是从整个数据库中的所有表判断 不等于某个字段的记录数 . 代码如下: declare s_sql clob:=''; -- 声明一个变量,该变量用于 ...
随机推荐
- mysql---ENCODE警告
'ENCODE' is deprecated and will be removed in a future release. Please use AES_ENCRYPT instead ***** ...
- XE8 (RTM) Android SDK 更新安装
适用:XE8 Android 平台 问题:安装 XE8 RTM 时,如果勾选了 Android SDK 5.0.1 (API 21) 及 Android NDK (android-ndk-r9c) , ...
- 历史疑团之EJB
在学习Sping框架的过程中,看到过很多次关于EJB的批判.使用了SpringMVC但是并没有真性情般体会到它的优点,所以有必要对传统的Java Bean和EJB来做一些了解,无奈百度搜了很多知识,还 ...
- php中的字符串常用函数(五) explode 妙用
// 示例 2 $data = "foo:*:1023:1000::/home/foo:/bin/sh" ; list( $user , $pass , $uid , $gid , ...
- No.015:3Sum
问题: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0?Find all ...
- redis持久化机制
redis持久化 redis的数据存在内存中,所以存取性能好.但是存在内存中的数据存在一个问题,一旦机器重启,内存数据消失.为了解决这个问题,redis支持持久化.持久化就是为了解决内存数据丢失时恢复 ...
- TestNG官方文档中文版(4)-运行TestNG
4 - 运行TestNG TestNG可以以不同的方式调用: * Command line * ant * Eclipse * IntelliJ's IDEA 1) 命令行 假 ...
- Jsp九大内置对象及其作用域
本文主要介绍Jsp九大内置对象及其作用域,着重介绍几个常用的,希望对初学者有所帮助. 1 Jsp九大内置对象 2 详细介绍 2.1 request javax.servlet.http.HttpSer ...
- java:JDBC详解
JDBC全称为:Java DataBase Connectivity(java数据库连接). SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC. 简单 ...
- CSS3简单动画
css3的动画确实非常绚丽!浏览器兼容性很重要!. 分享两个小动画 <!doctype html> <html lang="en"> <head> ...