MyBatis 面试
【简单】MyBatis 中 #{} 和 ${} 的区别是什么?
MyBatis 中 #{}
和 ${}
的区别对比
特性 | #{} (预编译占位符) |
${} (字符串拼接) |
---|---|---|
底层原理 | 使用 PreparedStatement ,生成带 ? 的 SQL,预编译防止注入。 |
直接拼接字符串到 SQL 中,无参数化处理。 |
SQL 注入风险 | ❌ 安全(自动转义特殊字符)。 | ✔️ 高风险(需手动过滤参数)。 |
适用场景 | 动态条件值(如 WHERE id = #{value} )。 |
动态表名、列名(如 ORDER BY ${column} )。 |
数据类型处理 | 自动识别 Java 类型,匹配 JDBC 类型(如 Date →TIMESTAMP )。 |
原样替换,可能导致语法错误(如字符串未加引号)。 |
性能 | 预编译 SQL 可复用,高效。 | 每次生成新 SQL,效率较低。 |
示例 | xml SELECT * FROM user WHERE name = #{name} |
xml SELECT * FROM ${tableName} |