偶然遇到一个SQL注入的问题。
这里groupArr是一个list集合,当我使用${it} 分组group by是正常的,但是使用了#{it}之后不生效
接地气的说就是,
使用#{} 的时候,比如 #{className} 会替换成 '班级'。
使用${} 的时候,比如 ${className} 会替换成 班级
当在 MyBatis 中编写 SQL 查询语句时,#{}
和 ${}
是两种不同的语法,用于处理参数值和文本替换。这里是它们的详细介绍:
${}
${}
是 MyBatis 的属性占位符语法。在 SQL 语句中,${}
会被直接替换为参数值,这样可以直接将参数值嵌入到 SQL 语句中。使用 ${}
时,需要注意 SQL 注入的风险,因为参数值会直接嵌入到 SQL 语句中,可能会导致安全漏洞。
#{}
#{}
是 MyBatis 的预编译占位符语法。在 SQL 语句中,#{}
会被替换为占位符 ?
,这样参数值会以安全的方式传递给 SQL 数据库,避免了 SQL 注入的风险。MyBatis 会在执行 SQL 语句之前将参数值设置到占位符 ?
中。
区别总结
-
参数值处理:
${}
:直接替换参数值到 SQL 语句中。#{}
:使用占位符?
传递参数值,确保安全性和预编译。
-
安全性:
${}
存在 SQL 注入风险,因为参数值直接嵌入到 SQL 语句中。#{}
避免了 SQL 注入风险,参数值以安全的方式传递给 SQL 数据库。
-
预编译:
${}
不进行预编译,参数值直接嵌入到 SQL 语句中。#{}
进行预编译,参数值以占位符?
的形式传递给 SQL 数据库。
使用场景
${}
适用于处理 SQL 语句的文本内容,如表名、列名等,但需要注意安全性问题。#{}
适用于处理 SQL 语句中的参数值,可以确保安全性,并支持预编译,常用于查询条件、插入、更新等操作。
在 MyBatis 中,通常推荐使用 #{}
进行参数传递,以确保安全性和预编译。
希望这些解释能帮助你更好地理解 ${}
和 #{}
在 MyBatis 中的作用和区别。