我正在开发一个Web应用程序,用户可以在其中插入许多产品"。这些产品将插入MySQL数据库中。当我尝试从数据库的表中检索数据时遇到问题。这是我的方法:
public ArrayList<Product> getProductByAppId(int appId) {
ArrayList<Product> list = new ArrayList<Product>();
String query = "select prodId from app_prod where appId = ?";
try {
preparedStatement = connection.prepareStatement(query);
preparedStatement.setInt(1, appId);
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
Product item = getProductById(resultSet.getInt("prodId"));
list.add(item);
}
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
此方法只是获取一个int作为参数,并从表app_prod
中检索我存储的所有对象。方法getProductById
它是一个帮助方法,它可以正常工作。当我尝试调试我的代码时,我发现我只在while循环中输入一次!所以我看到的只是数据库中的第一个元素,但我的数据库中只有一个产品。
为了缩短时间,我省略了打开和关闭连接的方法,因为它们正常工作。
我认为错误非常明显,但我无法真正看到它。
答案 0 :(得分:1)
确定问题如下:
resultSet
被声明为全局变量,两种方法都在使用它们
当第二种方法改变其内容并通过以下方式完成:
resultSet.next();
到达终点:
主外循环尝试执行resultSet.next()
,它直接从循环退出,因为它已经预先在getProductById
方法中到达其结尾。
答案 1 :(得分:0)
List<Product> list = new ArrayList<>();
try (PreparedStatement preparedStatement = connection.prepareStatement(query)) {
preparedStatement.setInt(1, appId);
try (resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
Product item = getProductById(resultSet.getInt("prodId"));
list.add(item);
}
return list;
}
} catch (Exception e) {
e.printStackTrace();
}
try-with-resources确保语句和结果集关闭(即使返回)。
现在变量也是本地变量。并且 可能是问题所在:也许您在getProductById
中重用了那些全局字段。 resultSet
是我的猜测。 (原谅我。)