Copying Java ResultSet

后端 未结 2 1194
隐瞒了意图╮
隐瞒了意图╮ 2020-12-10 16:13

I have a java.sql.ResultSet object that I need to update. However the result set is not updatable. Unfortunately this is a constraint on the particular framewor

相关标签:
2条回答
  • 2020-12-10 16:30

    Thanks for the responses. In the end I found CachedRowSet which is exactly what I needed. With this I was able to disconnect the ResultSet object and update it.

    What's more, because CachedRowSet implements the ResultSet interface I was still able to pass it to my file generation method which requires an object that implements ResultSet.

    0 讨论(0)
  • 2020-12-10 16:39

    The normal practice would be to map the ResultSet to a List<Entity> where Entity is your own class which contains information about the data represented by a single database row. E.g. User, Person, Address, Product, Order, etcetera, depending on what the table actually contains.

    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;
    

    Then, you can access, traverse and modify it the usual Java way. Finally, when persisting it back in the DB, use a PreparedStatement to update them in batches in a single go.

    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();
    // ...
    

    Note that some DB's have a limit on the batch size. Oracle's JDBC driver has a limit on around 1000 items. You may want to call executeBatch() every 1000 items then. It should be simple using a counter inside the loop.

    See also:

    • Collections tutorial
    • PreparedStatement tutorial
    0 讨论(0)
提交回复
热议问题