MyBatis 中的 #{}
和 ${}
是两种不同的占位符,它们在表达式语言中有不同的用途和功能。
#{}
是 MyBatis 的内置表达式语言,也被称为 JSR 303 标准的 EL(Expression Language)。它允许你在 SQL 语句中插入动态数据。使用 #{}
的好处是它可以防止 SQL 注入攻击,因为它会自动转义输入的数据,确保它们符合 SQL 语法。
举个例子,假设你有一个查询语句,它需要一个参数来查询数据库,这个参数是从前端传过来的用户名。你可以使用 #{}
来插入这个参数,如下所示:
SELECT * FROM users WHERE username = #{username}
在上述示例中,如果 username
的值来自前端用户的输入,那么使用 #{}
可以确保 SQL 语法正确,并且可以防止 SQL 注入攻击。
另一方面,${}
是一个普通的字符串插值表达式,它直接将变量名作为字符串插入到 SQL 语句中。这种表达式的缺点是它不会自动转义输入的数据,容易引发 SQL 注入问题。
举个例子,假设你有另一个查询语句,它直接使用了用户的输入作为查询条件:
SELECT * FROM users WHERE user_name = ${username}
在这种情况下,如果 username
的值来自前端用户的输入并且没有被正确地转义,那么这可能会导致 SQL 注入攻击。
因此,如果你在 MyBatis 中使用参数化查询,建议使用 #{}
而不是 ${}
。这样可以确保数据的安全性,同时也可以提高代码的可读性和可维护性。
#{}是预编译处理,KaTeX parse error: Expected 'EOF', got '#' at position 21: …串替换。 Mybatis在处理#?{}时,会将sql中的#{}替…{}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。