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