适合使用${}的场合
- 动态表名或列名:当需要根据程序逻辑动态指定表名或列名时,可以使用
${}
,因为这些通常不是来自用户输入,而是固定的数据库对象名称。 - 排序功能:在使用ORDER BY进行排序时,如果排序字段是动态的,应该使用
${}
,因为#{}
会导致SQL语法错误。 - LIKE查询:虽然直接使用
${}
进行模糊查询存在SQL注入的风险,但可以通过数据库内置函数如CONCAT
来组合字符串,从而避免安全问题。
应该使用#{}的场合
- WHERE条件参数:在WHERE子句中绑定参数时,应使用
#{}
,以利用预编译的优势并防止SQL注入。 - INSERT和UPDATE语句的值:在执行INSERT和UPDATE操作时,应使用
#{}
来绑定动态值,以提高安全性和执行效率。 - 动态SQL的预编译:
#{}
允许MyBatis进行SQL预编译,这有助于提高应用程序的性能,尤其是在处理大量相同结构但不同数据的SQL语句时。 - 参数绑定:在需要绑定参数到SQL语句中的任何地方,除非特定场景要求使用
${}
,否则应优先选择#{}
来减少SQL注入的风险。
在使用${}
时,需要特别注意安全性问题,并在可能的情况下采取措施防止SQL注入攻击。而#{}
因其预编译和自动转义的特性,通常是更安全的选择。