一、先说结论
在使用 MyBatis 进行数据库操作时,`#{} 用于参数绑定,会生成预处理语句,使用 ? 占位符,可以防止 SQL 注入;而 ${} 是直接字符串替换,会将参数值直接嵌入到 SQL 语句中,无法防止 SQL 注入,要谨慎使用。
二、#{}使用案例
- #{} 是 MyBatis 的一种语法,用于将参数值绑定到 SQL 语句中,并使用 ?` 作为占位符。 它能够防止 SQL 注入,
- MyBatis 会将参数值作为绑定变量传递给数据库驱动程序,该驱动程序会对参数进行适当的转义处理。
<select id="selectStudentById" parameterType="int" resultType="Student">
SELECT * FROM Students WHERE id = #{id}
</select>
在这个例子中,#{id}
会被替换为一个 ?
占位符,并且实际的参数值会被安全地绑定到 SQL 语句中。
三、${}使用案例
- ${} 是 MyBatis 的另一种语法,用于直接将参数值嵌入到 SQL 语句中。
- 它不会进行预处理,也不会使用 ? 占位符,而是直接将参数值插入到 SQL 语句中。
- 由于直接将参数值嵌入到 SQL 中,因此不能防止 SQL 注入,需要非常小心使用。
<select id="selectStudentById" parameterType="int" resultType="Student">
SELECT * FROM Students WHERE id = ${id}
</select>
在这个例子中,${name}
会被直接替换为参数值,如果参数值包含恶意的 SQL 代码,就有可能导致 SQL 注入。