2013-04-16 5 views
0

AIM: Я пытаюсь создать и запустить SQL запрос, один и тот же номер или время, когда у меня есть значения в моем списке Array, и incoorperate их в SQLСоздание SQL на основе списка массива

Список массива:// Это позволит получить имена всех членов команды и добавить их в список по массиву

ResultSet rs = name.executeQuery("SELECT name from TEAM_MEMBERS"); 
      while (rs.next()) 
       { 
       al.add(rs.getString("name")); 
       } 
      rs.close(); 

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

ResultSet rs1 = name.executeQuery("SELECT sum(hours) FROM PROJECT_TIME WHERE DATE = '"+date+"' AND name = "+al+""); 
      while (rs1.next()) 
       { 
       al1.add(rs1.getString(1)); 
       } 
      rs1.close(); 

В идеале я хотел бы Переберите значения в массиве ал и как часть этого цикла вставить значения из массива Аль ИНТА он второй SQL, который будет затем добавить результат от этих запросов к другим AL1 массиву ,

Я думал, что одно решение будет добавлять счетчик al-массива к int, а затем использовать его для генерации моего цикла, а затем вставлять значения в цикле через значение X с базовым приращением ++ на нем. Однако это кажется немного грязным, и я думаю, что есть лучшее решение, о котором я не знаю.

Любые предложения помощи приветствуются.

Cheers.

+0

Первый uggestion: читайте больше о реляционных базах данных и отношениях в таблице с использованием внешнего ключа, вы сэкономите много времени, имея ключ для объединения этих таблиц вместо столбца «name». Второе предложение: вы можете использовать один запрос для получения желаемых данных с помощью предложений 'JOIN'.Третье предложение: ** никогда не передавать параметры с помощью конкатенации «String», вместо этого используйте «PreparedStatement», чтобы предотвратить атаки [SQL Injection] (http://en.wikipedia.org/wiki/SQL_injection). –

+0

Thats для предложений Луиджи. Мой SQL невелик, следовательно, вопрос, не знаете ли вы, как я буду структурировать команду JOIN? – Rhys

+0

Ответ предоставлен, показывая основной пример об этом и дополнительное предложение. –

ответ

0

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

Второе предложение: вы можете использовать один запрос для получения желаемых данных с использованием предложений JOIN.

Третье предложение: никогда параметры проходят по String конкатенациям, вместо того, чтобы использовать PreparedStatement для предотвращения SQL Injection атак.

Четвертое предложение: было бы лучше, если вы получите List<SomeClass> вместо простого ArrayList<String>. Это потому, что вы programming to interfaces, not to implementation, и ваш SomeClass может содержать атрибуты, необходимые для извлечения.

Связывая все эти понятия, вы будете иметь что-то вроде этого:

MySQL Синтаксис:

CREATE TABLE TEAM_MEMBERS 
(id INT PRIMARY KEY AUTO_INCREMENT, 
name VARCHAR(100) NOT NULL); 

CREATE TABLE PROJECT_TIME 
(id INT PRIMARY KEY AUTO_INCREMENT, 
hours INT NOT NULL, 
date DATE NOT NULL, 
teamMemberId INT NOT NULL, 
FOREIGN KEY (teamMemberId) REFERENCES TEAM_MEMBERS(id)); 

Базовый запрос с использованием JOIN

SELECT tm.name, sum(pt.hours) AS hours -- retrieving both name and sum of hours at the same time 
FROM 
    TEAM_MEMBERS tm --team members table 
    INNER JOIN PROJECT_TIME pt ON pt.teamMemberId = tm.id -- joining team members with project time table (not sure if this really makes sense, but is based on your code example) 
WHERE 
    DATE = <some_date> -- used to show where the parameter will go 
GROUP BY 
    tm.name -- used when using SUM or another AGGREGATE functions 

Используя этот базовый запрос на Java стороне:

//sample about the class 
public class TeamMember { 
    private String name; 
    private int projectHours; 
    //constructor... 
    public TeamMember() { 
    } 
    //constructor sending parameters (because I'm lazy when having a class with few parameters) 
    public TeamMember(String name, int projectHours) { 
     this.name = name; 
     this.projectHours = projectHours; 
    } 
    //getter and setters... 
} 

List<TeamMember> teamMembers = new ArrayList<TeamMember>(); 
Connection con = null; 
PreparedStatement pstmt = null; 
ResultSet rs = null; 
try { 
    con = ... //initialize the connection 
    String query = "SELECT tm.name, sum(pt.hours) AS hours FROM TEAM_MEMBERS tm " + 
     "INNER JOIN PROJECT_TIME pt ON pt.teamMemberId = tm.id " + 
     "WHERE DATE = ? GROUP BY tm.name"; 
    pstmt = con.prepareStatement(query); 
    pstmt.setString(1, date); //assuming you have your date in String format 
    //pstmt.setDate(1, date); //you could use this if your date variable is java.util.Date 
    rs = pstmt.execute(); 
    while(rs.next()) { 
     teamMembers.add(new TeamMember(rs.getString("name"), rs.getInt("hours")); 
    } 
} catch (Exception e) { 
    //handle the Exception 
} finally { 
    //close the resources (this is a MUST DO)... 
    try { 
     if (rs != null) { 
      rs.close(); 
     } 
    } catch (SQLException sqle) {} 
    try { 
     if (pstmt != null) { 
      pstmt.close(); 
     } 
    } catch (SQLException sqle) {} 
    try { 
     if (con != null) { 
      con.close(); 
     } 
    } catch (SQLException sqle) {} 
} 
0

почему вы не используете вид вы можете создать вид из обеих таблиц и выполнить только один запрос

+0

Привет, я не знаком с этим. Как это будет сделано? – Rhys

Смежные вопросы