循环访问 ResultSet 并在 ArrayList 中添加其值

2022-09-01 17:11:59

我正在迭代 一个,并尝试在 .问题是它只遍历一次。但使用 to 显示所有列的所有条目。下面是代码片段 -ResultSetArrayListresultset.getString("Col 1")resultset.getString('Col n")

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"));
}

复制到的唯一值是列 1。然后在退出时。但我可以看到所有列的值。为什么?ResultSetArrayList


答案 1

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

  • resultset是 - 我假设情况并非如此,就好像你会在while循环中得到一个异常,并且不会输出任何内容。null
  • 第二个问题是,将从每个后续行中获取列 1,2,3 等。resultset.getString(i++)

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

假设您只返回了 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();

答案 2

只是为了好玩,我提供了一个使用jOOQ和Java 8的替代解决方案。你可以使用任何其他将 JDBC 映射到的 API,例如 Spring JDBCApache DbUtils,或者编写自己的 API,而不是使用 jOOQ:ResultSetListResultSetIterator

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背后的公司工作)


推荐