iBatis 中 Like '%iBatis%' 的写法实现模糊查询

在写后台程序的时候,想做到按照单个字段进行模糊查询。

一开始的做法是这样子写的:

<dynamic prepend="WHERE">       
            <isNotNull prepend="AND" property="name">       
                  (name like #name#)       
            </isNotNull>       
 </dynamic>      

但是这句的作用和

select * from user where name = "aa"

并没有实现模糊查询,我们是实现如下的语句

select * from user where name like '%aa' 
select * from user where name like 'aa%'
select * from user where name like '%aa%' 
 

在ibatis中该如何写了?一开始我配置成

<dynamic prepend="WHERE">       
            <isNotNull prepend="AND" property="name">       
                  (name like ‘%#name#%’)       
            </isNotNull>       
 </dynamic> 

但是程序报错,后来发现资料找到正确的写法有2种:

1,要把上面的‘%#name#%’ 改成‘%$name$%’

2, 用 || 连接字符串的方式,写成 (name like '%' || #name# || '%')

 

$符号会把参数原样嵌入sql语句中而不进行预编译,这就使得有可能出现sql注入攻击。其实ibatis从根本上简单的说,凡是#的,都作为参数,用setobject方式预编译。而$方式的,则直接替换字符串。 所以说,$很不安全,会把用户的输入直接当参数放入 sql。

# 会根据不同类型而生产字符串,如 String 类型 : aa ---> 'aa'
$ 表示原生类型,如 String 类型 : aa ---> aa

posted @ 2012-07-24 23:58  _zao123  阅读(413)  评论(0编辑  收藏  举报