Prepared Statement仅检索第一行

时间:2014-08-19 15:22:56

标签: java mysql jdbc

我正在开发一个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循环中输入一次!所以我看到的只是数据库中的第一个元素,但我的数据库中只有一个产品。

为了缩短时间,我省略了打开和关闭连接的方法,因为它们正常工作。

我认为错误非常明显,但我无法真正看到它。

2 个答案:

答案 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是我的猜测。 (原谅我。)