Mybatis中使⽤Enum传参
在Mybatis中,处理枚举类的TypeHandler有两个:
1. EnumTypeHandler: ⽤于保存枚举名
2. EnumOrdinalTypeHandler: ⽤于保存枚举的序号。
在实际项⽬中,以上往往不能满⾜我们的需求。
需求分析
枚举需要包含两个属性,label(⽤于显⽰), value(实际的枚举值)。数据库保存枚举值(value)。
这很明显Mybatis提供的两个枚举TypeHandler不能满⾜我们的需求。此时,我们可以⾃定义⼀个通⽤的枚举TypeHandler来满⾜我们的需求。
⾃定义枚举TypeHandler
通⽤枚举DisplayedEnum
public interface DisplayedEnum {
String DEFAULT_VALUE_NAME = "value";
String DEFAULT_LABEL_NAME = "label";
default Integer getValue() {
Field field = ReflectionUtils.Class(), DEFAULT_VALUE_NAME);
if (field == null)
return null;
try {
field.setAccessible(true);
return Integer.(this).toString());
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
@JsonValue
default String getLabel() {
Field field = ReflectionUtils.Class(), DEFAULT_LABEL_NAME);
if (field == null)
return null;
try {
field.setAccessible(true);
(this).toString();
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
static <T extends Enum<T>> T valueOfEnum(Class<T> enumClass, Integer value) {
if (value == null)
throw  new IllegalArgumentException("DisplayedEnum value should not be null");
if (enumClass.isAssignableFrom(DisplayedEnum.class))
throw new IllegalArgumentException("illegal DisplayedEnum type");
T[] enums = EnumConstants();
for (T t: enums) {
DisplayedEnum displayedEnum = (DisplayedEnum)t;
if (Value().equals(value))
return (T) displayedEnum;
}
throw new IllegalArgumentException("cannot parse integer: " + value + " to " + Name());
}
}
说明:
普通枚举类通过实现DisplayedEnum接⼝,就可以:
1. 通过getValue()获取枚举值。
2. 通过getLabel()获取枚举的label属性。
3. 通过valueOfEnum()将Integer值转换为指定的枚举类型。
普通枚举类
public enum CommonsType implements DisplayedEnum {
NORMAL("正常", 0), INVALID("⽆效", 1);
String label;
Integer value;
private CommonsType(String label, Integer value) {
this.label = label;
this.value = value;
}
}
以上就是⼀个普通枚举类的⽰例。
⾃定义枚举TypeHandler
@MappedJdbcTypes(value = JdbcType.TINYINT, includeNullJdbcType = true)
public class DefaultEnumTypeHandler extends BaseTypeHandler<DisplayedEnum> {
private Class<DisplayedEnum> type;
public EnumTypeHandler(){};
public EnumTypeHandler(Class<DisplayedEnum> type) {
if (type == null) throw new IllegalArgumentException("Type argument cannot be null");
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, DisplayedEnum parameter, JdbcType jdbcType)
throws SQLException {
ps.setInt(i, Value());
}
@Override
enum怎么用public DisplayedEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
return Int(columnName));
}
@Override
public DisplayedEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return Int(columnIndex));
}
@Override
public DisplayedEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return Int(columnIndex));
}
private DisplayedEnum convert(int status){
DisplayedEnum[] objs = EnumConstants();
for(DisplayedEnum em: objs){
Value() == status){
return  em;
}
}
return null;
}
}
使⽤我们⾃定义的DefaultEnumTypeHandler
由于Mybatis默认在处理枚举类型的时候会使⽤EnumTypeHandler(只保存及转换枚举类型的名字), 因此,我们需要⼿动指定使⽤DefaultEnumTypeHandler。⽰例如下:
<resultMap id="xxx" type="xxx">
...
<result column="type" jdbcType="TINYINT" property="type" typeHandler="DefaultEnumTypeHandler" />
...
</resultMap>
即我们需要通过使⽤typeHandler来指定。
⼩结
以上是我们应⽤在实际项⽬中的⼀个对于Mybatis处理枚举类的⽅案。我看⼤多数⼈也都是这样在⽤。然⽽,在实际项⽬中,我们会发现随
着枚举类的增多,这样写起来会很繁琐。我看了⼀下⽹络上似乎也没⼈处理这种情况。那么,下⼀篇⽂章将针对这种情况进⾏处理。转⾃:javafan/2017/02/16/mybatis_typehandler/

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。