Java 基于数组列表创建SQL
目标:我正在尝试创建和运行一个sql查询,其数量或时间与数组列表中的值相同,并将它们合并到sql中 Array List://这将获取所有团队成员的姓名并将其添加到 数组列表 为团队的每个成员运行的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+"");
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) {}
}