java—如何将sql数据库中的数据放入hashmap?

bz4sfanl  于 2021-06-27  发布在  Java
关注(0)|答案(2)|浏览(1022)

我需要从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
pb3skfrl

pb3skfrl1#

我的建议是创建一个flight类,在该类中可以将所有三个值存储为属性,这样就可以将三个值存储在一个地方。这使得可以将每个flight对象存储在hashmap<integer,flight>中。类似下面的代码。

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访问所有数据,因为您知道它的大小。

sdnqo3pr

sdnqo3pr2#

hashmap包含键值对,并将每个唯一键Map到一个值。
根据您提供的sql数据库信息,您的表有一个复合主键,换句话说,您的主键由两列组成(日期为text类型,航班号为integer类型)。
如您所知,主键具有唯一的值,以便在查询表中的数据时帮助您进行区分。因此,应该将表的主键作为键存储在hashmap中。
现在,由于主键由两列组成,并且它们的值的组合有助于识别唯一性,因此可以创建一个数组或列表,并将日期和flightnumber存储在其中。然后,将此数组/列表作为键添加到hashmap中,并将所需的其余字段(在本例中是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类型的泛型对象数组,以便能够存储不同类型的对象。这是可能的,因为它们都是类对象的子类。
另外,java中的安全模式是在结束resultset、语句和连接时(按顺序)在finally块中关闭它们。因此,在catch块之后添加finally块:

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

相关问题