我遍历一个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列。然后一边退出。 但我可以看到所有列的值。 为什么?
如果我理解正确的话您的问题,这里有两个可能的问题:
-
resultset
是null
-我认为这是不能的情况下,如果它是你会得到一个例外while循环,没有什么会是输出 - 第二个问题是,
resultset.getString(i++)
将得到的列1,2,3等从每个后续的行
我认为,第二点可能是你的问题就在这里。
比方说,你只有1个返回行,如下
Col 1, Col 2, Col3
A , B, C
您的代码,因为它代表将只能得到 - 它wouldnt得到的列的其余部分。
我建议你改变你的代码如下:
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();
只是为了好玩,我提供使用的替代解决方案jOOQ和而不是使用jOOQ了Java 8,你可以使用任何其他API映射JDBC ResultSet
,以List
,如春天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());
jOOQ 3.9
List<Object> list =
DSL.using(connection)
.fetch("SELECT col1, col2, col3, ...")
.stream()
.flatMap(Record::intoStream)
.collect(Collectors.toList());
(声明,我背后jOOQ公司工作)