mybatis 中 #{}和 ${}的区别是什么?

在 MyBatis 中,#{} 和 ${} 是两种用于参数替换的语法,但它们之间存在一些重要的区别,主要体现在安全性、预编译和动态 SQL 上。

  1. 安全性

    • #{}:这是预编译处理,MyBatis 会为传入的参数生成 PreparedStatement,使用占位符 ? 来代替参数,这样可以防止 SQL 注入。因为传入的参数会被当作字段值来处理,而不是直接拼接到 SQL 语句中。
    • ${}:这是字符串替换,MyBatis 会直接替换 SQL 语句中的 ${} 为传入的值。如果传入的值包含 SQL 语句片段(如 ORDER BY ${column}),那么它会被直接拼接到 SQL 语句中,这可能导致 SQL 注入风险。因此,在使用 ${} 时需要格外小心,确保传入的值是安全的。
  2. 预编译

    • #{}:由于使用了 PreparedStatement,所以 SQL 语句在传入参数之前就已经被预编译过了,这样可以提高执行效率。
    • ${}:没有预编译的过程,直接替换并执行 SQL 语句。
  3. 动态 SQL

    • #{}:虽然它主要用于防止 SQL 注入和预编译,但在某些情况下(如动态表名、动态列名等),由于它无法识别这些动态部分,因此可能无法使用 #{}
    • ${}:在这些需要动态 SQL 的场景下,${} 是非常有用的,因为它可以直接替换 SQL 语句中的任何部分。但是,请确保在使用 ${} 时进行了充分的安全检查。
  4. 数据类型

    • #{}:会自动对参数进行 JDBC 类型的转换(如将 Java 中的 String 类型转换为 JDBC 中的 VARCHAR 类型)。
    • ${}:只是简单的字符串替换,不会进行 JDBC 类型的转换。

总结:在大多数情况下,应该优先使用 #{},因为它更安全、更高效。但是,在需要动态 SQL 的场景下,可以使用 ${},但请确保进行了充分的安全检查。

相关推荐

  1. mybatis #{} ${}区别什么

    2024-05-10 01:00:07       11 阅读
  2. Mybatis${}#{}区别

    2024-05-10 01:00:07       22 阅读
  3. PHPGETPOST方法区别什么

    2024-05-10 01:00:07       34 阅读
  4. Vue3 refreactive区别什么

    2024-05-10 01:00:07       34 阅读
  5. MySQLNULL区别什么?底层原理什么

    2024-05-10 01:00:07       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-10 01:00:07       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-10 01:00:07       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-10 01:00:07       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-10 01:00:07       18 阅读

热门阅读

  1. 3D旋转rotatex

    2024-05-10 01:00:07       14 阅读
  2. 详解Go语言Map

    2024-05-10 01:00:07       10 阅读
  3. c#读取hex文件方法,相对来说比较清楚

    2024-05-10 01:00:07       12 阅读
  4. 【网络】TCP的长连接是如何实现的

    2024-05-10 01:00:07       9 阅读
  5. AtCoder Beginner Contest 336 D题 Pyramid

    2024-05-10 01:00:07       13 阅读
  6. 今日总结2024/5/9

    2024-05-10 01:00:07       11 阅读
  7. 训练:shell_day01-10

    2024-05-10 01:00:07       12 阅读