最初の提案: リレーショナル データベースと外部キーを使用したテーブル リレーションの詳細をお読みください。列の代わりにこれらのテーブルを結合するためのキーがあれば、多くの時間を節約できname
ます。
2 番目の提案: 単一のクエリを使用して、JOIN
文を使用して目的のデータを取得できます。
3 番目の提案:連結によってパラメーターを渡さないでください。代わりに a を使用して、 SQL インジェクション攻撃を防ぎます。String
PreparedStatement
List<SomeClass>
4 番目の提案:プレーンではなく取得した方がよいでしょうArrayList<String>
。これは、実装ではなくインターフェースに対してプログラミングしていて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) {}
}