MyBatis 中 #{} 和 ${}的区别是什么?
#{} 是预编译处理,${} 是字符串替换
- Mybatis 在处理 #{} 时,会将 SQL 中的 #{} 替换为 ? 号,调用 PreparedStatement 的 set 方法来赋值;使用 #{} 可以有效的防止 SQL 注入,提高系统安全性;
-
MyBatis 在处理 ${} 时,
就是把 ${} 替换成变量的值。
#{} 是预编译处理,${} 是字符串替换
MyBatis 在处理 ${} 时,
就是把 ${} 替换成变量的值。
评论(3)
SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中:1、#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:where username=#{username},如果传入的值是111,那么解析成sql时的值为where username=”111″, 如果传入的值是id,则解析成的sql为where username=”id”.
2、将传入的数据直接显示生成在sql中。如:where username={username},如果传入的值是111,那么解析成sql时的值为where username=111;如果传入的值是;drop table user;,则解析成的sql为:select id, username, password, role from user where username=;drop table user;
在编写MyBatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止SQL注入攻击。
#{}:其本质是占位符,但是对于日期类型和字符串类型而言会自动加上单引号
${}:其本质是字符串拼接,但是对于日期类型和字符串类型的话需要手动加上单引号
#{}是占位符,${}是拼接符。