Skip to content

Commit 28f2bb2

Browse files
committed
feat: 优化 Mybatis 枚举处理器,默认使用 ordinal 处理
1 parent 86cb9e2 commit 28f2bb2

1 file changed

Lines changed: 27 additions & 10 deletions

File tree

simple-framework/src/main/java/top/cadecode/sra/framework/convert/mybatis/MyBatisEnumTypeHandler.java renamed to simple-framework/src/main/java/top/cadecode/sra/framework/convert/mybatis/DefaultEnumTypeHandler.java

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,16 @@
1717
/**
1818
* @author Cade Li
1919
* @date 2022/6/16
20-
* @description MyBatis 枚举类解析器
20+
* @description MyBatis 枚举类解析器,需要配置成默认枚举解析器使用,
21+
* 枚举类实现 EnumConvertor 接口可自定义持久化属性,没有实现 EnumConvertor 的普通枚举将使用 ordinal 进行持久化
2122
*/
22-
public class MyBatisEnumTypeHandler<E extends EnumConvertor> extends BaseTypeHandler<E> {
23+
public class DefaultEnumTypeHandler<E extends Enum<?>> extends BaseTypeHandler<E> {
2324

2425
private final Class<E> type;
2526

2627
private final Map<Integer, E> enumMap;
2728

28-
public MyBatisEnumTypeHandler(Class<E> type) {
29+
public DefaultEnumTypeHandler(Class<E> type) {
2930
if (Objects.isNull(type)) {
3031
throw new IllegalArgumentException("类型不能为空");
3132
}
@@ -34,17 +35,23 @@ public MyBatisEnumTypeHandler(Class<E> type) {
3435
if (Objects.isNull(enums)) {
3536
throw new IllegalArgumentException(type.getSimpleName() + " 不是一个枚举类型");
3637
}
37-
enumMap = Arrays.stream(enums).collect(toMap(EnumConvertor::persistBy, o -> o, (p, n) -> p));
38+
enumMap = Arrays.stream(enums).collect(toMap(o -> {
39+
// 实现 EnumConvertor 的枚举根据 persistBy 持久化
40+
if (o instanceof EnumConvertor) {
41+
return ((EnumConvertor) o).persistBy();
42+
}
43+
return o.ordinal();
44+
}, o -> o, (p, n) -> p));
3845
}
3946

4047
@Override
4148
public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
4249
// 默认将标记按 int 入库
4350
if (Objects.isNull(jdbcType)) {
44-
ps.setInt(i, parameter.persistBy());
51+
ps.setInt(i, valueFromEnum(parameter));
4552
return;
4653
}
47-
ps.setObject(i, parameter.persistBy(), jdbcType.TYPE_CODE);
54+
ps.setObject(i, valueFromEnum(parameter), jdbcType.TYPE_CODE);
4855
}
4956

5057
@Override
@@ -53,7 +60,7 @@ public E getNullableResult(ResultSet rs, String columnName) throws SQLException
5360
if (rs.wasNull()) {
5461
return null;
5562
} else {
56-
return enumFromFlag(i);
63+
return enumFromValue(i);
5764
}
5865
}
5966

@@ -63,7 +70,7 @@ public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
6370
if (rs.wasNull()) {
6471
return null;
6572
} else {
66-
return enumFromFlag(i);
73+
return enumFromValue(i);
6774
}
6875
}
6976

@@ -73,18 +80,28 @@ public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLExce
7380
if (cs.wasNull()) {
7481
return null;
7582
} else {
76-
return enumFromFlag(i);
83+
return enumFromValue(i);
7784
}
7885
}
7986

8087
/**
8188
* 从 enum 元素中提取指定元素
8289
*/
83-
private E enumFromFlag(Integer value) {
90+
private E enumFromValue(Integer value) {
8491
E e = enumMap.get(value);
8592
if (Objects.nonNull(e)) {
8693
return e;
8794
}
8895
throw new IllegalArgumentException("未知的泛型元素:" + type.getSimpleName() + "." + value);
8996
}
97+
98+
/**
99+
* 从 enum 元素中获取 value
100+
*/
101+
private Integer valueFromEnum(E e) {
102+
if (e instanceof EnumConvertor) {
103+
return ((EnumConvertor) e).persistBy();
104+
}
105+
return e.ordinal();
106+
}
90107
}

0 commit comments

Comments
 (0)