【问题标题】:How do i put data from an SQL Database to a Hashmap?如何将 SQL 数据库中的数据放入 Hashmap?
【发布时间】:2021-04-13 16:50:20
【问题描述】:

我需要从 SQL 数据库中检索数据并将其放入 hashmap 中,我对如何做到这一点有点迷茫,尤其是对于我给定的数据类型,如果有人可以帮助并向我解释这个过程,那将是太好了,下面是我的代码:

public void load (Path p) throws DataLoadingException {
    try {
        
         String pathString = p.toString();
         Connection c = DriverManager.getConnection("jdbc:sqlite:"+pathString);
         Statement s = c.createStatement();
         ResultSet rs = s.executeQuery("select * from PassengerNumbers;");
        
          
            while (rs.next()) {
                LocalDate  date = LocalDate.parse(rs.getString("Date"));
                int  flightnumber = Integer.parseInt(rs.getString("FlightNumber"));
                int loadestimate = Integer.parseInt(rs.getString("LoadEstimate"));
            }
         
            rs.close();
            c.close();
            
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

这是 SqlDb 中的数据:

(PK TEXT)             (PK INTEGER)                     (INTEGER)
   Date                FlightNumber                   LoadEstimate
2020-07-01               618                              124   

【问题讨论】:

标签: java sql database eclipse hashmap


【解决方案1】:

我的建议是创建一个 Flight 类,您可以在其中将所有三个值存储为属性,这样您就可以将三个值存储在一个地方。 这使得将每个 Flight 对象存储在 Hashmap 中成为可能。 类似于下面的代码。

HashMap<Integer,Flight> hashMap = new HashMap<Integer,Flight>;
Integer key = 0;
while (rs.next()) {
            LocalDate  date = LocalDate.parse(rs.getString("Date"));
            int  flightnumber = Integer.parseInt(rs.getString("FlightNumber"));
            int loadestimate = Integer.parseInt(rs.getString("LoadEstimate"));
            Flight newFlight = new Flight(date,flightnumber,loadestimate);
            hashMap.put(key, newFlight);
            key++;
}

通过这种方式,您可以通过遍历 hashmap 来访问所有数据,因为您知道它的大小。

【讨论】:

  • 不幸的是它返回了一个空的 hashMap。
  • 返回空 HashMap 的唯一方法是结果集没有返回数据。您是否使用调试器逐步完成此操作以确保循环正在迭代?
  • 是的,我做到了,但由于某种原因,我没有得到它的返回 null
【解决方案2】:

Hashmap 包含键值对并将每个唯一键映射到一个值。

根据您提供的 SQL 数据库信息,您的表有一个 composite primary key,换句话说,您的主键包含两列(TEXT 类型的 dateflightNumber 类型为 INTEGER)。

如您所知,主键具有唯一值,以帮助您在查询表中的数据时进行区分。因此,您应该将表的主键作为键存储在哈希图中。

现在,由于您的主键由两列组成,并且它们的值的组合可以帮助您识别唯一性,因此您可以创建一个数组或列表并在其中存储 date 和 * flightNumber *。然后,您将此数组/列表作为键添加到您的哈希图中,并将您想要的其余字段(在我们的示例中为 INTEGER 类型的 loadEstimate)作为其值。

上面的代码应该是这样的:

HashMap<ArrayList<Object>, int> myMap = new HashMap<>(); //Create your hashmap

while (rs.next()) {
    LocalDate  date = LocalDate.parse(rs.getString("Date"));
    int  flightnumber = Integer.parseInt(rs.getString("FlightNumber"));
    int loadestimate = Integer.parseInt(rs.getString("LoadEstimate"));

    //Create array resembling the primary key
    ArrayList<Object> mapKey = new ArrayList<>();
    mapKey.add(date);
    mapKey.add(new Integer(flightnumber));

    //Store to Map the key and the value
    myMap.put(mapKey, loadestimate);
}
//then do sth with the hashmap

请注意,我创建了一个 Object 类型的通用对象数组,以便能够存储不同类型的对象。这是可能的,因为它们都是 Object 类的子类。

此外,Java 中的安全模式是在完成操作后在 finally 块中关闭 ResultSet、Statement 和 Connection(按此顺序)。所以,在 catch 块之后添加这个 finally 块:

finally {
    try { rs.close(); } catch (Exception e) { /* ignored */ }
    try { s.close(); } catch (Exception e) { /* ignored */ }
    try { c.close(); } catch (Exception e) { /* ignored */ }
}

【讨论】:

  • 我试过了,但现在我遇到了一个问题,每当我尝试检查“myMap”的内容时,这就是我得到的结果:如果数据库的第一行是 A,第二行是 B 和第三个 C ,每当我打印时,它都是这样的:A/ AB / ABC / .. 等等,如果你明白我想说的话
  • 在尝试打印地图内容时,您可能没有正确地迭代地图。您应该使用 foreach 语句来读取其值。请提供您如何尝试打印地图的 sn-p。另外,请尝试使用调试器和一些断点来确保结果集包含值并且它们被正确复制到映射中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 2011-12-09
  • 2016-04-03
相关资源
最近更新 更多