使用可更新的结果集,我们的程序可以从该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依赖
mysql
mysql-connector-java
8.0.17