复制Java ResultSet
我有一个需要更新的java.sql.ResultSet
对象。 但是,结果集不可更新。 不幸的是,这是我正在使用的特定框架的约束。
我在这里想要实现的是从数据库中获取数据,然后操纵少量数据,最后将数据写入CSV文件。
在这个阶段,我认为我最好的选择是创建一个新的结果集对象,并将原始结果集的内容复制到新的结果集中,并按照我的方式操作数据。
但是,我在谷歌上追求高低,似乎无法确定如何做到这一点,或者它是否甚至可能。
我是Java的新手,所以任何帮助都会感激不尽。
通常的做法是将ResultSet
映射到List
,其中Entity
是您自己的类,其中包含有关由单个数据库行表示的数据的信息。 例如User
, Person
, Address
, Product
, Order
等,具体取决于表格实际包含的内容。
List entities = new ArrayList (); // ... while (resultSet.next()) { Entity entity = new Entity(); entity.setId(resultSet.getLong("id")); entity.setName(resultSet.getString("name")); entity.setValue(resultSet.getInt("value")); // ... entities.add(entity); } // ... return entities;
然后,您可以使用通常的Java方式访问,遍历和修改它。 最后,当将其保留在数据库中时,使用PreparedStatement
一次性批量更新它们。
String sql = "UPDATE entity SET name = ?, value = ? WHERE id = ?"; // ... statement = connection.prepareStatement(sql); for (Entity entity : entities) { statement.setString(1, entity.getName()); statement.setInt(2, entity.getValue()); statement.setLong(3, entity.getId()); // ... statement.addBatch(); } statement.executeBatch(); // ...
请注意,某些DB对批量大小有限制。 Oracle的JDBC驱动程序限制了大约1000个项目。 您可能希望每1000个项目调用executeBatch()
。 使用循环内的计数器应该很简单。
也可以看看:
- collections教程
- PreparedStatement教程
谢谢你的回复。 最后我找到了CachedRowSet
,这正是我所需要的。 有了这个,我能够断开ResultSet
对象并更新它。
更重要的是,因为CachedRowSet
实现了ResultSet
接口,我仍然可以将它传递给我的文件生成方法,该方法需要一个实现ResultSet的对象。