У меня есть HashMap имен столбцов и значений, которые мне нужно сохранить для данного идентификатора пользователя в базе данных SQL, и, поскольку мне нужно хранить множество пар ключ-значение для каждого игрока, я решил использовать таблицу, полную игроки со столбцами в качестве ключей.
Это предложение: Вставить HashMap в любую таблицу базы данных. выглядело как хорошая идея, однако после дополнительных исследований я обнаружил, что keySet()
и values()
не гарантированно находятся в одном и том же order: Одинаковый порядок итераций для Map.keySet и Map.values? . Это может вызвать проблемы, так как с этим предложением очень важно, чтобы и 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()
могут быть не в одном и том же порядке, а также добавляет дополнительное потерянное время, повторяя карту дважды.
Есть ли хороший способ сделать это, или я должен как-то реструктурировать свою базу данных, чтобы избежать этой проблемы?