在MyBatis的SQL映射文件中,#{} 和 ${} 是两种用于插入变量值的方式。
1. #{}(预编译参数):(底层使用PrepareStatement)
#{} 用于表示一个占位符,通常用于传递参数给SQL语句,这些参数会被MyBatis框架安全地转义和处理,以防止SQL注入攻击。
#{} 会将参数值替换成一个占位符,并自动进行适当的转义和类型处理。这使得SQL语句更加安全,并且避免了潜在的安全风险。
<!-- 使用 #{userId} 占位符,会自动进行参数转义和类型处理 -->
SELECT * FROM users WHERE id = #{userId}
如果传递 userId 参数的值为 1,MyBatis会将上述SQL语句转换为:
SELECT * FROM users WHERE id = 1
2. ${}(字符串替换):(底层使用Statement)
${} 用于字符串替换,它会将${}包裹的内容替换成参数的实际值,但不会进行转义或类型处理。
使用${}时,你需要确保传递的参数值是安全的,以防止潜在的SQL注入攻击。因为参数值会直接插入到SQL语句中,不会受到额外的处理。
<!-- 使用 ${userId} 进行字符串替换,不会进行参数转义 -->
SELECT * FROM users WHERE id = ${userId}
如果传递 userId 参数的值为 1,MyBatis会将上述SQL语句直接替换为:
SELECT * FROM users WHERE id = 1
总结:
使用 #{} 更安全,因为它会自动进行参数转义和类型处理,可以有效防止SQL注入攻击。
使用 ${} 时需要格外小心,确保传递的参数值是受信任和安全的,以避免潜在的风险。
一般情况下,建议使用 #{},特别是在接受用户输入的参数时.