mybatisplus实现枚举自动转换
时间: 2024-09-10 22:16:52 浏览: 18
MyBatis-Plus 是 MyBatis 的一个增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。在使用 MyBatis-Plus 时,可以实现枚举类型与数据库中字段的自动转换,通常通过自定义枚举转换器来实现。
1. 创建枚举类,定义枚举常量以及对应的数据库存储值。
2. 实现 `IEnum` 接口(如果使用的 MyBatis-Plus 版本是 3.1.2 之后的版本,则需要实现 `IEnum` 接口的泛型版本 `IEnum<T>`),并重写 `getValue()` 方法返回枚举对应的数据库值。
3. 实现 `TypeHandler` 接口,在 `setParameter` 方法中处理如何将枚举类型转换为数据库能够存储的值,在 `getResult` 方法中处理如何将数据库值转换为枚举类型。
下面是一个简单的示例:
```java
public enum SexEnum implements IEnum<Integer> {
MAN(1, "男"),
WOMAN(2, "女");
private int value;
private String desc;
SexEnum(int value, String desc) {
this.value = value;
this.desc = desc;
}
@Override
public Integer getValue() {
return value;
}
// 这里还可以根据需要添加其他方法,比如根据描述获取枚举值等。
}
```
然后注册枚举转换器:
```java
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
// 添加枚举转换器插件
interceptor.addInnerInterceptor(new EnumMateTypeHandler());
return interceptor;
}
}
// 枚举转换器示例
public class EnumMateTypeHandler<E extends IEnum<?>> extends BaseTypeHandler<E> {
private Class<E> type;
public EnumMateTypeHandler(Class<E> type) {
if (type == null) {
throw new IllegalArgumentException("Type argument cannot be null");
}
this.type = type;
}
@Override
public void setParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
if (parameter == null) {
ps.setNull(i, Types.VARCHAR);
} else {
ps.setString(i, String.valueOf(parameter.getValue()));
}
}
@Override
public E getResult(ResultSet rs, String columnName) throws SQLException {
int value = rs.getInt(columnName);
return rs.wasNull() ? null : (E) IEnum.valueOf(type, value);
}
@Override
public E getResult(ResultSet rs, int columnIndex) throws SQLException {
int value = rs.getInt(columnIndex);
return rs.wasNull() ? null : (E) IEnum.valueOf(type, value);
}
@Override
public E getResult(CallableStatement cs, int columnIndex) throws SQLException {
int value = cs.getInt(columnIndex);
return cs.wasNull() ? null : (E) IEnum.valueOf(type, value);
}
}
```
在实际使用中,可能还需要根据具体的数据库连接和版本进行一些微调。