2016-04-15 2 views
1

У меня есть приложение, которое получает данные из базы данных и создает excel. Я хотел разделить dao класс, который получает resultSet из db и класс, который создает excel с этим набором результатов.Выполнение ResultSet с другим методом

Таким образом, я передавал ResultSet из Dao в другой класс, чтобы создать файл excel. Но когда я запускаю rs.next(), он дает мне ошибку «Закрытый результат: следующий». Я читал в Интернете, что передача ResultSet не является хорошей идеей, поэтому я просто стараюсь сделать это в классе dao, и это сработало.

Но таким образом я не люблю выполнять другую задачу (создание excel) в классе dao, и я не хочу создавать класс, а затем отправлять их в виде списка. Поэтому мой вопрос в том, почему плохо передавать результаты в другой класс или функцию? Почему я получил исключение, когда передаю его и пытаюсь вызвать rs.next()?

Суммировать мой код выглядит как эти:

ResultSet rs = myDao.getResult(); 
ExcelCreator excelCreator = new ExcelCreator(); 
excelCreator.createExcel(rs); 
+0

проверьте, закрывается ли в вашем классе DAO соединение закрытия, так как закрытие соединения также может привести к закрытию ResultSet –

ответ

1

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

1

Почему вы получаете "Закрыто: ResultSet следующая" ошибка, смотрите здесь:

Why am I getting ResultSet is closed error when I never closed any

Я полагаю, вы не используете какой-то ORM рамки, как Hibernate.

В этом случае сопоставьте данные набора результатов в DAO или создайте объект mapper самостоятельно, который отображает ResultSet в некоторый объект передачи данных. Затем передайте этот объект методу createExcel().

Что-то вроде этого:

ResultSet rs = myDao.getResult(); 
List<ExcelDto> excelDtos = new ArrayList<>(); 
ExcelDto excelDto; 
while (rs.next()) {  
    excelDto = new ExcelDto();  
    dto.setXCol(rs.getString("XColumn")) 
    excelDtos.add(dto); 
} 
excelCreator.createExcel(excelDtos); 

Тогда в excelCreator вы можете работать с ArrayList вместо ResultSet.