mybatis #{} 和 ${} 的区别
在 MyBatis 中,#{}
和${}
是两种不同的参数处理方式,它们在 SQL 语句的动态生成和预编译语句的参数绑定中扮演着不同角色。
#{}
#{}
主要用于预编译语句(Prepared Statement)的参数绑定,它具有以下几个特点:
-
防止 SQL 注入:
#{}
能够自动进行字符串的转义,将特殊字符转为 SQL 字符串,从而有效地防止 SQL 注入攻击。 -
参数类型匹配:MyBatis 会根据参数的实际类型,将合适的 JDBC 类型传递给数据库,这对于处理日期、布尔值等非字符串类型特别有用。
-
命名参数:
#{}
支持命名参数,这提高了 SQL 语句的可读性,例如#{username}
。 -
占位符绑定:在预编译语句中,
#{}
会被替换为一个问号(?)占位符,实际参数值在执行 SQL 语句时通过 PreparedStatement 的 setParameter 方法传入,提高了 SQL 执行效率和安全性。
${}
${}
主要用于文本替换,它将直接替换为变量的值,适用于以下情况:
-
动态 SQL:在需要拼接 SQL 语句的场景下,
${}
可以直接将变量值插入到 SQL 语句中,例如在 WHERE 子句中动态添加条件。 -
表名或列名动态化:当需要动态指定表名或列名时,可以使用
${}
来实现。
但是,使用 ${}
有以下几点需要注意:
-
SQL 注入风险:直接使用变量值拼接 SQL 语句,如果没有适当的过滤,容易受到 SQL 注入攻击。
-
不支持预编译语句:
${}
不会被替换为预编译语句的占位符,而是直接替换为变量值,这意味着每次执行 SQL 语句时都会解析和优化 SQL,降低了性能。
收藏文章数量从多到少与“把书读薄”是一个道理