#{} 为参数占位符 ?,即sql 预编译
${} 为字符串替换,即 sql 拼接
变量替换后,#{} 对应的变量自动加上单引号 ''
替换后,${} 对应的变量不会加上单引号 ''
#{} 能防止sql 注入
${} 不能防止sql 注入
#{}方式一般用于传入字段值,并将该值作为字符串加到执行sql中,一定程度防止sql注入;${}方式一般用于传入数据库对象,例如传入表名,不能防止sql注入,存在风险
注意:
虽然能用#的时候就不用$,但是$能解决某些特定问题。
1.表名作参数时,必须用 ${}。如:select * from ${tableName}
2.order by 时,必须用 ${}。如:select * from t_user order by ${columnName}
3.使用 ${} 时,要注意何时加或不加单引号,即 ${} 和 '${}'