【问题标题】:java jdbc accessing multiple resultsetsjava jdbc访问多个结果集
【发布时间】:2012-01-24 15:53:54
【问题描述】:

我有以下结构:

列表 -->List_Participant -->参与者

所以一个列表可能包含多个参与者。我尝试在 java 中阅读:

        stat = con.createStatement();
        ResultSet rs = stat.executeQuery("select * from list;");
        // get the informations about the bracket sheet
        while (rs.next()) {
          string name = rs.getString("Name");
          ResultSet rs2 = stat.executeQuery("select * from List_Participant where name= '"+name+"';"); 

            while (rs2.next()) {
               // get the participants

            }
            rs2.close();
        }
        rs.close();

但这不起作用。我没有收到异常或任何其他输出。我建议打开第二个结果集将关闭第一个结果集,因为因为我做了第一个结果集,所以将数据存储在一个数组列表中并关闭它,然后第二个它会起作用,但这会导致性能不佳,因为我必须始终搜索数组列表。

什么可能是更好的解决方案?

编辑:解决方案是加入,我目前的尝试:

 select * from List_participant 
INNER JOIN List ON List.name = List_participant.List 
INNER JOIN participant ON List_participant.participant =participant.ROWID;

由于它们可能具有相同的名称,我现在如何处理这些列?

【问题讨论】:

  • 您没有在数据库中进行联接的任何原因?似乎是显而易见的解决方案。
  • 您应该尽可能将作业委托给 SQL 语言,以便它仅在一个 SQL 查询中返回完全您想要的结果。这对 Java 和 DB 来说都是双赢的。了解JOIN 子句。
  • @JonSkeet:确实。我只是不习惯 SQL。我如何一次进行两个联接?这样我就可以得到所有列表中的所有参与者。我用我的现状更新了答案。乔恩请写下您的评论作为答案,以便我标记它!
  • @Anthea:还不如选择 A.H. 的回答 :)

标签: java database jdbc


【解决方案1】:

这就是为什么不能从同一个Statement 打开两个ResultSet 的原因

ResultSet javadoc

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

所以基本上,Statement 一次只能给你一个ResultSet,所以当你执行第二个查询时你会丢失第一个结果。

解决方案:

  • 每个ResultSet 需要使用一个Statement 实例。
  • 将查询合并为只有一个

【讨论】:

    【解决方案2】:

    您可以尝试为每个查询使用两个不同的Statement 实例。请参阅java.sql.Statement 的 JavaDoc。下面的例子说明了原理。

        Statement statement1 = connection.createStatement();
        Statement statement2 = connection.createStatement();
    
        ResultSet resultSet1 = statement1.executeQuery("select * from list");
        while(resultSet1.next()){
            String name = resultSet1.getString("Name");
    
            ResultSet resultSet2 = statement2.executeQuery("select * from List_Participant where name= '"+name+"'");
            while(resultSet2.next()){
                // get the participants
            }
        }
    

    但是:这不是 JDBC 或 SQL 的标准用法,这是有充分理由的。它剥夺了数据库的任何优化可能性,并无缘无故地转移到数据库和您的应用程序之间的大量数据(参见 JohnSkeet 和 BalusC 的 cmets)。

    最好在您的唯一声明中使用适当的JOINsin。这个可以被数据库优化:

    SELECT lp.* FROM list l JOIN List_Participant lp ON l.name = lp.name
    

    添加您喜欢的任何过滤器/条件以最小化检索到的数据。

    【讨论】:

    • 这是正确的答案。您应该使用一些示例代码和/或一两个链接对其进行更多扩展。这是一个很好的链接,例如:docs.oracle.com/javase/6/docs/api/java/sql/Statement.html
    • 正如@Gray 所指出的,Java 6 API 声明允许它为:Therefore, if the reading of one ResultSet object is interleaved with the reading of another, each must have been generated by different Statement objects
    【解决方案3】:

    嵌套查询? 类似Select * from List_Participant where name in (select name from List); 这也适用于您的第三个表。

    【讨论】:

      猜你喜欢
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 2010-11-02
      • 1970-01-01
      相关资源
      最近更新 更多