返回
别再傻傻分不清楚,${} 和 #{} 谁更强?
后端
2023-12-12 17:01:31
在 MyBatis 中,${} 和 #{} 都是用来替换参数的,它们都可以将用户传递过来的参数动态地注入到 SQL 语句中。但是,两者之间存在一些关键区别,如下表所示:
特性 | ${} | #{} |
---|---|---|
语法 | ${parameterName} | #(parameterName) |
数据类型 | 字符串 | Java 对象 |
安全性 | 不安全 | 安全 |
性能 | 较慢 | 较快 |
适用场景 | 静态 SQL 语句 | 动态 SQL 语句 |
语法
{} 和 #{} 的语法不同。{} 使用美元符号和花括号来包裹参数名称,而 #{} 使用井号和花括号来包裹参数名称。例如:
// 使用 ${}
String sql = "SELECT * FROM users WHERE name = ${username}";
// 使用 #{}
String sql = "SELECT * FROM users WHERE name = #(username)";
数据类型
{} 和 #{} 可以传递不同数据类型的值。{} 只支持传递字符串值,而 #{} 可以传递任何类型的 Java 对象。例如:
// 使用 ${} 传递字符串值
String sql = "SELECT * FROM users WHERE name = '${username}'";
// 使用 #{} 传递 Java 对象
User user = new User();
user.setUsername("admin");
String sql = "SELECT * FROM users WHERE name = #(user.username)";
安全性
${} 不安全,因为它允许用户直接在 SQL 语句中输入值。这可能会导致 SQL 注入攻击。而 #{} 是安全的,因为它会对用户输入的值进行转义,从而防止 SQL 注入攻击。例如:
// 使用 ${} 不安全
String sql = "SELECT * FROM users WHERE name = ${username}";
// 使用 #{} 安全
String sql = "SELECT * FROM users WHERE name = #(username)";
性能
${} 的性能较慢,因为它需要在运行时对 SQL 语句进行解析。而 #{} 的性能较快,因为它可以在编译时对 SQL 语句进行解析。例如:
// 使用 ${} 性能较慢
String sql = "SELECT * FROM users WHERE name = ${username}";
// 使用 #{} 性能较快
String sql = "SELECT * FROM users WHERE name = #(username)";
适用场景
{} 和 #{} 适用于不同的场景。{} 适用于静态 SQL 语句,即 SQL 语句中的参数值是固定的,不会发生变化。而 #{} 适用于动态 SQL 语句,即 SQL 语句中的参数值是动态的,可能会发生变化。例如:
// 使用 ${} 适用于静态 SQL 语句
String sql = "SELECT * FROM users WHERE name = 'admin'";
// 使用 #{} 适用于动态 SQL 语句
String sql = "SELECT * FROM users WHERE name = #(username)";
总之,${} 和 #{} 都是 MyBatis 中用来替换参数的,但它们之间存在一些关键区别。您需要根据具体情况选择合适的参数替换方式。