概要
在 MyBatis 中,#{}
和 ${}
是两种用于参数替换的语法,但它们之间存在重要的区别,主要体现在以下几个方面:
预处理和安全性:
- #{}:这是预处理的参数替换方式。MyBatis 会为这些参数生成 PreparedStatement,并使用占位符(通常是 ?)来替换 SQL 语句中的
#{}
部分。这样做的好处是,MyBatis 会为这些参数设置类型处理器,并进行必要的类型转换和转义,从而防止 SQL 注入攻击。 - ${}:这是直接的字符串替换方式。MyBatis 会将
${}
中的内容直接替换到 SQL 语句中,不会进行任何预处理或类型处理。因此,如果${}
中包含用户输入的数据,那么可能会引发 SQL 注入风险。通常,${}
用于替换表名、列名等动态 SQL 片段,而不是用于替换数据值。
参数类型:
#{}
:可以用于替换任何类型的参数,包括基本类型、对象、集合等。MyBatis 会根据参数的类型和 SQL 语句的上下文来自动处理这些参数。${}
:主要用于替换 SQL 片段或动态生成的表名、列名等,通常用于静态值或已知的 SQL 片段。
处理空值:
#{}
:如果参数为空,MyBatis 会将其视为 null 并进行相应的处理。${}
:如果参数为空,MyBatis 会直接将其替换为一个空字符串(或者说,不进行任何替换),这可能会导致 SQL 语句出错或不符合预期。
用途:
#{}
:主要用于数据查询和更新操作,因为它提供了安全的参数替换机制。${}
:主要用于动态 SQL 语句的生成,如动态表名、动态列名等。
性能:
在性能方面,#{}
通常比 ${}
稍慢一些,因为它需要进行预处理和类型处理。但在大多数情况下,这种性能差异是可以忽略不计的,而且安全性更为重要。
总结
在 MyBatis 中,应优先使用#{}
来替换 SQL 语句中的参数,除非有特殊的需求需要使用 ${}
(如动态表名、列名等)。这样可以确保应用程序的安全性,并防止 SQL 注入攻击。