【问题标题】:Iterating over ResultSet and adding its value in an ArrayList遍历 ResultSet 并将其值添加到 ArrayList
【发布时间】:2013-03-09 04:54:21
【问题描述】:

我正在迭代 ResultSet 并尝试将其值复制到 ArrayList 中。 问题是它只遍历一次。但是使用resultset.getString("Col 1")resultset.getString('Col n") 会显示所有列的所有条目。 下面是代码sn -p -

ResultSet resultset = null;
ArrayList<String> arrayList = new ArrayList<String>(); 
int i = 1;
while (resultset.next()) {              
    arrayList.add(resultset.getString(i++));
    System.out.println(resultset.getString("Col 1"));
    System.out.println(resultset.getString("Col 2"));
    System.out.println(resultset.getString("Col n"));
}

ResultSet 的唯一值被复制到 ArrayList 是针对第 1 列。然后退出。 但我可以看到所有列的值。 为什么?

【问题讨论】:

  • 变量 i 的值可能会超过列
  • 是否应该在标签中添加 Java 和 JDBC?
  • @AbdullahShaikh 不,它只是在 while 循环内的一次迭代中结束。退出时 i 的值为 2。
  • @JavaMan 是的,对。已添加

标签: java jdbc resultset loops


【解决方案1】:

如果我正确理解了您的问题,这里可能存在两个问题:

  • resultsetnull - 我认为这不可能是因为您会在 while 循环中遇到异常并且不会输出任何内容。
  • 第二个问题是resultset.getString(i++) 将从每个后续行获取第 1、2、3 列等等。

我认为第二点可能是你的问题。

假设您只返回了 1 行,如下所示:

Col 1, Col 2, Col 3 
A    ,     B,     C

您的代码只会得到 A - 它不会得到其余的列。

我建议您将代码更改如下:

ResultSet resultset = ...;
ArrayList<String> arrayList = new ArrayList<String>(); 
while (resultset.next()) {                      
    int i = 1;
    while(i <= numberOfColumns) {
        arrayList.add(resultset.getString(i++));
    }
    System.out.println(resultset.getString("Col 1"));
    System.out.println(resultset.getString("Col 2"));
    System.out.println(resultset.getString("Col 3"));                    
    System.out.println(resultset.getString("Col n"));
}

编辑:

获取列数:

ResultSetMetaData metadata = resultset.getMetaData();
int numberOfColumns = metadata.getColumnCount();

【讨论】:

  • 是的。结果集不为空。第二点是问题。问题 - 我需要事先知道 numberOfColumns 吗?这是否意味着硬编码?
  • 已接受答案中的代码不会到达最后一列。 ArrayLists 索引从 0 开始,但结果集从 1 开始。如果元数据为列数返回 11,则 (i
【解决方案2】:

只是为了好玩,我提供了一个使用 jOOQ 和 Java 8 的替代解决方案。除了使用 jOOQ,您还可以使用将 JDBC ResultSet 映射到 List 的任何其他 API,例如 @987654322 @或Apache DbUtils,或自己写ResultSetIterator

jOOQ 3.8 或更低

List<Object> list =
DSL.using(connection)
   .fetch("SELECT col1, col2, col3, ...")
   .stream()
   .flatMap(r -> Arrays.stream(r.intoArray()))
   .collect(Collectors.toList());

jOOQ 3.9

List<Object> list =
DSL.using(connection)
   .fetch("SELECT col1, col2, col3, ...")
   .stream()
   .flatMap(Record::intoStream)
   .collect(Collectors.toList());

(免责声明,我在 jOOQ 背后的公司工作)

【讨论】:

  • 这看起来真不错!说服我仔细研究 JOOQ。
  • 不错,但不幸的是 jooQ 对于商业数据库来说相当昂贵
  • @thg:对于这样一个简单的查询,您不需要 jOOQ。您可以轻松地使用任何其他提到的 API,例如 Spring JDBC、Apache DbUtils,或者使用您自己的 API。这个想法保持不变。
猜你喜欢
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
相关资源
最近更新 更多