Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Работа с информацией из ResultSet / 22 сообщений из 22, страница 1 из 1
27.06.2007, 16:03:13
    #34623842
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с информацией из ResultSet
Здравствуйте всем!

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

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

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

Ну а 2 вариант вообще отказаться от объектов и просто выводить полученную информацию..
...
Рейтинг: 0 / 0
27.06.2007, 16:43:13
    #34624028
riman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с информацией из ResultSet
load метод перепиши с использованием reflection, чтобы получилось что-нибудь типа
Код: plaintext
1.
2.
3.
4.
 public  List load(ResultSet rslt,  Class  listItem){
//выбрать из listItem все set-методы
//выбрать колонку из rslt по имени set-метода и присвоить её соответсвующему полю класса.
}
а дальше вызываешь её для каждой отдельной энтити.
...
Рейтинг: 0 / 0
27.06.2007, 16:47:46
    #34624048
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с информацией из ResultSet
Возможно лучше будет использовать Common DB Utils и поиграться с Handler'ом, отнаследоваться и добавить ваш функционал. А бы так сделал.
...
Рейтинг: 0 / 0
27.06.2007, 16:54:19
    #34624079
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с информацией из ResultSet
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
27.06.2007, 16:59:49
    #34624100
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с информацией из ResultSet
Amigo111Можно построить модель объектов.Всегда ведь одна таблица зависит от другой и на основании этого построить модель..
Да. Но опять же получаем зависимость от запроса. Захочется мне издевнуться и вытащить сложный запрос, состоящий из нескольких полей одной таблицы + несколько полей второй + скалярные величины по полям третьей и т.д.- и что, опять создавать объект?
Amigo111Ну а 2 вариант вообще отказаться от объектов и просто выводить полученную информацию..
Вот это может и подойдет. Только как это сделать?
...
Рейтинг: 0 / 0
27.06.2007, 17:04:48
    #34624122
zalexaka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с информацией из ResultSet
если использовать java.sql.ResultSetMetaData, то всё станет значительно проще
...
Рейтинг: 0 / 0
27.06.2007, 17:10:21
    #34624140
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с информацией из ResultSet
rimanload метод перепиши с использованием reflection, чтобы получилось что-нибудь типа
Понял. Применяем один метод для различных типов объектов. В этом случае результат запроса можно запихнуть в два ArrayList, каждый из который будет представлять отдельную таблицу, а объекты в них будут соотноситься по индексу. Это мысль. Спасибо.
...
Рейтинг: 0 / 0
27.06.2007, 17:13:49
    #34624149
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с информацией из ResultSet
ТимоНВозможно лучше будет использовать Common DB Utils и поиграться с Handler'ом, отнаследоваться и добавить ваш функционал. А бы так сделал.
zalexakaесли использовать java.sql.ResultSetMetaData, то всё станет значительно проще
Спасибо. Покопаю.
...
Рейтинг: 0 / 0
27.06.2007, 19:55:10
    #34624571
Amigo111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с информацией из ResultSet
Все всего понаписали. Напишу, как это должно выглядеть в моем понимании.

Создаем Класс:
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
27.06.2007, 20:03:16
    #34624579
Amigo111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с информацией из ResultSet
Впрочем,наверное это вы повыше и предполагали =))
...
Рейтинг: 0 / 0
27.06.2007, 20:12:37
    #34624591
Amigo111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с информацией из ResultSet
Кстати,странно, у вас connection закрывается, а Statement и ResultSet - нет..надо все закрывать
...
Рейтинг: 0 / 0
27.06.2007, 22:10:08
    #34624798
ёнах пыш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с информацией из ResultSet
Amigo111Кстати,странно, у вас connection закрывается, а Statement и ResultSet - нет..надо все закрыватьзачем?
...
Рейтинг: 0 / 0
28.06.2007, 00:12:27
    #34624919
Amigo111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с информацией из ResultSet
Правило такое..почитай JDBC

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

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

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

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

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

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

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

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


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