Pea*_*nut 8 java jdbc resultset
我有一个java.sql.ResultSet我需要更新的对象.但是,结果集不可更新.不幸的是,这是我正在使用的特定框架的约束.
我在这里想要实现的是从数据库中获取数据,然后操纵少量数据,最后将数据写入CSV文件.
在这个阶段,我认为我最好的选择是创建一个新的结果集对象,并将原始结果集的内容复制到新的结果集中,然后像我一样操作数据.
但是,我在谷歌上追求高低,似乎无法确定如何做到这一点,或者它是否甚至可能.
我是Java的新手,所以任何帮助都会感激不尽.
Pea*_*nut 11
谢谢你的回复.最后我发现CachedRowSet这正是我所需要的.有了这个,我能够断开ResultSet对象并更新它.
更重要的是,因为CachedRowSet实现了ResultSet接口我仍然能够将它传递给我的文件生成方法,该方法需要一个实现ResultSet的对象.
Bal*_*usC 10
正常的做法是映射ResultSet到一个List<Entity>地方Entity是你自己的类,它包含关于由一个单一的数据库行表示的数据信息.例如User,Person,Address,Product,Order,等等,这取决于该表实际上包含.
List<Entity> entities = new ArrayList<Entity>();
// ...
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;
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用通常的Java方式访问,遍历和修改它.最后,当将其保留在数据库中时,使用PreparedStatementa一次性批量更新它们.
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();
// ...
Run Code Online (Sandbox Code Playgroud)
请注意,某些数据库的批量大小有限制.Oracle的JDBC驱动程序限制了大约1000个项目.您可能希望executeBatch()每1000个项目调用一次.在循环内使用计数器应该很简单.