powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Работа с информацией из ResultSet
22 сообщений из 22, страница 1 из 1
Работа с информацией из ResultSet
    #34623842
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте всем!

Web-приложение работает с базой DB2. Некоторые JSP показывают данные из таблиц. Для извлечения необходимой информации всегда использовал примерно такую конструкцию:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
...
   T1Rec t1r =  null ;
   ArrayList list =  new  ArrayList();
   Connection connection =  null ;
    try  {
         connection = getConnection();
         PreparedStatement ps = сonnection.prepareStatement("SELECT * FROM TABLE1 WHERE T1_ID=?");
         ps.setInt( 1 ,_id);
         ResultSet rs = ps.executeQuery();
          while  (rs.next()) {
                                 t1r=load(rs);
               		list.add(t1r);
		}
          return  list;
   }  finally  {
	close(connection);
   } 
...
 private   static  T1Rec load(ResultSet rs)  throws  SQLException {
   T1Rec t1r  =  new  T1Rec();
   t1r.id        = rs.getInt("T1_ID");
   t1r.pnsdist = rs.getByte("DIST");
   t1r.insnum  = rs.getInt("INSNUM");
   t1r.cntnum = rs.getByte("CNTNUM");
   t1r.fam      = rs.getString("FAM");
   t1r.nam     = rs.getString("NAM");
   t1r.ptr       = rs.getString("PTR");
   ...
    return  pnr;
}
...
На каждую таблицу у меня создан класс, свойства которого соответствуют полям таблицы, т.е. каждый объект класса по сути представляет одну запись определенной таблицы.

Сейчас нужно вытащить соединенные вместе записи двух связанных таблиц, т.е. показать результат, например, такого запроса:
Код: plaintext
1.
2.
   PreparedStatement ps = сonnection.prepareStatement("SELECT p.*,t.* FROM TABLE1 p, TABLE2 t WHERE p.T1ID=t.T1ID");
   ResultSet rs = ps.executeQuery();
Аналогично первому варианту, в этом случае можно создать класс, который бы объединял в себе поля обеих таблиц, а затем запихивать в них соответствующие значения из ResultSet. Но это как-то неправильно. Если мне далее придется вытаскивать записи из 3 таблиц и более, то не буду же на каждый такой запрос создавать объект!

Нельзя ли как-то проще разобрать ResultSet, чтобы не зависеть от запроса? Есть ли более универсальный способ для работы с запросами и их ответами? Выполнить запрос, получить ответ и показать, например в JSP.

С уважением, Семен Попов
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34623879
angro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а какой-нибудь jsf по условию нельзя использовать?
какой-нибудь taglib uri="http://displaytag.sf.net"
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34623982
Amigo111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно построить модель объектов.Всегда ведь одна таблица зависит от другой и на основании этого построить модель..

что-то вроде этого:
class Table1Class{
Table2Class table2;
}

на эту тему можно почитать Фаулера "Архитектура корпоративных приложений",хотя
по коду может показаться, что вы его читали..по методу load() например...

Ну а 2 вариант вообще отказаться от объектов и просто выводить полученную информацию..
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34624028
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
load метод перепиши с использованием reflection, чтобы получилось что-нибудь типа
Код: plaintext
1.
2.
3.
4.
 public  List load(ResultSet rslt,  Class  listItem){
//выбрать из listItem все set-методы
//выбрать колонку из rslt по имени set-метода и присвоить её соответсвующему полю класса.
}
а дальше вызываешь её для каждой отдельной энтити.
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34624048
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно лучше будет использовать Common DB Utils и поиграться с Handler'ом, отнаследоваться и добавить ваш функционал. А бы так сделал.
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34624079
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
angroа какой-нибудь jsf по условию нельзя использовать?
какой-нибудь taglib uri="http://displaytag.sf.net"
Может и можно. Но пока я не знаю, что это такое. Буду искать.

Я вот подумал. Моя задача скорее сводится к тому, как запихнуть данные ResultSet произвольного запроса в какой-нибудь объект, может ArrayList, чтобы потом спокойно его показать в JSP с помощью обычного цикла. Вот, если бы было возможно подобное:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
   ArrayList list =  new  ArrayList();
         ...
          while  (rs.next()) {
                                 Object [] cols= new  Object[rs.colcount];
                                  for (i= 0 ;i<rs.colcount;i++) cols[i]=rs.getObject(i);
               		list.add(cols);
		}
         ...
