【问题标题】:Retrieving data from a table based on values in a hashmap根据哈希图中的值从表中检索数据
【发布时间】:2017-05-31 23:34:40
【问题描述】:

我有一个带有键和值(整数数组)HashMap<key, array> 的哈希图,我想从 sql 表中检索数据,该表的列与存储在哈希图中的数组中的值匹配

我可以通过两种方式做到这一点,一种是从表中获取所有数据并遍历 hashmap,另一种是遍历 hashmap 并在每次迭代中应用 where 子句,从而对数据库进行 n 次调用。

除了上述方法之外,还有其他有效的方法吗?

【问题讨论】:

  • 我认为它们中的任何一个都是低效的,您的 SQL 查询应该在一个数据库调用中检索。如果结果太大,java客户端无法处理,请分批处理。
  • 这显然取决于表有多大,以及哈希图中有多少条目。想一想:想象一下,哈希映射中有十个条目,表中有一亿行。现在,假设哈希图中有一万个条目,以及一个有六行的表。你明白为什么你没有得到任何答案吗?

标签: java arrays hashmap


【解决方案1】:

使用PreparedStatementWHERE 子句中设置具有IN 条件的查询。这个 sn-p 应该给你一个大致的想法:

    values = new int[]{1,2,3,4,5};
    String query =
        "SELECT film_id, title\n"
        + "FROM film\n"
        + "WHERE film_Id IN (";
    for (int i = 0; i < values.length; ++i) {
        if (i > 0) {
            query += ",";
        }
        query += "?";
    }
    query += ")";

    try {
        Connection conn = DriverManager.getConnection("db-url", "user", "pwd");
        PreparedStatement stmt = conn.prepareStatement(query);
        for (int i = 0; i < values.length; ++i)
            stmt.setInt(i+1, values[i]);
        ResultSet rs = stmt.executeQuery();
        while (rs.next()){
            // process results
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }

【讨论】:

  • 您在使用 Oracle 时必须小心使用动态“in”语句,因为它的限制为 1000。
猜你喜欢
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 2013-02-12
  • 1970-01-01
相关资源
最近更新 更多