在本教程中,您将学习如何使用 JDBCPreparedStatement 接口更新 MySQL 数据库中的数据。
PreparedStatement
接口扩展了Statement
接口,提供了一些更高级的功能,如下所示:
- 使用问号 (?) 形式的占位符将参数添加到 SQL 语句中。这可以帮助您避免 SQL 注入。
- 如果您需要使用不同的参数多次执行 SQL 语句,请重用带有新参数的
PreparedStatement
。 - 通过预编译 SQL 语句帮助提高执行语句的性能。
我们将使用PreparedStatement
更新candidates
表中候选人的姓氏。
首先,通过重用我们在上一教程中开发的名为MySQLJDBCUtil
的实用程序类来打开与 MySQL 数据库的连接。
Connection conn = MySQLJDBCUtil.getConnection();
Code language: Java (java)
其次,构造一条SQL UPDATE 语句并通过调用Connection
对象的prepareStatement()
方法创建PreparedStatement
对象。 prepareStatement()
方法接受各种参数。在此示例中,您传入一个字符串,该字符串是 SQL 语句。
String sqlUpdate = "UPDATE candidates "
+ "SET last_name = ? "
+ "WHERE id = ?";
PreparedStatement pstmt = conn.prepareStatement(sqlUpdate);
Code language: Java (java)
请注意,有两个问号 (?) 作为last_name
和id
字段的占位符。
第三,使用PreparedStatement
接口的setYYY()
方法为占位符一一提供值,其中YYY
是占位符的数据类型。例如,您要将 id 为100
的候选人的姓氏更新为William
,您可以按如下方式设置占位符的值:
String lastName = "William";
int id = 100;
pstmt.setString(1, lastName);
pstmt.setInt(2, id);
Code language: Java (java)
第四,通过调用PreparedStatement
接口的executeUpdate()
方法将带有占位符值的UPDATE
语句发送到MySQL。此方法不带参数并返回受影响的行数。
int rowAffected = pstmt.executeUpdate();
Code language: Java (java)
如果您想重用PreparedStatement
,则需要为占位符填充新值并再次调用方法executeUpdate()
。例如,如果您想将 id 为101
的候选人的姓氏更新为Grohe
,您可以按以下步骤操作:
// reuse the prepared statement
lastName = "Grohe";
id = 101;
pstmt.setString(1, lastName);
pstmt.setInt(2, id);
rowAffected = pstmt.executeUpdate();
Code language: Java (java)
与往常一样,您应该通过调用其close()
方法来关闭PreparedStatement
。
pstmt.close()
Code language: Java (java)
如果您使用 try-with-resources 语句,则不必显式执行此操作。下面说明了使用PreparedStatement
更新数据的完整示例。
package org.mysqltutorial;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
*
* @author mysqltutorial.org
*/
public class Main {
/**
* Update candidate demo
*/
public void update() {
String sqlUpdate = "UPDATE candidates "
+ "SET last_name = ? "
+ "WHERE id = ?";
try (Connection conn = MySQLJDBCUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sqlUpdate)) {
// prepare data for update
String lastName = "William";
int id = 100;
pstmt.setString(1, lastName);
pstmt.setInt(2, id);
int rowAffected = pstmt.executeUpdate();
System.out.println(String.format("Row affected %d", rowAffected));
// reuse the prepared statement
lastName = "Grohe";
id = 101;
pstmt.setString(1, lastName);
pstmt.setInt(2, id);
rowAffected = pstmt.executeUpdate();
System.out.println(String.format("Row affected %d", rowAffected));
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
}
/**
* main method
*
* @param args
*/
public static void main(String[] args) {
update();
}
}
Code language: Java (java)
在执行程序之前,我们先检查一下mysqljdbc 数据库中 id 为 100 和 101 的当前候选者:
SELECT * FROM candidates
WHERE id = 100 OR id = 101;
Code language: SQL (Structured Query Language) (sql)
查询结果如下:
通过执行上面的Java程序,您将看到以下输出:
如果再次执行SELECT 语句,您将看到更改已应用于候选人表。
需要注意的是,您可以将任何语句(例如SELECT 、 INSERT 、 DELETE等)与PreparedStatement
接口一起使用。
在本教程中,我们向您展示了如何使用 JDBC PrepareStatement 接口更新 MySQL 中的数据。