我改进了 RHTs/Brad Ms 和 Lestos 答案的解决方案。
我扩展了这两种解决方案,将其所在的州留在了那里。所以我保存当前的 ResultSet 位置并在创建地图后恢复它。
rs 是 ResultSet,它是一个字段变量,因此在我的解决方案片段中不可见。
我将 Brad Ms 解决方案中的特定地图替换为通用地图。
public List<Map<String, Object>> resultAsListMap() throws SQLException
{
var md = rs.getMetaData();
var columns = md.getColumnCount();
var list = new ArrayList<Map<String, Object>>();
var currRowIndex = rs.getRow();
rs.beforeFirst();
while (rs.next())
{
HashMap<String, Object> row = new HashMap<String, Object>(columns);
for (int i = 1; i <= columns; ++i)
{
row.put(md.getColumnName(i), rs.getObject(i));
}
list.add(row);
}
rs.absolute(currRowIndex);
return list;
}
在 Lestos 解决方案中,我优化了代码。在他的代码中,他必须在该 for 循环的每次迭代中查找 Maps。我将其减少到每次 for 循环迭代只有一个数组访问。所以程序不能为该字符串键搜索每个迭代步骤。
public Map<String, List<Object>> resultAsMapList() throws SQLException
{
var md = rs.getMetaData();
var columns = md.getColumnCount();
var tmp = new ArrayList[columns];
var map = new HashMap<String, List<Object>>(columns);
var currRowIndex = rs.getRow();
rs.beforeFirst();
for (int i = 1; i <= columns; ++i)
{
tmp[i - 1] = new ArrayList<>();
map.put(md.getColumnName(i), tmp[i - 1]);
}
while (rs.next())
{
for (int i = 1; i <= columns; ++i)
{
tmp[i - 1].add(rs.getObject(i));
}
}
rs.absolute(currRowIndex);
return map;
}