JDBC中的PreparedStatement是一种用于执行预编译SQL语句的接口。相比于Statement接口,使用PreparedStatement可以提高数据库的性能和安全性。下面详细介绍PreparedStatement的使用。
1. 创建PreparedStatement对象:
连接数据库后,可以使用Connection对象的prepareStatement()方法创建PreparedStatement对象。该方法接受一个包含SQL语句的字符串作为参数。
```java
Connection conn = DriverManager.getConnection(url, username, password);
String sql = "SELECT * FROM users WHERE id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
```
2. 设置参数:
PreparedStatement对象提供了一系列的setXXX()方法,用于设置SQL语句中的参数。这些方法的参数包括参数索引(从1开始计数)和参数值。
```java
int userId = 1;
pstmt.setInt(1, userId);
```
注意:PreparedStatement对象的参数索引从1开始计数。
3. 执行查询:
使用PreparedStatement对象的executeQuery()方法执行查询语句,并返回一个ResultSet对象。
```java
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
// 处理结果集
}
```
4. 执行更新:
使用PreparedStatement对象的executeUpdate()方法执行更新语句(如INSERT、UPDATE和DELETE),并返回受影响的行数。
```java
int rowsAffected = pstmt.executeUpdate();
```
5. 批量更新:
PreparedStatement对象还提供了addBatch()方法和executeBatch()方法,用于执行批量更新操作。addBatch()方法将SQL语句添加到批处理中,executeBatch()方法执行批处理操作。
```java
pstmt.addBatch();
pstmt.executeBatch();
```
注意:在执行executeBatch()方法之前,必须调用pstmt.clearBatch()方法清空批处理。
6. 关闭资源:
在使用完PreparedStatement对象后,需要关闭与之相关的资源,包括ResultSet和PreparedStatement对象。关闭资源可以使用close()方法。
```java
rs.close();
pstmt.close();
conn.close();
```
注意:关闭资源的顺序应该是ResultSet、PreparedStatement和Connection。
使用PreparedStatement可以有效地防止SQL注入攻击,并且可以提高数据库的性能,因为数据库可以对预编译的SQL语句进行缓存和优化。