, то это было бы более универсально. Мне бы дела не было сколько колонок и сколько строк возвращается, т.е. получаем независимость от запроса. А в JSP вытащить результат из ArrayList уже не составит труда.
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34624100
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Amigo111Можно построить модель объектов.Всегда ведь одна таблица зависит от другой и на основании этого построить модель..
Да. Но опять же получаем зависимость от запроса. Захочется мне издевнуться и вытащить сложный запрос, состоящий из нескольких полей одной таблицы + несколько полей второй + скалярные величины по полям третьей и т.д.- и что, опять создавать объект?
Amigo111Ну а 2 вариант вообще отказаться от объектов и просто выводить полученную информацию..
Вот это может и подойдет. Только как это сделать?
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34624122
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если использовать java.sql.ResultSetMetaData, то всё станет значительно проще
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34624140
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rimanload метод перепиши с использованием reflection, чтобы получилось что-нибудь типа
Понял. Применяем один метод для различных типов объектов. В этом случае результат запроса можно запихнуть в два ArrayList, каждый из который будет представлять отдельную таблицу, а объекты в них будут соотноситься по индексу. Это мысль. Спасибо.
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34624149
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТимоНВозможно лучше будет использовать Common DB Utils и поиграться с Handler'ом, отнаследоваться и добавить ваш функционал. А бы так сделал.
zalexakaесли использовать java.sql.ResultSetMetaData, то всё станет значительно проще
Спасибо. Покопаю.
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34624571
Amigo111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все всего понаписали. Напишу, как это должно выглядеть в моем понимании.

Создаем Класс:
class SelectResponse{
List columns;
List rows;
}


и во время получение ResultSet,получаем из него ResultSetMetaData и вынимаем из него имена колонок и засовываем их в columns.Далее получаем кол-во колонок из ResultSet и запускаем цикл
по заданному кол-ву, что-то вроде и засовываем значения в ArrayList row,который добавляем к rows;

List row = null;
while(rs.next()){
row = new ArrayList();
for(int index = 0;index<columnCount;index++){
row.add(rs.getObject(index);
}
rows.add(row);
}

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

Можно конечно создать отдельные классы для строк и колонок, но это уже по желанию...
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34624579
Amigo111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Впрочем,наверное это вы повыше и предполагали =))
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34624591
Amigo111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати,странно, у вас connection закрывается, а Statement и ResultSet - нет..надо все закрывать
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34624798
ёнах пыш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Amigo111Кстати,странно, у вас connection закрывается, а Statement и ResultSet - нет..надо все закрыватьзачем?
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34624919
Amigo111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Правило такое..почитай JDBC

закрываешь ResultSet,потом Statement,затем Connection,именно в такой последовательности,а иначе
без закрытия 1 и 2 не закроется Коннект..
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34624947
да ну?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Amigo111Правило такое..почитай JDBC

закрываешь ResultSet,потом Statement,затем Connection,именно в такой последовательности,а иначе
без закрытия 1 и 2 не закроется Коннект..

а ты проверял?
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34625214
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Amigo111
Все всего понаписали. Напишу, как это должно выглядеть в моем понимании.

Создаем Класс:
class SelectResponse{
List columns;
List rows;
}
Спасибо. Именно это у меня уже стало проглядываться после того, как zalexaka посоветовал посмотреть java.sql.ResultSetMetaData.
Amigo111Кстати,странно, у вас connection закрывается, а Statement и ResultSet - нет..надо все закрывать
Это я перенял из книги, по которой учусь. Там ни Statement, ни ResultSet не закрываются. Но все же учту ваш совет.
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34625340
Фотография Светлый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Amigo111без закрытия 1 и 2 не закроется Коннект..Серьезно?
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34625746
Amigo111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не натыкался с этим на грабли, но лучше не рисковать. Читал, что коннект может не закрыться..

Посмотрю сегодня вечером эту статейку и точно напишу последствия, а пока ссылка на тему, где
явно представлен код закрытия всего, да и то сначала неправильно =)
Правильно в блоке finally прописать проверку на null
Ссылка : http://]www.sql.ru/forum/actualthread.aspx?tid=243907&pg=-1
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34628400
Amigo111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посмотрел статьи, почитал api и делаю вывод:

1)Не обязательно закрывать Statement и ResultSet перед закрытием Connection, но весьма желательно.
2)При закрытии Statement автоматически закрывается ResultSet, но Statement не закрывается при закрытии Connection.

P.S. На курсах от SoftJoys учили закрывать все!(в качестве подстраховки, мотивируя это тем, что
большую часть кода пишут русские программисты, а они часто полагаются на "авось пронесет") =)
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34628518
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Statement, ResultSet и Connection это все интерфейсы и поэтому нужно смотреть документацию по их реализации, а именно по конкретному JDBC драйверу. Если там ничего не написано, то лучше закрывать все ну или читать официальную доку по JDBC API (не помню чего там по этому поводу пишут) и полагать, что драйвер на 100% соответствует спецификации.
...
Рейтинг: 0 / 0
Работа с информацией из ResultSet
    #34628708
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага ... еще добавить сюда, как реализован пул соединений и что там происходит при вызове connection.close().

Даже в samles WebLogic видел неправильную работу с jdbc, что уж тогда говорить о нас, простых смертных. Чтобы на такие грабли не наступать лучше пользоваться какими-нибудь framewoks, ну или самому инфрастуктуру написать (аля JdbcTemplate).
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Работа с информацией из ResultSet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]