迭代ResultSet并在ArrayList中添加其值

R11*_*11G 23 java loops jdbc resultset

我正在迭代ResultSet并尝试将其值复制到ArrayList.问题是它的遍历只有一次.但是使用resultset.getString("Col 1")to 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"));
}
Run Code Online (Sandbox Code Playgroud)

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

Sea*_*man 28

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

  • resultsetnull- 我认为这不可能就像你在你的while循环中得到一个异常一样,没有任何东西会输出
  • 第二个问题是resultset.getString(i++)每个后续行获取列1,2,3等等

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

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

Col 1, Col 2, Col3 
A    ,     B,    C
Run Code Online (Sandbox Code Playgroud)

你的代码只能得到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"));
}
Run Code Online (Sandbox Code Playgroud)

编辑:

要获得列数:

ResultSetMetaData metadata = resultset.getMetaData();
int numberOfColumns = metadata.getColumnCount();
Run Code Online (Sandbox Code Playgroud)

  • 接受的答案中的代码不会到达最后一列.ArrayLists索引从0开始,但结果集从1开始.如果元数据的列数为11,则返回11,(i <numberOfColumns)将从1到10.应该(i <= numberOfColumns)到达最后一列结果集. (2认同)

Luk*_*der 11

只是为了好玩,我提供使用的替代解决方案jOOQ和而不是使用jOOQ了Java 8,你可以使用JDBC映射任何其他API ResultSetList,如春天JDBC阿帕奇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());
Run Code Online (Sandbox Code Playgroud)

jOOQ 3.9

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

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

  • 这看起来真的很棒!说服我看看JOOQ. (3认同)
  • 不错,但不幸的是,jooQ对于商业数据库而言相当昂贵 (2认同)