输卵管粘连就是堵塞吗:iBATIS 模糊查询LIKE (转) - 我的博客 - ITeye技术网站

来源:百度文库 编辑:九乡新闻网 时间:2024/05/17 00:32:18
麻烦管理员帮我删了。。。 |在Web项目中使用LiquiBase实现数据库自动 ...
2010-02-08
iBATIS 模糊查询LIKE (转)
文章分类:Java编程
iBatis 开发指南告诉我们,当 Person 对象的 name 属性不为 null 时启用 name 查询条件在映射文件 person.xml 中的配置为
 
Xml代码 

select id as id,name as name,passwd as passwd from person


(name like #name#)




再用如下的代码调用
 
Java代码 
Person person = new Person();
person.setName("unmi");
List list = sqlMap.queryForList("getPersonsByName", person);
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 的模糊查询的配置如下(两种方式)
 
Xml代码 

select id as id,name as name,passwd as passwd from person


(name like '%$name$%')





不知细心的诸位注意到没有,这同时也是我在组织上面文字时产生的疑问:
1. 写成 (name like '%'||$name$||'%') 为什就不行呢?# 和 $ 有什么区别呢?
2. 还有明明是写成的 unmi,为什么报错的时候又是全大写的 UNMI 呢?
具体的异同我们可能还需从源代码中找,简单的只要知道,$name$ 是字面意义的替换,这种形式要注意 SQL 注入的漏洞;#name# 是带类型的替换。至于unmi被转换成大写,还需再研究研究,对于以上两个疑问必要时还可以发挥一下。也要权衡一下花那个时间值不值。
以上转自http://hi.baidu.com/edmond80/blog/item/44b31afa42aef18b9f51467e.html
网上搜了一下ibatis的关于like的使用,相信看到这篇文章的XDJM也应该知道如何解决了 ,我在这里就不重复了,只想补充说明一下:
撇开 '%$xxx$%' 不讲。网上的解决方法如下:
Sql代码
SELECT *         FROM user         WHERE username like '%'  || #username# || '%'
其实上面的语句是正对Oracle 的,对于不同数据字符串连接符不一样。现列举mysql和SQLServer如下:
Mysql:
Sql代码
SELECT *         FROM user         WHERE username like CONCAT('%', #username#, '%')
SQLServer:
Sql代码
SELECT *         FROM user         WHERE username like '%' + #username# +  '%'
-----------------------------------------------------------------------------------------------------------------------------
关于数据库字符串连接符简单列举我使用过的一些数据库如下:
Oracle SQLServer Mysql DB2
|| 或 CONCAT() + CONCAT() || 或CONCAT()
以上内容转自http://lawuu.iteye.com/blog/230791
iBATIS 模糊查询LIKE (转) - 我的博客 - ITeye技术网站 Java-Web开发基础之html语法基础 - 小雄的博客 - ITeye技术网站 转:再见了,已走上陌路的爱 - 心似海 - ITeye技术网站 个人对程序员的理解 - - ItEye技术网站 网景和微软的竞争 - - ITeye技术网站 浅谈JSON的两种数据结构 - - ITeye技术网站 Oracle学习路线图 - zscomehuyue - ItEye技术网站 Linux soft - 天行健 - Lindows - ItEye技术网站 【转】SQL模糊查询 原来公司需要这样的你 - 淡蓝的意大利 - ItEye技术网站 优秀的孩子是这样培养的,建议永久保存 - 微乎其微 神乎其神 - ITeye技术网站 一个Java架构师的新年期望 - 花钱的年华 - ITeye技术网站 sun(Java)与微软的故事 - what life tells - ITeye技术网站 软件测试外包揭秘 - 我是一个二手的程序员! - ITeye技术网站 (转)ASCII 到UNICODE再到UTF8 - My Way In Programing - ItEye技术网站 MyEclipse 中开发SCA应用入门 - 好高悟远 - ItEye技术网站 ExtremeTable使用指南:Form指南 - appdemo - ItEye技术网站 Tomcat连接池(server.xml) - - ITeye技术网站 GRUB安装,配置及使用汇总 - ITeye技术网站 数据库基本sql语句 - 自强不息 厚德载物 - ITeye技术网站 双数组TRIE树原理 - lucene_guy - ITeye技术网站 [转贴]System.getProperty()参数大全 - yueguangyuan - ITeye技术网站 oracle补丁下载 - 老别 - ITeye技术网站 SysV IPC 内核参数调整 - chaoslawful - ITeye技术网站