MyBatis中,#
和 $
是两种不同的取值符号,它们在SQL语句中的使用方式和作用有所不同。
1、#符号
"#符号",用于预编译语句,会将传入的参数值转义并替换为占位符,从而防止SQL注入攻击,
在使用#符号时,MyBatis会将传入的参数值作为一个整体传递给数据库,而不会对参数值进行拼接操作。
* 例如,
使用#符号时:
SELECT * FROM users WHERE id = #{userId}
"#{userId}"会被替换为一个占位符,传入的参数值,会被转义并安全地传递给数据库。
预编译处理:
#{}:MyBatis会使用预编译的SQL语句,并为每个参数设置相应的占位符(通常是 ?),
当执行SQL时,MyBatis会使用"PreparedStatement的setXXX()方法"来设置参数值,
这种方式,可以有效地防止SQL注入攻击,因为参数值不会被解析为SQL的一部分。
类型处理:
#{}:MyBatis会根据参数的类型,自动进行必要的类型转换和转义处理。
2、$符号
"$符号",用于字符串拼接,会直接将传入的参数值,拼接到SQL语句中,
在使用$符号时,传入的参数值不会被转义,可能存在SQL注入的风险。
* 例如,
使用$符号时:
SELECT * FROM users WHERE id = ${userId}
"${userId}"会被直接替换为传入的参数值,可能存在SQL注入的风险。
预编译处理:
${}:MyBatis会直接将参数值替换到SQL语句中,
这意味着,如果参数值中包含"SQL关键字" 或 "特殊字符",
它们可能会被错误地解析为SQL的一部分,从而导致SQL注入的风险,
因此,`除非确实需要,否则应避免使用${}`。
类型处理:
${}:MyBatis不会对参数值进行任何处理,只是简单地将其替换到SQL语句中,
这意味着,你需要自己确保参数值的格式和类型是正确的。
总之:
使用
#符号
可以防止SQL注入攻击,适合传递参数值使用
$符号
适合在SQL语句中进行字符串拼接,但需要注意防范SQL注入攻击