MyBatis自带两种(EnumOrdinalTypeHandlerEnumTypeHandler)枚举转换器,但只支持最基本的枚举类型

与ordinal属性相互转换

EnumOrdinalTypeHandler可将枚举的ordinal属性和int相互转换

1
enum GenderEnum{MALE,FEMALE}

会将GenderEnum.MALE转为0GenderEnum.FEMALE转为1(可相互转换)

与名称相互转换

EnumTypeHandler可将枚举的名称string相互转换

1
enum GenderEnum{MALE,FEMALE}

会将GenderEnum.MALE转为"MALE"GenderEnum.FEMALE转为"FEMALE"(可互相转换)

自定义转换

对于复杂的Enum则需要自定义转换器

复杂枚举
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//复杂枚举
enum GenderEnum{
MALE(1,"male"),
FEMAIL(2,"female");

private Map<int, GenderEnum> map = new HashMap<>();

static{
for(GenderEnum g:GenderEnum.values()){
map.put(g.getKey,g);
}

private int key;
private String value;

GenderEnum(int key, String value){
this.key=key;
this.value=value;
}

public GenderEnum getGenderByKey(int key){
return map.get(key);
}
public int getKey(){
return key;
}
}
自定义枚举转换器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//自定义转换器
public class GenderEnumTypeHandler extends BaseTypeHandler<GenderEnum> {

@Override
public void setNonNullParameter(PreparedStatement ps, int i, GenderEnum parameter, JdbcType jdbcType) throws SQLException {
ps.setInt(i, parameter.getKey());
}

@Override
public GenderEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
int key = rs.getInt(columnName);
if (rs.wasNull()) {
return null;
}
return GenderEnum.getGenderByKey(key);
}

@Override
public GenderEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
int key = rs.getInt(columnIndex);
if (key == 0 && rs.wasNull()) {
return null;
}
return Method.getGenderByKey(key);
}

@Override
public GenderEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
int key = cs.getInt(columnIndex);
if (key == 0 && cs.wasNull()) {
return null;
}
return Method.getGenderByKey(key);
}
}