返回

别再傻傻分不清楚,${} 和 #{} 谁更强?

后端

在 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 中用来替换参数的,但它们之间存在一些关键区别。您需要根据具体情况选择合适的参数替换方式。