Updating Data in MySQL Using JDBC PreparedStatement

在本教程中,您将学习如何使用 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_nameid字段的占位符。

第三,使用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)

查询结果如下:
mysql jdbc 准备语句示例

通过执行上面的Java程序,您将看到以下输出:

输出准备好的语句程序

如果再次执行SELECT 语句,您将看到更改已应用于候选人表。

mysql jdbc 准备好的语句之后

需要注意的是,您可以将任何语句(例如SELECTINSERTDELETE等)与PreparedStatement接口一起使用。

在本教程中,我们向您展示了如何使用 JDBC PrepareStatement 接口更新 MySQL 中的数据。

本教程有帮助吗?