一、区别#{ }和 ${ }
1.#{ }设置占位符
String sql = "select * from userinfo where id = ? ";
statement.setInt(1,id)
2.${ }直接拼接
String sql ="select * from userinfo where id=" + id;
#{ }会进行预处理,不存在安全隐患
${ }会进行拼接处理,存在安全隐患
简单说,#{ }会给中间的内容加' ',而${ }什么都不加
${ }的使用场景
当需要传递的参数是一个SQL语句(不是某个参数的值)的时候,只能以${ }的形式
比如需要传递的是desc或者asc的时候,他们是SQL语句,不是参数的值。
二、使用${ }可能导致SQL注入的问题
举例:
我们设计的两个参数username 和 password
以${ }的方式
select * from userinfo where username='${ }' and password='${ }';
进行直接替换之后,我们得到了这样的语句
select * from userinfo where username='username' and password='password' or 1 = '1';
我们发现,username和password的判断被绕过了。
所以,平时尽量用#{ }的形式,只用在SQL语句(数量有限的)需要拼接时,使用${ }
以此来避免SQL注入的风险。
三、模糊查询
使用拼接函数concat(‘ X ',#{ },’ X ‘)