我有一个列名和值的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()
的顺序可能不相同,而且确实增加了多余的时间,需要两次遍历整个地图。
是否有很好的方法来完成此操作,还是应该以某种方式重组数据库以避免出现此问题?
答案 0 :(得分:1)
您可以使用LinkedHashMap完成任务。