Java 基于数组列表创建SQL

Java 基于数组列表创建SQL,java,mysql,sql,jdbc,Java,Mysql,Sql,Jdbc,目标:我正在尝试创建和运行一个sql查询,其数量或时间与数组列表中的值相同,并将它们合并到sql中 Array List://这将获取所有团队成员的姓名并将其添加到 数组列表 为团队的每个成员运行的SQL。请注意,团队成员将发生变化,因此这不能是静态的 ResultSet rs1 = name.executeQuery("SELECT sum(hours) FROM PROJECT_TIME WHERE DATE = '"+date+"' AND name = "+al+"");

目标:我正在尝试创建和运行一个sql查询,其数量或时间与数组列表中的值相同,并将它们合并到sql中

Array List://这将获取所有团队成员的姓名并将其添加到 数组列表

为团队的每个成员运行的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();
理想情况下,我希望循环al数组中的值,并作为循环的一部分,在第二个sql中插入al数组中的值,然后将这些查询的结果添加到另一个数组al1

我认为一种解决方案是将al数组计数添加到一个int中,然后使用它来生成我的循环,然后通过一个X值在循环中插入值,该值上有一个基本的增量+。然而,这似乎有点混乱,我认为有更好的解决办法,我不知道

如有任何帮助建议,我们将不胜感激

干杯。

为什么不使用view
您可以从两个表中创建视图,并且只执行一个查询。第一个建议:阅读有关关系数据库和表关系的更多信息使用,使用键连接这些表而不是名称列将节省大量时间

第二个建议:您可以使用单个查询,通过句子获得所需的数据

第三个建议:永远不要通过字符串连接来传递参数,而是使用字符串连接来防止攻击

第四个建议:最好检索列表而不是普通的ArrayList。这是因为您的SomeClass可以保存需要检索的属性

将所有这些概念结合在一起,您将得到如下结果:

MySQL语法:

创建表格团队成员 id INT主键自动递增, 名称VARCHAR100不为空; 创建表项目\u时间 id INT主键自动递增, 小时整数不为空, 日期不为空, teamMemberId INT不为空, 外键teamMemberId引用团队成员SID; 使用联接的基查询

选择tm.name,sumpt.hours作为小时-同时检索名称和小时总数 从…起 团队成员tm-团队成员表 内部加入项目时间pt ON pt.teamMemberId=tm.id-将团队成员加入项目时间表不确定这是否真的有意义,但基于您的代码示例 哪里 DATE=-用于显示参数的位置 分组 tm.name-在使用SUM或其他聚合函数时使用 在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) {}
}

第一个建议:阅读有关关系数据库和使用外键的表关系的更多信息,使用键连接这些表而不是名称列将节省大量时间。第二个建议:您可以使用一个查询,通过连接语句获得所需的数据。第三个建议:永远不要通过字符串连接传递参数,而是使用PreparedStatement来防止攻击。这就是Luiggi的建议。我的SQL不是很好,因此有一个问题,您是否有关于如何构造JOIN命令的更多信息?提供的答案显示了有关这些的基本示例和其他建议。
//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) {}
}