迭代ResultSet并在ArrayList中添加其值

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

 ResultSet resultset = null; ArrayList arrayList = new ArrayList(); 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列。然后退出时。 但我可以看到所有列的价值。 为什么?

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

  • resultsetnull – 我认为这不可能就像你在while循环中得到一个exception一样,没有输出
  • 第二个问题是resultset.getString(i++)将从每个后续行获取列1,2,3等等

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

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

 Col 1, Col 2, Col3 A , B, C 

你的代码只能得到A – 它不会得到其余的列。

我建议您更改代码如下:

 ResultSet resultset = ...; ArrayList arrayList = new ArrayList(); 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(); 

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

jOOQ 3.8或更低

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

jOOQ 3.9

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

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