2013-04-16 195 views
0

AIM:我想創建和運行SQL查詢相同數量或時間,因爲我有我的數組列表中的值,並將其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(); 

理想我想通過人的陣列中的和作爲循環的一部分的值環插入來自人數組中的值INT他第二SQL則這會從這些查詢結果加到另一個數組AL1 。

我認爲一種解決方案是將al數組數添加到一個int,然後用它來生成我的循環,然後我會通過一個基本增量++的X值在循環中插入值。但是,這似乎有點混亂,我認爲有更好的解決方案,我不知道。

任何建議的幫助表示讚賞。

乾杯。

+0

First s uggestion:使用外鍵閱讀關於關係數據庫和表關係的更多信息,您將節省大量時間,並有一個鍵來連接這些表而不是'name'列。第二個建議:您可以使用單個查詢來使用'JOIN'句子獲取所需的數據。第三個建議:**從不**通過'String'連接傳遞參數,而是使用'PreparedStatement'來防止[SQL Injection](http://en.wikipedia.org/wiki/SQL_injection)攻擊。 –

+0

這就是建議Luiggi。我的SQL不是很好,因此問題是,關於我將如何構建JOIN命令,你有更多的信息嗎? – Rhys

+0

提供的答案顯示了關於這些的一個基本示例和其他建議。 –

回答

0

的第一個建議:瞭解更多關於使用foreign key關係型數據庫和表的關係,您將節省大量的時間有一個鍵加入這些表,而不是name列。

第二個建議:您可以使用單個查詢來使用JOIN句子來獲取所需的數據。

第三項建議:由String串聯從未傳遞參數,而是使用一個PreparedStatement防止SQL Injection攻擊。

第四個建議:如果您檢索List<SomeClass>而不是普通的ArrayList<String>會更好。這是因爲你是programming to interfaces, not to implementation而你的SomeClass可以容納你需要檢索的屬性。使用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的側面此基礎上查詢

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)); 

基本查詢:

搭售所有這些概念,你就會有這樣的事情:

MySQL的句法

//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