sql映射文件中#{}和${}两者之间有什么区别

在MyBatis的SQL映射文件中,#{} 和 ${} 是两种用于插入变量值的方式。

1. #{}(预编译参数):(底层使用PrepareStatement)

    #{} 用于表示一个占位符,通常用于传递参数给SQL语句,这些参数会被MyBatis框架安全地转义和处理,以防止SQL注入攻击。

    #{} 会将参数值替换成一个占位符,并自动进行适当的转义和类型处理。这使得SQL语句更加安全,并且避免了潜在的安全风险。


SELECT * FROM users WHERE id = #{userId}

   如果传递 userId 参数的值为 1,MyBatis会将上述SQL语句转换为:

SELECT * FROM users WHERE id = 1

2. ${}(字符串替换):(底层使用Statement)

    ${} 用于字符串替换,它会将${}包裹的内容替换成参数的实际值,但不会进行转义或类型处理。

    使用${}时,你需要确保传递的参数值是安全的,以防止潜在的SQL注入攻击。因为参数值会直接插入到SQL语句中,不会受到额外的处理。


SELECT * FROM users WHERE id = ${userId}

   如果传递 userId 参数的值为 1,MyBatis会将上述SQL语句直接替换为:

SELECT * FROM users WHERE id = 1

总结:

 使用 #{} 更安全,因为它会自动进行参数转义和类型处理,可以有效防止SQL注入攻击。

 使用 ${} 时需要格外小心,确保传递的参数值是受信任和安全的,以避免潜在的风险。

 一般情况下,建议使用 #{},特别是在接受用户输入的参数时.

你可能感兴趣的:(数据库)