Java 如何循环SQL语句?

Java 如何循环SQL语句?,java,jsp,loops,jdbc,Java,Jsp,Loops,Jdbc,我正在尝试为列表中的每个值运行一个新的SQL命令。我有下面的公式,它只是对我列表中的金额重复相同的值 请注意,我必须通过数组列表中的值数量循环SQL,并将每个值作为名称插入SQL,如下所示 做这件事最好的方法是什么,因为这肯定不是 int listSize = al.size(); for(int i = 0; i < listSize; i++) { ResultSet rs1 = name.executeQuery("SELECT s

我正在尝试为列表中的每个值运行一个新的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);
int listSize=al.size();
对于(inti=0;i
结果:

[70,70,70,70,70,70,70,70,70,70,70]

预期结果:

[70,80,110,60,35,10,15,10,0,25]

请使用

while(rs1.next()){
  System.out.println(rs1.getString(1));
}
问题出在

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);
int listSize=al.size();
对于(inti=0;i
每次创建新的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);
int listSize=al.size();
对于(inti=0;i
像这样设置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);

您可以将for循环替换为while

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
时,都会进行一次远程调用,其中包含所有开销,您对迭代的集合中的每个项都进行了远程调用。如果集合中有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();
}
PreparedStatement PreparedStatement=null;
ResultSet ResultSet=null;
尝试
{
preparedStatement=connection.prepareStatement(“选择项目时间的总和(小时),其中日期=?和名称?”);
编制报表。设置日期(1,日期);
setArray(2,connection.createArrayOf(“VARCHAR”,al.toArray());
resultSet=preparedStatement.executeQuery();
列表小时数=新建ArrayList();
while(resultSet.next())
{
添加(resultSet.getString(1));
}
系统输出打印项次(小时);
}
最后
{
如果(resultSet!=null)resultSet.close();
if(preparedStatement!=null)preparedStatement.close();
}

如果不知道您使用的是什么数据库,很难知道语法是否100%,但您应该了解要点。

当您对列表使用迭代器时,它会给出列表中的第一个元素位置,当调用迭代器.next()时,迭代器将移到嵌套元素位置

`int listSize=al.size()

for(inti=0;i
谢谢,但这不起作用。正如您所看到的,我在SQL中使用了一个迭代器,需要对listSize中的数字重复该迭代器,它控制我的循环。列表中包含名称、值,这些名称和值会经常更改,因此会出现循环,否则我只需要一个简单的SQL语句。使用while循环。您可以在中尝试将子句命名为
name吗(打印列表)
al.listIterator().next()
将始终是同一个元素。您需要将迭代器置于循环之外,然后使用它的方法遍历集合。@NoobUnChained抱歉,请您解释一下您的意思好吗?它将始终为您提供一个新的迭代器实例和迭代器指向的第一个元素,即始终是第一个元素?顺便说一句,代码不是在SQL注入攻击的风险?我听到DB的人提到一个
PreparedStatement
来避免这样的事情。太棒了。正是我想要的。你真的是“代码人”:同样的答案也给了你一张赞成票。为你的帮助干杯。不,我没有…之前的帖子有些不同…这里我试图解决迭代器问题。对我来说,它看起来是一样的。谢谢。我完全同意我应该使用预处理语句来减少负载和安全性,我将更改代码以适应。
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);`