1. **`#{param}`(预处理参数)**:
- `#{param}`是MyBatis中的参数占位符,它用于预处理(Prepared Statement)语句中的参数。
- 当使用`#{param}`时,MyBatis会将参数值安全地传递给SQL语句,防止SQL注入攻击。
- `#{param}`会自动处理参数的转义,确保传入的值被正确处理,例如,字符串值会被自动加上单引号。
- `#{param}`支持使用MyBatis的类型处理器(Type Handler)来转换参数类型。
- `#{param}`在MyBatis中是推荐的方式,因为它更安全,可以减少SQL注入的风险。
2. **`${param}`(字符串替换)**:
- `${param}`是MyBatis中的另一种参数占位符,它用于直接将参数值替换到SQL语句中。
- 当使用`${param}`时,MyBatis会将参数值直接拼接到SQL语句中,没有预处理。
- `${param}`不会自动转义参数值,因此如果参数值中包含SQL关键字或特殊字符,可能会导致SQL语句错误或SQL注入攻击。
- `${param}`通常用于动态SQL,例如,当需要动态构建表名、列名或复杂的SQL片段时。
- 使用`${param}`需要开发者确保参数值的安全性,避免SQL注入风险。
总结来说,`#{param}`是安全的参数传递方式,适用于大多数情况,而`${param}`则适用于需要动态构建SQL语句的特定场景,但需要开发者更加小心地处理参数值的安全性。在实际开发中,应尽可能使用`#{param}`来传递参数,以提高代码的安全性。