MyBatis #{}和${}的区别是什么?
1 个回答
看透不说透,是规矩,也是格局。张苏### #{} 和 ${} 的区别 1. **#{} 是预编译处理** - **描述**:MyBatis 在处理 `#{} `时,会将 SQL 中的 `#{} `替换为 `? `号,调用 `PreparedStatement `的 `set `方法来赋值。 - **优势**:使用 `#{} `可以有效防止 SQL 注入,提高系统安全性。 - **示例**: ```sql SELECT * FROM users WHERE id = #{id} ``` - 处理后: ```sql SELECT * FROM users WHERE id = ? ``` 2. **${} 是字符串替换** - **描述**:MyBatis 在处理 `${} `时,会直接将 `${} `替换成变量的值。 - **注意**:使用 `${} `时要小心 SQL 注入风险,因为它不会对变量进行任何处理。 - **示例**: ```sql SELECT * FROM users WHERE id = ${id} ``` - 处理后(假设 id = 1): ```sql SELECT * FROM users WHERE id = 1 ``` ### 主要区别 1. **预编译 vs 字符串替换** - `#{} `:预编译处理,将 SQL 语句中的 `#{} `替换为 `? `号,并使用 `PreparedStatement `的 `set `方法赋值。 - `${} `:字符串替换,将 `${} `替换为变量的值,直接拼接到 SQL 语句中。 2. **安全性** - `#{} `:防止 SQL 注入,使用预编译的方式安全性更高。 - `${} `:容易引发 SQL 注入,需要谨慎使用。 ### 具体使用场景 - **使用 #{}** - 当需要传递参数值时,优先使用 `#{} `,如条件查询、更新操作等。 - **示例**: ```sql SELECT * FROM users WHERE username = #{username} ``` - **使用 ${}** - 当需要传递数据库对象(如表名、列名)或动态 SQL 片段时,使用 `${} `,但要注意防止 SQL 注入。 - **示例**: ```sql SELECT * FROM ${tableName} WHERE ${columnName} = 'value' ``` ### 总结 - **#{}**: - 预编译处理,防止 SQL 注入。 - 用于传递参数值。 - **${}**: - 字符串替换,直接拼接变量值。 - 用于传递数据库对象或动态 SQL 片段。 在使用 MyBatis 时,应优先选择 `#{} `来传递参数,以确保 SQL 注入的防护。而在需要动态拼接 SQL 片段时,使用 `${} `时应格外小心,确保输入的安全性。发布于 2024-07-26 18:35 •IP属地 西藏举报评论收藏
公众号进入网站体验更佳

