将列和值的HashMap存储到SQL数据库以获取用户ID

时间:2019-07-03 12:04:44

标签: java mysql sql hashmap

我有一个列名和值的HashMap,我需要在SQL数据库中为给定的用户ID存储这些列名和值,并且由于我需要为每个玩家存储很多键值对,因此我决定使用一个充满玩家,以列为键。

这个建议:Insert a HashMap into any database table看起来是个好主意,但是,经过更多研究,我发现keySet()values()不能保证顺序相同:{{ 3}}。就像这个建议一样,这可能会引起问题,至关重要的是,keySet()values()都必须以相同的顺序完美对齐,否则可能会将错误的数据插入到列中。

目前,我正在使用下面的代码,效果很好,但是,如果HashMap很大,它可以快速创建大量语句,这些语句可以简化为一个语句。

HashMap<String, Object> data = //SOME DATA
String uuid = //PLAYER UUID
try (Connection c = pool.getConnection()) {
    for (String key : data.keySet()) {
        try (PreparedStatement ps = c.prepareStatement("INSERT INTO `table` (`uuid`,`" + key + "`) VALUES (?,?) ON DUPLICATE KEY UPDATE `" + key + "`=?;")) {
            Object value = data.get(key);
            ps.setString(1, uuid);
            ps.setObject(2, value);
            ps.setObject(3, value);
            try {
                ps.execute();
            } catch (SQLException e) {
                // ERROR
            }
        } catch (SQLException e) {
            // ERROR
        }
    }
} catch (SQLException e) {
    // ERROR
}

我想使用PreparedStatement清理值,但是这意味着我需要遍历HashMap来创建该语句的列列表,然后再次遍历它以设置值。这是出现问题的地方,keySet()values()的顺序可能不相同,而且确实增加了多余的时间,需要两次遍历整个地图。

是否有很好的方法来完成此操作,还是应该以某种方式重组数据库以避免出现此问题?

1 个答案:

答案 0 :(得分:1)

您可以使用LinkedHashMap完成任务。