Java перечисление в mysql - PullRequest
0 голосов
/ 05 марта 2020

Я хотел бы добавить и вывести продукты из моей базы данных. Цвет этой продукции: enums

public enum Color {
WHITE("#FFFFFF"), BLACK("#000000"), GREEN("#008000"), RED("#FF0000"), BLUE("#0000FF"), YELLOW("#FFFF00"), ORANGE("#FFA500"), PURPLE("#800080"),
GRAY("#808080");

private String color;

Color (String color){
    this.color = color;
}

public String getHex() {
    return color;
}

}

Здесь я имею отношение к моим базам данных. Должен быть цвет Color, а не цвет String. Я пробую оба варианта. Любое предложение, как это исправить?

public List<Product> getAllProducts( ){
    List<Product> products = new LinkedList<Product>();
    Statement statement;
    try {
        statement = connection.createStatement();
        query = "select * from " + tableName;
        ResultSet resultSet = statement.executeQuery(query);
        /* (name, price, weight, color, product count, size, material */
        while(resultSet.next()) {
            Long id = resultSet.getLong("id");
            String name = resultSet.getString("name");
            Float price = resultSet.getFloat("price");
            Float weight = resultSet.getFloat("weight");
            String color = resultSet.getString(("color"));
            Integer productCount = resultSet.getInt("productcount");
            String size = resultSet.getString("size");
            String material = resultSet.getString("material");

            Product product = new Product(id, name, price, weight, color, productCount, size, material);
            products.add(product);
        }

    }
    catch (SQLException e) {
        e.printStackTrace();
    }
}

Ответы [ 2 ]

1 голос
/ 05 марта 2020

В такой ситуации вы можете просто сделать;

Color color = Color.valueOf(resultSet.getString("color"));

Следует отметить, что вы должны окружить try-catch для IllegalStateException, если для String не существует элемента enum.

На несвязанной заметке

Оберните свое заявление в попытку с ресурсами, иначе вы получите утечку ресурсов.

try (Statement statement = connection.createStatement()) {

}

Рассмотрите возможность использования PreparedStatement .

Всегда используйте PreparedStatement вместо Statement, когда это возможно (должно быть всегда). Это - полезная ссылка на вопрос, почему.

Не изменять явно запрос

Не вставлять значения в запрос. Вместо этого измените объект PreparedStatement. SQL инъекция возможна в настоящее время. Ваш запрос будет выглядеть следующим образом.

String query = "SELECT * FROM ?";

Это позволит вам заменить? с именем таблицы, выполнив следующее.

try (PreparedStatement statement = connection.prepareStatement(query)) {
    statement.setString(1, tableName);
}
0 голосов
/ 06 марта 2020

Один из подходов использует значение имени Enum и Color.valueOf(resultSet.getString("color")), как объяснено в другом ответе, но есть и другие возможности.

Более эффективный способ - использовать порядковый номер перечисления и хранить его как int. Чтобы сохранить значение, вам нужно вызвать метод ordinal () для перечисления. Он возвращает индекс, начинающийся с нуля, поэтому в вашем примере WHITE.ordinal () вернет 0, а GRAY.ordinal () вернет 8.

Чтобы прочитать значение из базы данных, вы можете сделать:

Color.values()[resultSet.getInt("color")]

(см .: { ссылка })

Обратите внимание, что эффективность имеет свою цену: если вам нужно изменить enum, вы можете добавлять значения только в конец, иначе, если порядок будет изменен, порядковые значения изменятся, и ваши данные будут непоследовательными.

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