当前位置: 首页 > 知识库问答 >
问题:

使用Java[duplicate]在循环中关闭结果集

凌联
2023-03-14

这个问题应该很简单,而且可能会让人恼火,但我仍然对使用Java关闭结果集感到怀疑。每个语句都应该这样做,或者结果集应该只在final中关闭?

       try {
        Class.forName(<driver class>);                
        con = DriverManager.getConnection(
            "IP", 
            "username",
            "password");
        for(String dealId : items) {
            String sql= "SQL Query";
            preparedStatement = con.prepareStatement(sql);
            rs = preparedStatement.executeQuery();
            while(rs.next()) {
                count += rs.getInt("total");                    
            }
            // Result should be closed here as the statement got executed?
        }
        System.out.println(count);
        if(items.size() == count) {
            dealsBelongToTheParty = true;
        }

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        rs.close(); // Or this is right?
        preparedStatement.close();
        if(!con.isClosed())
            con.close();
    }

共有2个答案

扈运浩
2023-03-14

https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html

"当生成ResultSet对象的语句对象被关闭、重新执行或用于从多个结果序列中检索下一个结果时,ResultSet对象会自动关闭。"

因此,您不必担心关闭ResultSet。

宋高谊
2023-03-14

我建议使用Java 7 try with resources(下面的代码假设查询中使用了循环vardealId)

Class.forName(<driver class>);                
try (Connection con = DriverManager.getConnection(
        "IP", "username", "password")) {
    for(String dealId : items) {
        String sql= "SQL Query with " + dealId;
        // resources are opened by order 
        try (PreparedStatement preparedStatement = con.prepareStatement(sql);
             ResultSet rs = preparedStatement.executeQuery()) {
            while(rs.next()) {
                count += rs.getInt("total");                    
            }
        } // resources are implicitly closed in reverse order of open
    }
} catch (Exception e) {
    e.printStackTrace();
}

System.out.println(count);
if(items.size() == count) {
    dealsBelongToTheParty = true;
}

 类似资料:
  • 问题内容: 我正在尝试在MySQL中编写一个存储过程,该存储过程将执行一个稍微简单的选择查询,然后循环遍历结果,以便决定是执行其他查询,数据转换还是完全丢弃数据。有效地,我想实现这一点: 只有,我只希望在MySQL中使用它,因此可以将其称为过程。我知道对于触发器来说,有语法,但是找不到在语法之外使用的类似内容。我已经阅读了MySQL中的一些循环机制,但到目前为止,我所能想象的就是我将实现以下内容:

  • 你好,有人能帮我在java中使用我的当循环代码吗?我似乎在这里找不到解决方案,我希望有人能推荐或找到一个解决方案,我如何才能创建像(1, -2, 3, -4, 5, -6)这样的正确输出。谢谢!

  • 我想用函数循环我的代码,但我不知道怎么做。我想循环直到用户说停止。我的输出也有问题,当调用函数。我对C++还是个新手。感谢任何帮助! 我计划我的输出是这样的:欢迎来到和谐礼品店-(用户名) 您已购买:(说明1)类别:(说明2)您应支付:(总价) 代码:

  • 你好,有人能解释一下为什么这会形成一个无限循环吗?谢谢!

  • 在下面的代码: 在上面的代码中,我从用户那里得到一个表名列表,然后在for循环中对它们进行迭代。代码正在工作,但它没有将数据插入临时表并以错误结束。 错误: 请帮我找出为什么会出现这个错误?

  • 您能像这样在JSX中使用循环吗? 或者更确切地说,像这样编写的最佳方法是什么?