用#{}和 ${}获取传参的区别
其实区别很简单的,举两个例子大家就会明白的。
①写一句SQL-例如:
select * from student where name= "pcqstart";
这句话而言,需要写成
select * from ${tableName} where user_code = #{userName}
所以,$符是直接拼成sql的 ,#符则会以字符串(加“”双引号)的形式 与sql进行拼接。
②例子:
说明:#{}能够更安全的取出参数, $ {}取出的参数不安全,尽量不要使用${}取参数
原因:
A:select * from table where name = ${parameter}
B:select * from table where name = #{parameter}
若parameter的值为: ‘’ or 1=1
A的sql就解析为
select * from student where name = '' or 1=1 //注入成功,
// 因此后面就可以执行or 1=1,执行成功,这就是sql注入。
B的sql就解析为
select * from student where name = ?;
select * from student where name =' '' or 1=1 ' //注入失败
// 这里’ ‘’ or 1=1 ’ 就成为了一个字符串参数,而没有将or、=解析成为sql的运算符。
总结:
1、$ {}:
①直接获取传输过来的内容,直接输出;
②向数据库输入表名或者列名时才使用。
③配置DataSources数据源等信息时,也是使用${};
2、#{}:
①解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数?占位符 。
3、说明:
①如果为int,则直接输入int型,如果为字符串型则直接加“”后输入;
②’or 1=1 #'将作为一个字符串,=将不再作为运算符。