如何将resultSet放入Array中以便多次使用

时间:2011-06-14 18:51:35

标签: java sql

我有一个我从数据库中提取的resultSet:

      String selStmt = "SELECT code_id, internal_code, representation, pos, decode(substr(internal_code, 5, 1), 'Q', 2, 1) as sorter, "
                 + "       to_char(term_start, 'MM-DD-YYYY') as sDate "
                 + "  FROM table1, terms WHERE code_id = 'SEARCH.TERMS' AND internal_code = terms.terms_id (+) ORDER BY 5, 4 ";

  stmt = conn.prepareStatement(selStmt);
  result = stmt.executeQuery();

我现在要做的是将这些结果放入数组中,我知道我可以使用while循环来循环并获得结果,但我只能使用那些,我需要继续使用它们页面的其余部分。我想这可以使用数组完成,但如果有更简单的方法,请告诉我,如果需要更多信息,请告诉我。

7 个答案:

答案 0 :(得分:2)

由于您事先不知道行数,我实际上会选择ArrayList。然后,您可以根据需要插入自定义对象(从结果集构建)。

答案 1 :(得分:1)

您可以将数据存储在2D数组中。但更友好的OO方式是创建一个对象来表示一行数据表示的内容,并从ResultSet创建这些对象的List。

要提取数据,只需循环遍历ResultSet,就像为每个循环一样,创建自定义对象的新实例并将其添加到列表中。

答案 2 :(得分:1)

我所知道的Java没有DataSet(.NET)等价物。因此,请考虑以下内容:

ArrayList<Integer> data = new ArrayList<Integer>();

ResultSet rs = ....;

// For each record in the result...    
while (rs.next()) {
  // Want more values? Create a custom Type representing the Row!
  // The following is just an example taking the first column (as an int).
  // This would be done manually for each column... and possibly loadeded
  // in a custom object which is then added to the list... blah blah.
  // (Alternatively each row could be represented as Object[] or List<Object>
  //  at the expense of losing static typing.)
  int id = rs.getInt(0);
  data.add(id);
}

// Then later, if you *really* want an array...
// (Java is such a backwards language and lacks a trivial way
//  to go to int[] from Integer[] but I digress...)
Integer[] array = data.toArray(new Integer[0]);

快乐编码

答案 3 :(得分:1)

标准方法是遍历ResultSet 一次并(可能)将每个记录存储在一个数组中 - 您可以随后循环遍历,如您所愿。这就是大多数答案所暗示的,这是正确的方法。

相关的一点是:你(显然)喜欢保留ResultSet在每个next()调用中返回的“原始”记录(这样你就可以将每条记录存储在{ {1}}并将其视为可滚动 ResultSet或类型)。我认为不可能做到,我坚信,在大多数情况下,这是一个坏主意。 ResultSet属于JDBC层,它是一个相当低级的层,并且存在问题和缺陷。通常,ResultSet应该尽可能快地完成并关闭,并且不应泄漏到上层。通过“消失”,我的意思是将其循环并为每个curson位置构建您自己的Java对象(使用 rs.getXXX()方法)与JDBC api无关。这就是大多数人和框架(例如iBatis)所做的事情,而且在大多数情况下,做其他事情都是不好的做法。

例如,我曾经看过一些伪dao实现为(伪代码):

ArrayList

然后调用者将遍历结果集。这很可怕,可能会失败,因为结果集可能会尝试从db获取数据(但连接已关闭!)。

如果你真的想做这样的事情,你应该查看RowSet课程。但我认为它用得不多。

答案 4 :(得分:1)

我曾使用以下代码来解决类似的挑战:

Vector rows = new Vector();
Vector nrow;
int cnt = 0;

while(result.next())
{
    nrow=new Vector();
    cnt+=1;
    nrow.addElement(String.valueOf(cnt));
    for(int i=1;i<=3;i++) //replace 3 with the length of the columns
    {
        nrow.addElement(result.getObject(i));
    }
    rows.addElement(nrow);
}

现在,您可以循环遍历行并根据需要使用数据。每次迭代返回的每个对象都包含整个行数据。

答案 5 :(得分:0)

数组可能就是这样做的。只需在你的while循环之前初始化它,在你的while循环中填充它,然后使用它:)

答案 6 :(得分:0)

如果您需要在整个页面中不断引用行,则另一种可能性是使用HashMap存储行。对于索引,请使用db。中的主键。

这样您就可以根据需要快速引用特定的行。如果你只是需要遍历结果集而不是arraylist,如前所述应该在这里工作得很好。