含义
#{}是占位符
${}是拼接符
#{}
表示一个占位符,向占位符输入参数,MyBatis 会自动进行 Java 类型和 jdbc 类型的转换,且不需要考虑参数的类型,以预编译的方式传入,可以有效的防止 SQL 注入,提高系统安全性。
例如:传入字符串,MyBatis 最终拼接好的 SQL 就是参数两边加单引号。
insert into demo values(#{id} , #{username}, #{password })
insert into demo values(?,?,?)
${}
表示 SQL 的拼接,通过 ${ } 接收参数,将参数的内容不加任何修饰拼接在 SQL 中,以字符串替换方式 ${ } 替换成变量的值,可能存在 SQL 注入的安全隐患。在用于传入数据库对象,例如传入表名和列名,还有排序时使用 order by 动态参数时可以使用 ${ } 。
例如:
select * from ${tablename} order by ${
column}
计算示例:
map
page = 1
pageSize = 5
select * from user limit ${
(page-1)* pageSize}, ${pageSize}
区别:
用法:
#{}:为参数占位符?,即 SQL 预编译
${}为字符串替换, 即字符串拼接
运算:
#{}:可做运算
${}:不可做运算
执行流程:
#{}:动态解析 --> 预编译 --> 运行
${}: 动态解析 --> 编译 --> 运行
变量替换:
#{}:变量替换是在 JDBC中,会对变量自动加上单引号
${}:变量替换是在 JDBC 外,不会对变量加上单引号
sql注入:
#{}:可以防止 SQL 注入
${}:不可以防止 SQL 注入
使用技巧:
- 不论是单个参数还是多个参数,一律建议使用 @param(“”)
- 能用 #{ } 的地方尽量使用 #{ },减少 ${ }
- 表名作为参数时,必须使用 ${ }
- order by 时,必须使用 ${ }
- 使用 ${} 时要注意何时加或不加单引号