使用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中更新数据。

