java - 如何在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] 的值没有改变。为什么?
解决方案
貌似逻辑没问题。
首先代码会更好
- 首次使用时的本地声明,否则 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 等。
推荐阅读
- php - 我应该在 laravel 中的哪里存储私有证书文件?
- vue.js - 不能在 nuxt.js 中使用 vue-start-rating?
- c - 指针和结构类型的大小看似不一致的原因是什么?
- latex - 使用带有 \onslide\visible\only 的 Tikz 定位在投影仪内
- java - Microsoft Graph Java SDK - 无法读取共享点上的共享文件
- javascript - 在 Javascript 中重置倒数计时器
- reactjs - 进度条直接到100%
- flutter - Flutter StompClient 报错 初始化器中只能访问静态成员
- reactjs - 更改后未重新渲染反应状态
- javascript - Uppy - 可以顺序上传吗?