Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по JDBC 
:(
    Опции темы
slolennnn
Дата 22.8.2006, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.6.2006

Репутация: нет
Всего: нет



Подскажите плиз как правильно делать такую обычную вещь.
Надо выбрать данные из таблицы например Users и таблицы Jobs,
которые соединены между собой many-to-many через таблицу
User_Job.
Ну вот делаю запрос
Код



  String query = "SELECT user_id, user_name FROM Users;";
  Connection con = getConnection(url, login, password);
  Statement  st = con.createStatement();
  ResultSet rs = st.executeQuery(query);
  while (rs.next())
  {
    int user_id = rs.getInt(1);
    String name = rs.getString(2);
    //И тут мне надо выбрать по user_id все записи из таблицы User_Job и Jobs!
    //То есть так примерно?
    List jobs = getJobsByUserId(Connection con,int userId);
     //Кстати - а можно передавать List jobs = getJobsByUserId(!!!!Statement  st ,int userId) ?
    
  }
    rs.close();st.close();  con.close()
//И сам метод 
  private List getJobsByUserId(Connection con,int userId)
  { 
      PreparedStatement prepSt= con.prepareStatement(
    "SELECT j.job_name FROM Jobs j, User_Job  uj 
                      WHERE uj.job_id = j.job_id AND   uj.user_id = ?";
      prepSt.setInt(1,userId);
      ResultSet rs = prepSt.executeQuery();
      while(rs.next())
     { 
        create List from ResultSet
     }
     return created List
   }



Получается очень громоздко!
Может есть более элегантный способ именно при помощи чистого JDBC?
PM MAIL   Вверх
LSD
Дата 22.8.2006, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(slolennnn @  22.8.2006,  15:15 Найти цитируемый пост)
Может есть более элегантный способ именно при помощи чистого JDBC?

А может при помощи чистого SQL?
Код
select u.user_id, u.user_name, j.job_name from users u
  left join user_jobs uj on uj.user_id = u.user_id
  left join jobs j on j.job_id = uj.job_id



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
slolennnn
Дата 22.8.2006, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.6.2006

Репутация: нет
Всего: нет



Цитата

А может при помощи чистого SQL?
Выделить всёкод SQL
 select u.user_id, u.user_name, j.job_name from users u
      left join user_jobs uj on uj.user_id = u.user_id
      left join jobs j on j.job_id = uj.job_id

Ну а как потом выбрать эти данные из ResultSet
Код

  while(resultSet.next()
  {
      int id = resultSet.getInt(1);
      String userName = resultSet.getString(2);
      String  jobName = resultSet.getString(3);
  }

И получиться что из базы приходит десять кортежей типа
 1- Иванов - Программист
 1 - Иванов - Администратор
 1-  Иванов - Культурист
А мне в прнципе это надо чтоб прочитать 1- Иванов,  сделать User user = new User(1, "Иванов"):
 потом по 1  прочитать  и сделать List  listOfJobs.add("Программист","Администратор","Культурист"); 
и наконец  user.setJobs(listOfJobs).

PM MAIL   Вверх
Bulat
Дата 22.8.2006, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 4
Всего: 57



Вообще LSD прав это надо делать через сам запрос, который кстати можно записать и немного иначе, но я не знаю детально архитектуру твоей БД


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
LSD
Дата 22.8.2006, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Тогда никак, кроме как руками. 
JDBC не предоставляет никакой функциональности сверх того, что может обеспечить сервер СУБД.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Bulat
Дата 22.8.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 4
Всего: 57



slolennnn, подумай над запросом, я не совсем понял, что тебе и как надо, но если уметь правильно строить запросы, то можно очень легко уменьшать громоздкость кода  smile 


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Skipy
Дата 24.8.2006, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 6
Всего: 16



Просто в JDBC такого, похоже не сделать. А почему бы не воспользоваться Hibernate, который умеет и это, и еще два миллиона вещей впридачу?


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
Bulat
Дата 24.8.2006, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 4
Всего: 57



Skipy, вообще и в JDBC это не сложно делается:

Даже если пришло:
1- Иванов - Программист
1 - Иванов - Администратор
1-  Иванов - Культурист

кидаем 1 в int id_buf, и пока он совпадает со следующим, rs.getInt("id"), в цикле в String job =+ rs.getString("jobs"), можно еще и фамилию подцепить к проверке, а когда приходит следующий id то итоговый job в наш List. Тут полно вещей для творчества, надо только маленько подумать и ничего сложного, ни один код не будет делать все за программиста или пользователя и так уже много делает  smile 


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
COVD2
Дата 25.8.2006, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 10.6.2006

Репутация: 1
Всего: 1



"А почему бы не воспользоваться Hibernate.."

- неужели SQL сложнее?
PM MAIL   Вверх
Bulat
Дата 25.8.2006, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 4
Всего: 57



COVD2, есть такие задачи, которые более связаны с языком нежели с запросом, и поэтому все через SQL не устроишь 


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0642 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.