mySQL嵌套循环不会执行

时间:2011-08-23 20:53:32

标签: java mysql sql web-services nested-loops

我正在开发一个基于SOAP的Web服务,其中一部分我必须使用嵌套循环对数据库执行一些查询,问题是内部循环只是在放弃之前只执行一次。这是代码:

          for(int i=0; i<selec.length; i++){
                for(int j=0; j<sintom.length;j++){
                    var[(i*sintom.length)+j] = "INSERT INTO malattia (nome, eta,  descrizione, sesso, etnia, sintomi) "
                + "VALUES ('" + malattia + "','" + eta + "','" + descrizione + "','" +  sexarra[0] + "','" + selec[i] + "','" + sintom[j] + "')";
        }

      }

这是查询应该执行的地方:

        if (errore.equals("")) {
              try {
                    Statement st = conn.createStatement();
      for(int i=0; i<selec.length; i++){
        for(int j=0;j<sintom.length;j++){

                     st.executeUpdate(var[(i*sintom.length)+j]);}}

无论选择的大小,只要 sintom 的长度为1,大于1并且它不起作用,它就会正常工作。

感谢您的专家建议,我们非常感谢!

2 个答案:

答案 0 :(得分:1)

您的用例是应该使用预准备陈述的情况的完美示例。在the JDBC tutorial中了解有关它们的更多信息。

使用准备好的声明将允许

  • 避免SQL注入攻击。您永远不应该使用字符串连接来构建SQL查询。恶意用户可能会输入一些特殊值,这会完全改变查询的含义。非恶意用户可以输入特殊字符(例如引号),这会使查询失败,因为它在语法上不正确。
  • 让数据库仅针对您正在执行的所有插入查询准备执行计划一次。实际上,查询始终是相同的。只有参数更改。

因此,代码应如下所示:

PreparedStatement ps = conn.prepareStatement("INSERT INTO malattia (nome, eta, ...) values (?, ?, ...)");
for (int i= 0; ...) {
    for (int j = 0; ...) {
        ps.setString(1, malattia);
        ps.setString(2, eta);
        ...
        ps.executeUpdate();
    }
}

答案 1 :(得分:1)

尝试使用PreparedStatement及其Batch功能而不是普通查询来简化代码并防止SQL注入。