Копирование Набора Результатов Java

У меня есть java.sql.ResultSet объект, который мне нужно обновить. Однако результирующий набор не обновляется. К сожалению, это ограничение на конкретную структуру, которую я использую.

то, что я пытаюсь достичь здесь, это принимать данные из базы данных, а затем манипулировать небольшим количеством данных и, наконец, данные записываются в файл CSV.

на этом этапе я думаю, что мой лучший вариант-создать новый объект результирующего набора и скопировать содержимое исходного результирующего набора в новый, манипулирующий данными.

однако я охотился повсюду в Google и, похоже, не могу определить, как это сделать или возможно ли это вообще.

Я новичок во всем Java, поэтому любая помощь будет с благодарностью принята.

2 ответов


обычной практикой было бы сопоставить 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;

затем вы можете получить доступ, пройти и изменить его обычным способом 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();
// ...

обратите внимание, что некоторые СУБД имеют ограничение на размер пакета. Драйвер JDBC Oracle имеет ограничение примерно на 1000 элементов. Вы можете позвонить executeBatch() каждые 1000 пунктов то. Это должно быть просто, используя счетчик внутри цикла.

Читайте также:


Спасибо за ответы. В конце концов я нашел CachedRowSet Это именно то, что мне нужно. С помощью этого я смог отключить ResultSet объект и обновите его.

более того, потому что CachedRowSet осуществляет ResultSet интерфейс я все еще мог передать его в мой метод генерации файлов, который требует объекта, реализующего ResultSet.