Сохраните HashMap столбцов и значений в базе данных SQL для идентификатора пользователя - PullRequest
0 голосов
/ 03 июля 2019

У меня есть 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() могут быть не в одном и том же порядке, а также добавляет дополнительное потерянное время, повторяя карту дважды.

Есть ли хороший способ сделать это, или я должен как-то реструктурировать свою базу данных, чтобы избежать этой проблемы?

1 Ответ

1 голос
/ 03 июля 2019

Вы можете использовать LinkedHashMap для выполнения задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...