一个初学者的问题,但是...
我有一个从数据库返回的ResultSet对象-3列30行。
我检索以下数据集:
使用以下内容:
try {
preparedStatement = conn.prepareStatement(
sqlStatement,
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rs = preparedStatement.executeQuery();
ResultSetMetaData md = rs.getMetaData();
int columns = md.getColumnCount();
while(rs.next()) {
HashMap row = new HashMap(columns);
for(int i=1; i<=columns; ++i){
row.put(md.getColumnName(i),rs.getObject(i));
}
list.add(row);
}
...我将其作为ArrayList返回
...,在调试时显示如下:
我希望能够以伪代码遍历HashMap值:
我知道这应该不难,我只是在努力寻找迭代HashMaps的ArrayList的最佳方法
答案 0 :(得分:2)
您正在使用原始类型,并且您的IDE或编译器向您抛出大量有关此的警告。你应该注意他们。因为没有,所以您能够编写代码,将包含映射的列表(每个映射代表一个返回的db结果,将列名称映射到行中的值)分配给类型为List<String>
的变量
这种将数据库行转换为映射的模型不是一个好主意。有很多不错的库可以与数据库交互。例如,JDBI易于理解,具有用于访问结果的更周全的API。它甚至可以将结果映射到Java数据类型。
如果必须使用到目前为止粘贴的模型,对于初学者,请在各处添加泛型,以便编译器将其标记为编译时错误。至少要使该List<Map<String, Object>>
。
让我重申,将事情切换到JDBI是一条非常优越的路,但是为了回答直接提出的问题,添加泛型并修复变量类型后,您可以执行以下操作:>
List<Map<String, Object>> data = getResultSet(syndicatorName);
for (int rowIdx = 0; rowIdx < data.size(); i++) {
Map<String, Object> row = data.get(rowIdx);
for (Map.Entry<String, Object> cell : row.entrySet()) {
System.out.printf("Row %d cell %s: %s\n", rowIdx, cell.getKey(), cell.getValue());
}
}
请注意,此处的单元格值为“对象”。您必须将它们转换为您知道的数据类型。这不是惯用的Java,但是如果没有完全重新设计getResultSet方法,就无法解决该问题。同样,您真正想要的是JDBI或类似的库。
答案 1 :(得分:1)
您需要一个嵌套循环(至少我会那样做...不仅有其他几种方式):
for (HashMap<T,T> i : ArrayList<HashMap<T,T>>) {
for (T j : i.keySet()){
i.get(j);
//further code
}
}