Sql中占位符?和#
时间: 2025-06-18 15:31:44 浏览: 11
### SQL 占位符 `?` 和 `#` 的用法及区别
在SQL语句中,占位符是一种用于动态传递参数的机制。这种机制不仅提高了代码的可读性和可维护性,还能够有效防止SQL注入攻击。以下是关于占位符 `?` 和 `#` 的详细说明及其区别。
#### 1. 占位符 `?` 的用法
占位符 `?` 是一种通用的参数占位符,通常与预处理语句(PreparedStatement)结合使用。它允许开发者在SQL语句中预留位置,随后通过编程语言(如Java、C#等)将实际值绑定到这些位置[^2]。例如:
```sql
SELECT * FROM users WHERE username = ? AND password = ?;
```
在此语句中,`?` 表示需要动态填充的参数。在执行时,可以通过编程语言提供的API将具体值绑定到这些占位符上。这种方法的优点包括:
- 防止SQL注入攻击。
- 提高查询性能,因为数据库可以缓存预处理语句的执行计划[^3]。
#### 2. 占位符 `#` 的用法
占位符 `#` 并不是SQL标准的一部分,而是一些特定工具或框架(如MyBatis)中使用的特殊语法。在MyBatis中,`#{}` 用于表示参数占位符,并支持类型转换和安全性增强。例如:
```sql
SELECT * FROM users WHERE username = #{username} AND password = #{password};
```
在此语句中,`#{}` 表示一个命名参数,MyBatis会自动将其替换为实际值,并确保值被正确转义以防止SQL注入。
#### 3. 占位符 `?` 和 `#` 的区别
以下是两种占位符的主要区别:
| 特性 | 占位符 `?` | 占位符 `#` (MyBatis) |
|-------------------------|-------------------------------------|------------------------------------|
| **适用范围** | 标准SQL,适用于大多数数据库 | MyBatis框架中的特定语法 |
| **参数绑定方式** | 通过索引位置绑定 | 通过命名参数绑定 |
| **安全性** | 防止SQL注入 | 防止SQL注入,支持类型转换 |
| **灵活性** | 简单直接,适合小型项目 | 支持复杂映射,适合大型项目 |
| **示例** | `WHERE id = ?` | `WHERE id = #{id}` |
#### 示例代码
以下是一个使用占位符 `?` 和 `#` 的对比示例:
##### 使用 `?` 的示例(Java + PreparedStatement)
```java
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
try (PreparedStatement pstmt = connection.prepareStatement(sql)) {
pstmt.setString(1, "john");
pstmt.setString(2, "secret");
ResultSet rs = pstmt.executeQuery();
// 处理结果集
}
```
##### 使用 `#` 的示例(MyBatis)
```xml
<select id="selectUser" parameterType="map" resultType="User">
SELECT * FROM users WHERE username = #{username} AND password = #{password}
</select>
```
在上述示例中,`#{}` 允许直接引用传入的参数名称,而无需关心其在SQL语句中的位置。
---
阅读全文
相关推荐


















