mybatis#和$
时间: 2025-08-23 19:57:53 AIGC 浏览: 19
在 MyBatis 中,`#{}` 和 `${}` 是两种用于处理参数的语法,它们的主要区别在于 SQL 注入安全性、参数处理方式以及使用场景。
- `#{}` 是预编译占位符,MyBatis 会将其视为 JDBC `PreparedStatement` 中的参数标记。使用 `#{}` 时,MyBatis 会自动对参数进行类型处理和安全转义,从而有效防止 SQL 注入问题。这种写法适用于大多数参数传递场景,尤其是在需要将用户输入作为查询条件时[^1]。
```sql
SELECT * FROM users WHERE username = #{username};
```
上述语句中,`#{username}` 会被替换为 `?`,然后通过 `PreparedStatement` 设置参数值。
- `${}` 是字符串替换占位符,MyBatis 会将其直接替换为参数值,不做任何转义或预编译处理。这种方式适用于需要动态拼接 SQL 片段的场景,例如动态表名、列名等。但正因为不做处理,`${}` 存在 SQL 注入风险,使用时需格外谨慎。
```sql
SELECT * FROM ${tableName} WHERE id = #{id};
```
在该语句中,`${tableName}` 会被直接替换为传入的表名字符串,而 `#{id}` 则仍作为安全参数处理。
### 使用建议
- 优先使用 `#{}` 来处理参数,以确保 SQL 安全性。
- 只有在确实需要拼接 SQL 片段(如动态表名)时,才使用 `${}`,并且应确保传入的值是可信的或经过严格校验。
### 示例对比
使用 `#{}` 的 SQL 语句:
```sql
SELECT * FROM users WHERE id = #{id};
```
如果 `id = 123`,最终生成的 SQL 是:
```sql
SELECT * FROM users WHERE id = ?;
-- 参数绑定:123
```
使用 `${}` 的 SQL 语句:
```sql
SELECT * FROM ${tableName} WHERE id = #{id};
```
如果 `tableName = "users"`,`id = 123`,最终生成的 SQL 是:
```sql
SELECT * FROM users WHERE id = ?;
-- 参数绑定:123
```
### 总结
`#{}` 和 `${}` 的核心区别在于是否进行预编译处理。`#{}` 提供了更高的安全性和更稳定的参数处理机制,而 `${}` 则提供了更灵活但风险更高的字符串替换功能。
---
阅读全文
相关推荐















