首页 > 解决方案 > 如何在java中循环sql语句

问题描述

我正在尝试使用动态 sql 语句创建一个 for 循环:

for(int i = 0; i < size; i++) {         
            ps2 = db.prepareStatement("select * from student where id=?");
            ps2.setInt(1,studList[i]);
            rs2=ps2.executeQuery();
            while(rs2.next()){
                list1.add(new Student(rs2.getInt("id"), rs2.getString("name"), rs2.getString("city"));
            }
            rs2.close();
            ps2.close();
        }

studList[i] 是一个包含所有学生 ID 的数组,变量“size”是这个数组的长度。这段代码的问题是只有一个元素被添加到列表中(对应于第一个学生 ID)。我注意到代码在 'while(rs2.next())' 中,只要 studList[i] 的值没有改变。为什么?

标签: javamysqlsql

解决方案


貌似逻辑没问题。

首先代码会更好

  • 首次使用时的本地声明,否则 ps2、rs2、ps3、rs3 等可能会出现未检测到的拼写错误;
  • 即使在异常/返回时也会关闭的 try-with-resources

所以:

String sql = "select name, city from student where id=?";
try (PreparedStatement ps2 = db.prepareStatement(sql)) {
    for (int i = 0; i < size; i++) {  
        int id = studList[i];
        ps2.setInt(1, id);
        try (ResultSet rs2 = ps2.executeQuery()) {
            System.out.printf("[%d] %d%n", i, id);
            while (rs2.next()) {
                System.out.printf("- %s%n", rs2.getString("name"));
                list1.add(new Student(id, rs2.getString("name"), rs2.getString("city"));
            }
        }
    }
}

所以错误可能发生在之前:数组填充为假,数据库学生表损坏。

一个初学者错误是重用具有新字段值的对象(学生)。然后将相同的对象添加到列表中将使最后一个学生的数据复制多次。

这里可能是在原始代码中,代码被称为重用 ps2 等。


推荐阅读