Java enum 数据库存储问题(大家都是存字符串还是数值)

2020-09-25 18:11:12 +08:00
 sdbybyd

想问下大家怎么存储 enum 的,是字符串存储还是数值存储? 比如:

Gender { MALE, FEMALE }

5500 次点击
所在节点    Java
41 条回复
lower
2020-09-25 18:20:04 +08:00
byte
lower
2020-09-25 18:20:49 +08:00
@lower 说错了,bit
huijiewei
2020-09-25 18:20:59 +08:00
sdbybyd
2020-09-25 18:30:18 +08:00
@lower 你 @ 了自己,bit 指的是数值瞄?
GM
2020-09-25 18:44:08 +08:00
以下为我经常使用的做法,定义一个 enum,enum 里定义好 Json 、Jpa 等转换规则。

仅供参考:

```
@Getter
@AllArgsConstructor
public enum State {
UNKNOWN("未知"),
ACTIVE("正常"),
INACTIVE("封禁"),
;

private final String desc;

@JsonCreator
public static State fromStr(String strValue) {
return Arrays.stream(State.values()).filter(value -> value.value().equals(strValue)).findFirst().orElse(UNKNOWN);
}

@JsonValue
public String value() {
return this.name();
}

@Converter(autoApply = true)
public static class DatabaseColumnConverter implements AttributeConverter<State, String> {
public String convertToDatabaseColumn(State state) {
return state != null ? state.name() : UNKNOWN.name();
}

public State convertToEntityAttribute(String name) {
return fromStr(name);
}
}
}

```
xiangyuecn
2020-09-25 18:49:38 +08:00
enum 能做的 class 都能做。

enum 不能做的 class 都能做。

enum 各种蹩脚规范代码编写约束,本质上还是一个 class,但开头不能放别的东西,气不气人?

有什么理由用 enum ?没有!
chana71
2020-09-25 19:10:14 +08:00
@huijiewei 你这个是撸了个枚举类吗
GM
2020-09-25 19:24:21 +08:00
@xiangyuecn enum 能 switch case,class 能吗?
GM
2020-09-25 19:25:56 +08:00
@xiangyuecn
enum 可以直接 if(user.state == State.INACTIVE) { ... },class 能吗?
huijiewei
2020-09-25 19:33:08 +08:00
@GM 我贴的代码可以啊

user.state == UserState.INACTIVE.getValue()

即可
yiyi11
2020-09-25 19:33:30 +08:00
啊?不是都存码表的码吗?数据库有码表,1-xxx,2-yyy,其他表存的是码“1”或“2”。枚举定义成 xxx(“1”,“xxx”)。不管哪里的数据都是以码为准,码对应的值是描述解释(或做显示用),枚举仅仅是为了消除代码中的魔法值,跟码表一一对应的。
GM
2020-09-25 19:39:42 +08:00
@huijiewei
enum 存字符串的好处主要是一目了然,不用看着表里的 1 、2 、3 、4 去猜,比较方便。不然就得去代码里找对应文档或注释(碰到那些缺乏注释的项目,会很恶心)。

PS:多一个 .getValue() 感觉还是很不爽的,不如直接 user.state == UserState.INACTIVE
baobao1270
2020-09-25 19:42:20 +08:00
不是 Java,是 .NET ,存 Enum 。数据库里写注释,再说,有 EFCore 基本很少要动数据库
GM
2020-09-25 19:43:32 +08:00
@huijiewei 去看了一下你的代码,你这做法不是不行,但是定义、使用太麻烦了,不如 enum 好用。

我个人是很喜欢 java 的 enum 设计的,用对路了会感觉很好用。事实上,我写 C#项目的时候,还专门弄了一个 Enum 类来模拟 java 的 enum 。
wdmx007
2020-09-25 21:18:11 +08:00
不推荐存数字,也就是 ordinal 。因为这是和枚举各项顺序有关的,有脑抽的调整了顺序就炸了
lululau
2020-09-25 21:56:41 +08:00
存数值也可以不存 ordinal value,可以自定义使用数值型属性的值的,但我认为应该存字符串,就一个原因,只看 db 存的值我就知道当前这条记录是什么状态、类型了
MarioLuo
2020-09-25 22:14:36 +08:00
直接用字符串,许多框架库(spring, mybatis,...)对枚举默认值处理方式就是字符串
EminemW
2020-09-25 22:40:06 +08:00
我的 enum 是用来看的。。不存数据库,因为我不知道怎么比较合理利用
zsdroid
2020-09-25 23:39:22 +08:00
@huijiewei 1 为什么不推荐用 ENUM ? 2.你的比 java 自带的好在哪?
sdbybyd
2020-09-26 01:18:37 +08:00
@GM 这也是我现在在用的方法,就是列举一些值,写个 mybatis 的 converter 转换存储,但是我看了 fb 还有 阿里的很多接口,对外暴露用的字符串,这样 java 的 enum 就简单了,直接命名就行,mybatis 有默认 converter 插入,可能 fb 阿里都有自动化工具转值存储 db

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/710506

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX