使用JDBC PreparedStatement更新MySQL中的数据

时间:2019-11-20 08:52:36  来源:igfitidea点击:

在本教程中,您将学习如何使用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中更新数据。