在MyBatis中,#{}${}用于动态地在SQL语句中插入参数,但它们之间存在关键区别:

  1. #{} (预编译参数):
  • 安全#{}用于预编译参数,能够有效防止SQL注入。MyBatis会把#{}内的内容替换为一个预编译的参数标记(如问号?),实际的参数值会在SQL执行前被安全地绑定到这个位置。这种方式允许数据库引擎优化执行计划并确保参数的安全性。
  • 类型安全: 参数会被自动转义并根据上下文正确处理数据类型。
  • 适用场景: 当你需要安全地传递变量到SQL语句中时使用。
  1. ${} (字符串替换):
  • 不安全${}则是一个简单的字符串替换操作,它会直接将变量的值拼接到SQL字符串中,没有进行任何转义或预编译处理。这可能导致SQL注入漏洞,特别是当参数值来源于用户输入时。
  • 无类型处理: 不会进行数据类型的转换或转义,直接将表达式求值后的字符串插入到SQL中。
  • 适用场景: 主要用于非变量部分的字符串替换,例如表名、列名或者静态文本,以及在确定安全的情况下需要直接拼接SQL时(如ORDER BY子句中的排序方向ASCDESC)。

总结来说,#{}更加安全且推荐用于大多数参数传递场景,而${}应谨慎使用,仅在确信不会引起SQL注入风险时使用,主要用于非用户输入的动态SQL构造部分。