复制Java ResultSet

我有一个需要更新的java.sql.ResultSet对象。 但是,结果集不可更新。 不幸的是,这是我正在使用的特定框架的约束。

我在这里想要实现的是从数据库中获取数据,然后操纵少量数据,最后将数据写入CSV文件。

在这个阶段,我认为我最好的选择是创建一个新的结果集对象,并将原始结果集的内容复制到新的结果集中,并按照我的方式操作数据。

但是,我在谷歌上追求高低,似乎无法确定如何做到这一点,或者它是否甚至可能。

我是Java的新手,所以任何帮助都会感激不尽。

通常的做法是将ResultSet映射到List ,其中Entity是您自己的类,其中包含有关由单个数据库行表示的数据的信息。 例如UserPersonAddressProductOrder等,具体取决于表格实际包含的内容。

 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的对象。