java jdbc访问多个结果集

时间:2011-12-20 17:43:10

标签: java database jdbc

我有以下结构:

列表 - > 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();

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

什么是更好的解决方案?

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

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

我现在如何对列进行处理,因为它们可能具有相同的名称?

3 个答案:

答案 0 :(得分:9)

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

    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的评论)。

最好使用适当的JOIN来证明你唯一的陈述。这个可以由DB优化:

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

添加您喜欢的任何过滤器/条件,以最大限度地减少检索到的数据。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这就是为什么您无法从同一个ResultSet中打开两个Statement的原因

ResultSet javadoc

  

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

因此,基本上,Statement一次只能给您一个ResultSet,因此在执行第二个查询时,您会丢失第一个结果。

解决方案:

  • Statement需要一个ResultSet实例。
  • 将查询合并为仅一个