Skip to main content

参数

David LiuAbout 2 min

参数

占位符

  • ${}是 Properties 文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc. Driver

    字符串拼接

  • #{}是 sql 的参数占位符,MyBatis 会将 sql 中的#{}替换为? 号,在 sql 执行前会使用 PreparedStatement 的参数设置方法,按序给 sql 的? 号占位符设置参数值,比如 ps.setInt(0, parameterValue),#{item.name} 的取值方式为使用反射从参数对象中获取 item 对象的 name 属性值,相当于 param.getItem().getName()

在 MyBatis 中,#{}${}都是用于 SQL 语句中的占位符,但它们的使用方式和含义是不同的。

#{}是预编译的占位符,它会将传入的参数进行预编译处理,防止 SQL 注入攻击。在 SQL 语句中,#{}用于表示一个占位符,例如:

<select id="getUserById" resultType="User">
  SELECT * FROM users WHERE id = #{id}
</select>

这里的#{id}表示一个预编译的占位符,MyBatis 会将传入的id参数进行预编译处理,然后将其替换到 SQL 语句中。

${}是字符串拼接的占位符,它不会对传入的参数进行预编译处理,存在 SQL 注入攻击的风险。在 SQL 语句中,${}用于表示一个占位符,例如:

<select id="getUserByName" resultType="User">
  SELECT * FROM users WHERE name = '${name}'
</select>

这里的${name}表示一个字符串拼接的占位符,MyBatis 会将传入的name参数直接拼接到 SQL 语句中,存在 SQL 注入攻击的风险。

总之,#{}${}都是用于 SQL 语句中的占位符,但它们的使用方式和含义是不同的。#{}是预编译的占位符,用于防止 SQL 注入攻击,而${}是字符串拼接的占位符,存在 SQL 注入攻击的风险。在使用 MyBatis 时,应该尽量使用#{}来防止 SQL 注入攻击。