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

