使用可更新的结果集,我们的程序可以从该ResultSet对象更新数据库中的记录。对ResultSet对象的操作可以更新,插入或删除。通过这种机制,我们可以在不执行sql命令的情况下更新数据库。
在下面的例子中,我们有一个products用表id,code,name,和price。加载结果集后的第一步,更新第一条记录的产品名称。然后,我们移至下一条记录并将其删除。最后,我们将新记录插入数据库。
package org.nhooo.example.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class UpdatableResultSetDemo { private static final String URL = "jdbc:mysql://localhost/nhooo"; private static final String USERNAME = "root"; private static final String PASSWORD = ""; public static void main(String[] args) { try (Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD)) { //创建一个可更新的结果集。这意味着 // 使用单独的sql命令来更新数据,我们可以 // 直接在结果集对象中更新它。 // // 使其可更新的原因是,当创建 // 声明我们要求连接对象创建声明 //与CONCUR_UPDATABLE。可更新不需要 // TYPE_SCROLL_SENSITIVE,但将此参数添加到 // 声明使我们能够来回更新数据。 Statement statement = connection.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); String query = "SELECT id, code, name, price FROM products"; ResultSet rs = statement.executeQuery(query); System.out.println("id\tcode\tname\tprice"); while (rs.next()) { System.out.println(rs.getLong("id") + "\t" + rs.getString("code") + "\t" + rs.getString("name") + "\t" + rs.getDouble("price")); } //移至第一行并更新结果集数据。后 // 我们更新行值,我们将updateRow()方法调用为 // 更新数据库中的数据。 rs.first(); rs.updateString("name", "UML Distilled 3rd Edition"); rs.updateRow(); // 移至下一个结果集行,然后删除 // 结果集并将其应用于数据库。 rs.next(); rs.deleteRow(); // 使用以下命令在结果集对象中插入新行: //moveToInsertRow()方法。提供信息为 // 插入,最后调用insertRow()方法插入 // 记录到数据库。 rs.moveToInsertRow(); rs.updateString("code", "P0000010"); rs.updateString("name", "Data Structures, Algorithms"); rs.updateDouble("price", 50.99); rs.insertRow(); rs.beforeFirst(); System.out.println(); System.out.println("id\tcode\tname\tprice"); while (rs.next()) { System.out.println(rs.getLong("id") + "\t" + rs.getString("code") + "\t" + rs.getString("name") + "\t" + rs.getDouble("price")); } } catch (SQLException e) { e.printStackTrace(); } } }
该代码段打印出以下输出:
id code name price 1 P0000001 Java 2 Notebook 25.0 2 P0000002 Java Servlet Programming 30.0 3 P0000003 PHP Programming 20.0 4 P0000004 Longman Active Study Dictionary 40.0 5 P0000005 Ruby on Rails 24.0 6 P0000006 Championship Manager 0.0 7 P0000007 Transport Tycoon Deluxe 0.0 8 P0000008 Roller Coaster Tycoon 3 0.0 9 P0000009 Pro Evolution Soccer 0.0 id code name price 1 P0000001 UML Distilled 3rd Edition 25.0 3 P0000003 PHP Programming 20.0 4 P0000004 Longman Active Study Dictionary 40.0 5 P0000005 Ruby on Rails 24.0 6 P0000006 Championship Manager 0.0 7 P0000007 Transport Tycoon Deluxe 0.0 8 P0000008 Roller Coaster Tycoon 3 0.0 9 P0000009 Pro Evolution Soccer 0.0 10 P0000010 Data Structures, Algorithms 50.99
Maven依赖
<!-- https://search.maven.org/remotecontent?filepath=mysql/mysql-connector-java/8.0.17/mysql-connector-java-8.0.17.jar --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.17</version> </dependency>