类似下列这种写法是采用preparedStatement实现,是不会引起sql注入的
<isNotEmpty prepend="AND" property="name">
name like #name#
</isNotEmpty>
但是它跟
<isNotEmpty prepend="AND" property="name">
name = #name#
</isNotEmpty>
没有区别,没有实现模糊查询,实现模糊查询的简单方法是这样:
<isNotEmpty prepend="AND" property="name">
name like '%$name$%'
</isNotEmpty>
但这时会导致sql注入问题,比如参数name传进一个单引号“'”,生成的sql语句会是:
name like '%'%'
这样肯定是会报错的,解决方法是利用字符串连接的方式来构成sql语句,如下:
<isNotEmpty prepend="AND" property="name">
name like '%'||'#name#'||'%'
</isNotEmpty>
(“||”是Oracle中连接字符串的方法,MSSQL中是用加号,MySQL中是用CONCAT)
这样参数都会经过预编译,就不会发生sql注入问题了。
原文出处:http://hi.baidu.com/uponcen/item/be9224d0cc6a5d15d80e4433