`#{}`和`${}`

115 阅读1分钟

在MyBatis中,#{}${}是用于传递参数的两种不同的语法格式,它们在处理参数值的方式上有一些关键的区别:

  1. #{}:预编译参数(PreparedStatements)

    • #{}语法会在 SQL 中使用预编译的方式,会把传入的值当作一个参数,并使用 JDBC 的预编译语句(PreparedStatement)来处理,这样可以防止 SQL 注入攻击。
    • #{}中的值会被自动添加单引号,因此不论传入的是什么类型的值,MyBatis 都会将其转换为字符串。
    • #{}可以防止 SQL 注入,因为预编译的方式会把传入的参数值当作一个整体,而不是 SQL 语句的一部分。

    示例:

    SELECT * FROM user WHERE id = #{userId}
    
  2. ${}:字符串替换

    • ${}语法会把传入的值直接拼接到 SQL 语句中,它是字符串替换的方式。
    • ${}中的值不会被添加单引号,因此如果传入的是字符串,需要在 SQL 语句中手动添加单引号。
    • 使用${}时要注意 SQL 注入的风险,因为传入的值直接被拼接到 SQL 语句中,可能受到恶意输入的影响。

    示例:

    SELECT * FROM user WHERE id = ${userId}
    

总结:

  • 使用 #{}可以防止 SQL 注入,适用于大多数的 SQL 参数。
  • 使用 ${}适用于一些特殊场景,比如动态表名、字段名等,但需要谨慎防范 SQL 注入的风险。
  • 在普通的查询、插入、更新等操作中,推荐使用 #{}