迭代ResultSet并在ArrayList中添加其值

时间:2013-03-20 07:31:46

标签: java jdbc resultset loops

我正在迭代ResultSet并尝试在ArrayList中复制其值。 问题是它的遍历只有一次。但是使用resultset.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"));
}

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

2 个答案:

答案 0 :(得分:27)

如果我已正确理解您的问题,可能会出现两个问题:

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

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

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

Col 1, Col 2, Col3 
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();

答案 1 :(得分:11)

为了好玩,我提供了使用jOOQ和Java 8的替代解决方案。您可以使用任何其他将JDBC ResultSet映射到{{}的API,而不是使用jOOQ。 1}},例如Spring JDBCApache DbUtils,或编写您自己的List

jOOQ 3.8或更低

ResultSetIterator

jOOQ 3.9

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

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