【问题标题】:Java enum in mysqlmysql中的Java枚举
【发布时间】:2020-03-05 18:23:54
【问题描述】:

我想从我的数据库中放入和取出产品。该产品的颜色为枚举

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;
}

}

这里我与我的数据库有关系。 应该有颜色颜色而不是字符串颜色。我尝试了这两种选择。有什么建议可以解决吗?

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();
    }
}

【问题讨论】:

  • color 列包含什么?
  • 究竟是什么不起作用?你有例外吗?如果您将颜色作为字符串存储在数据库中,您可以通过 Color color = Color.valueOf(resultSet.getString(("color"))); 反序列化为 Color 对象
  • 谢谢你,Simon,我没有开始它,但想法标记了它,我确定有错误,但可能你解决了它,你给我指路了。

标签: java mysql enums


【解决方案1】:

在这种情况下你可以简单地做;

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

需要注意的是,如果字符串不存在枚举元素,则应为 IllegalStateException 使用 try-catch。

在不相关的笔记上

将您的 Statement 包装在 try-with-resources 中,否则您将获得资源泄漏。

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

}

考虑使用 PreparedStatement

尽可能(应该始终)使用 PreparedStatement 而不是 Statement。 This 是一个有用的链接,说明原因。

不要显式修改查询

不要在查询中插入值。相反,修改 PreparedStatement 对象。 SQL 注入目前是可能的。您的查询将如下所示。

String query = "SELECT * FROM ?";

这将允许您替换 ?通过执行以下操作使用表名。

try (PreparedStatement statement = connection.prepareStatement(query)) {
    statement.setString(1, tableName);
}

【讨论】:

    【解决方案2】:

    其中一个方法是使用枚举的名称值,并使用Color.valueOf(resultSet.getString("color")),如其他答案中所述,但还有其他可能性。

    更有效的方法是使用枚举的序数,并将其存储为 int。要存储值,您需要在枚举上调用 ordinal() 方法。它返回一个从零开始的索引,因此在您的示例中,WHITE.ordinal() 将返回 0,而 GREY.ordinal() 将返回 8。

    要从数据库中读取值,您可以这样做:

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

    (见:https://stackoverflow.com/a/609866/11751648

    请注意,效率是有代价的:如果你需要修改你的枚举,你只能在最后添加值,否则如果顺序改变,序数值会改变,你的数据会不连贯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      相关资源
      最近更新 更多