在写后台程序的时候,想做到按照单个字段进行模糊查询。
一开始的做法是这样子写的:
<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