技术文摘
Mybatis 中 #{} 与 ${} 的区别
Mybatis 中 #{} 与 ${} 的区别
在 MyBatis 框架的使用过程中,#{} 与 ${} 是两个非常重要且容易混淆的概念。深入了解它们之间的区别,对于编写高效、安全且优化的 SQL 语句至关重要。
从语法功能层面来看。#{} 是 MyBatis 提供的预编译处理方式。它会将传入的数据当作一个字符串,在 SQL 语句中用占位符 “?” 进行替换,然后通过 PreparedStatement 来执行 SQL。例如:“SELECT * FROM user WHERE username = #{username}”,MyBatis 会自动处理数据类型转换等问题。而 ${} 则是简单的字符串替换,它会直接将参数值替换到 SQL 语句中。比如 “SELECT * FROM user WHERE username = '${username}'”,这种方式不会进行预编译。
安全性方面,二者差异明显。#{} 由于采用预编译处理,能有效防止 SQL 注入攻击。因为它将参数作为独立部分处理,数据库会把占位符当作普通数据,而非 SQL 语句的一部分。而 ${} 直接进行字符串替换,如果参数值来自外部不可信源,很容易被恶意用户利用,构造恶意 SQL 语句,导致数据泄露或数据库被破坏等严重后果。
性能表现上,#{} 每次执行都会使用 PreparedStatement,在有大量相同结构 SQL 语句执行时,数据库会缓存执行计划,从而提高性能。而 ${} 由于是字符串替换,每次执行都会生成不同的 SQL 语句,数据库无法缓存执行计划,性能相对较差。
适用场景也有所不同。#{} 适用于大多数需要传递参数的场景,特别是涉及用户输入的参数,如登录验证、数据查询等。而 ${} 一般用于表名、列名等无法使用占位符的情况,或者在某些需要动态生成 SQL 语句的特定场景下。
MyBatis 中的 #{} 和 ${} 各有特点。在实际开发中,我们要根据具体需求和场景合理选择使用,以确保系统的安全性、性能和稳定性。