[英]How to loop SQL statements?
我正在尝试为列表中的每个值运行一个新的SQL命令。 我有下面的内容,只是在我的列表中一次又一次地重复相同的值。
请注意,我必须通过数组列表中的值循环SQL,并在SQL中插入每个值作为名称,如下所示。
这样做的最佳方式是什么,因为这绝对不是。
int listSize = al.size();
for(int i = 0; i < listSize; i++) {
ResultSet rs1 = name.executeQuery("SELECT sum(hours) FROM PROJECT_TIME WHERE DATE = '"+date+"' AND name = '"+al.listIterator().next()+"'");
al1.add(rs1.getString(1));
rs1.close();
}
System.out.println(al1);
结果:
[70,70,70,70,70,70,70,70,70,70]
预期结果:
[70,80,110,60,35,10,15,10,0,25]
问题在于
al.listIterator().next()
它始终返回相同的值。 因此查询返回相同的结果集字符串,这就是您的结果始终为70
的原因。
请尝试使用此代码:
int listSize = al.size();
for(int i = 0; i < listSize; i++) {
ResultSet rs1 = name.executeQuery("SELECT sum(hours) FROM PROJECT_TIME WHERE DATE = '"+date+"' AND name = '"+al.get(i)+"'");
while(rs1.next()){
al1.add(rs1.getString(1));
}
rs1.close();
}
System.out.println(al1);
每次创建新的Itrator时,每次都返回相同的值。 试试下面的代码
int listSize = al.size();
for(int i = 0; i < listSize; i++) {
ResultSet rs1 = name.executeQuery("SELECT sum(hours) FROM PROJECT_TIME WHERE DATE = '"+date+"' AND name = '"+al.get(i)+"'");
al1.add(rs1.getString(1));
rs1.close();
}
System.out.println(al1);
请用
while(rs1.next()){
System.out.println(rs1.getString(1));
}
像这样设置for循环以使用列表中的每个条目:
for(String name : al) {
ResultSet rs1 = name.executeQuery("SELECT sum(hours) FROM PROJECT_TIME WHERE DATE = '"+date+"' AND name = '"+name+"'");
al1.add(rs1.getString(1));
rs1.close();
}
System.out.println(al1);
你可以用while替换for循环
Interator i = al.listIterator();
while(i.hasNext()){
String name = i.next();
ResultSet rs1 = name.executeQuery("SELECT sum(hours) FROM PROJECT_TIME WHERE DATE ="+date+"' AND name = '"+name+"'");
while(rs1.next()){
System.out.println(rs1.getString(1));
}
}
简单的答案是你需要做al.get(i)
并在从结果集中读取之前调用rs1.next()
。 在尝试从结果集中读取之前,您还应检查调用rs1.next()
返回true
。
但这忽略了这样一个事实,即在一个循环中执行查询很糟糕 - 性能会非常糟糕,而且你正在锤击数据库。 每次调用name.executeQuery
时, name.executeQuery
一次远程调用,其中包含所有需要的开销,并且您正在为正在迭代的集合中的每个项目执行此操作。 如果集合中有1000个项目,那就是1000个远程调用。 此外,使用字符串连接来构建查询意味着数据库必须在每次执行查询时计算查询计划。
要正确执行此操作,您应该使用预准备语句执行单个查询,然后迭代结果集 - 1个远程调用 - 类似于:
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try
{
preparedStatement = connection.prepareStatement("SELECT sum(hours) FROM project_time WHERE date = ? AND name IN ?");
preparedStatement.setDate(1, date);
preparedStatement.setArray(2, connection.createArrayOf("VARCHAR", al.toArray());
resultSet = preparedStatement.executeQuery();
List<String> hours = new ArrayList<String>();
while (resultSet.next())
{
hours.add(resultSet.getString(1));
}
System.out.println(hours);
}
finally
{
if (resultSet != null) resultSet.close();
if (preparedStatement != null) preparedStatement.close();
}
在不知道你正在使用什么数据库的情况下,很难知道语法是否是100%,但你应该得到要点。
当您为List使用迭代器时,它会为您提供列表中的第一个元素位置,并且当调用Iterator.next()时,Iterator将移动到嵌套元素位置。
`int listSize = al.size();
for(int i = 0; i < listSize; i++) {
ResultSet rs1 = name.executeQuery("SELECT sum(hours) FROM PROJECT_TIME WHERE DATE = '"+date+"' AND name = '"+al.get(i)+"'");
al1.add(rs1.getString(1));
rs1.close();
}
System.out.println(al1);`
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.