【问题标题】:Trying to put the Result set Values inside a Map试图将结果集值放在地图中
【发布时间】:2018-01-16 23:08:59
【问题描述】:

我正在尝试将结果集(数据库查询值)放入 LinkedHashMap>。

行的每次迭代。该值在放入 DBMap 时被覆盖。

<LinkedHashMap<String, String>> rowData = new LinkedHashMap<>();
<LinkedHashMap<Integer, LinkedHashMap<String, String>>> dbData = new LinkedHashMap<>();
while (rset.next()) {

                    for (int col = 1; col < countCol+1; col++) {
                        String colname =rset.getMetaData().getColumnName(col);
                        rowData.put(colname, rset.getString(col));
                    }
                    int rowV = rset.getRow();
                    dbData.put(rowV, rowData);
}

这段代码只为我提供了 dbData Map 中所有键的结果集的最后一行的映射。

【问题讨论】:

  • 我刚刚发布了必填代码,它将在这里回答我的问题。 @RobbyCornelissen
  • 请注意您发布的代码在前两行中额外包含了&lt;&gt;。我假设这是一个错字,因为根据您的问题,我假设您的代码通过了编译。
  • 那是复制粘贴错误:D

标签: java sql resultset sqlresultsetmapping


【解决方案1】:

您在外部Map 中多次放置相同的LinkedHashMap 实例(由rowData 变量引用)。这就是最终 DB 行的值覆盖所有先前值的原因。

您必须为while 循环的每次迭代创建一个新的LinkedHashMap 实例:

LinkedHashMap<Integer, LinkedHashMap<String, String>> dbData = new LinkedHashMap<>();
while (rset.next()) {
    LinkedHashMap<String, String> rowData = new LinkedHashMap<>();
    for (int col = 1; col < countCol+1; col++) {
        String colname =rset.getMetaData().getColumnName(col);
        rowData.put(colname, rset.getString(col));
    }
    int rowV = rset.getRow();
    dbData.put(rowV, rowData);
}

【讨论】:

  • 不知道是谁投了你的反对票。你给出代码示例,我给出解释。
【解决方案2】:

简单:您只有 一个 rowData 映射 - 使用行数据进行更新。

您必须改为为每一行创建一个新鲜地图!

换句话说:您当前的代码会创建 一个 映射,该映射会针对每个“行”迭代进行更新。最后,您将同一张地图放入外部地图中。

【讨论】:

  • 为什么?说真的:一个想要处理数据库的人应该能够在给出解释的情况下在 2 分钟内编写该代码。
  • 谢谢!有效。我刚刚在结果集循环中声明了行数据映射。所以它实例化每次迭代
猜你喜欢
  • 2011-12-11
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
  • 2012-10-20
  • 2022-01-09
相关资源
最近更新 更多