使用 #{parameter} 引用参数的时候,Mybatis 会把这个参数认为是一个字符串,例如在下面的 sql 传入参数 “haha”
Select from emp where name = #{employeeName}
转化为 Select from emp where name = ‘haha’;
----------------------------------------------------------------------------------
Select from emp where name = ${employeeName}
转化为 Select from emp where name = haha;
简单来说, #{} 是经过预编译的,是安全的,而 ${} 是未经过预编译的,仅仅是取变量的值,是非安全的,存在 sql 注入的危险。# 将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
使用 ${} 的情况,order by、like 语句只能用 ${} 了,用 #{} 会多个 ’ ’ 导致 sql 语句失效.此外动态拼接 sql,模糊查询时也要用 ${}。
举个栗子,假如 name=陈,那么该 sql 就是 … LiKE '%陈%',
DELETE FROM stu WHERE `name` LIKE '%${name}%'
总结如下:
-
#{} :编译好 SQL 语句再取值
-
${} :取值以后再去编译SQL语句