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