mybatis #{} 和 ${} 的区别

在 MyBatis 中,#{} ${} 是两种不同的参数处理方式,它们在 SQL 语句的动态生成和预编译语句的参数绑定中扮演着不同角色。

#{}

#{} 主要用于预编译语句(Prepared Statement)的参数绑定,它具有以下几个特点:

  1. 防止 SQL 注入:#{} 能够自动进行字符串的转义,将特殊字符转为 SQL 字符串,从而有效地防止 SQL 注入攻击。

  2. 参数类型匹配:MyBatis 会根据参数的实际类型,将合适的 JDBC 类型传递给数据库,这对于处理日期、布尔值等非字符串类型特别有用。

  3. 命名参数:#{} 支持命名参数,这提高了 SQL 语句的可读性,例如 #{username}

  4. 占位符绑定:在预编译语句中,#{} 会被替换为一个问号(?)占位符,实际参数值在执行 SQL 语句时通过 PreparedStatement 的 setParameter 方法传入,提高了 SQL 执行效率和安全性。

${}

${} 主要用于文本替换,它将直接替换为变量的值,适用于以下情况:

  1. 动态 SQL:在需要拼接 SQL 语句的场景下,${} 可以直接将变量值插入到 SQL 语句中,例如在 WHERE 子句中动态添加条件。

  2. 表名或列名动态化:当需要动态指定表名或列名时,可以使用 ${} 来实现。

但是,使用 ${} 有以下几点需要注意:

  1. SQL 注入风险:直接使用变量值拼接 SQL 语句,如果没有适当的过滤,容易受到 SQL 注入攻击。

  2. 不支持预编译语句:${} 不会被替换为预编译语句的占位符,而是直接替换为变量值,这意味着每次执行 SQL 语句时都会解析和优化 SQL,降低了性能。

posted @ 2024-06-30 17:56  使用D  阅读(30)  评论(0编辑  收藏  举报