
@TableField(typeHandler = EnumTypeHandler.class)

通过mybatisPlus自带方法保存对象)






package com.liu.susu.enums.handler;
/**
* description
*
* @author susu
* @date 2022-12-01
**/
public interface MyBaseEnum {
Object getCode();
String getDesc();
}
package com.liu.susu.enums.handler;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 值枚举转换处理器
* @param 枚举类型
*/
@MappedTypes({MyBaseEnum.class})
public class ValueEnumTypeHandler<E extends Enum<?> & MyBaseEnum> extends BaseTypeHandler<MyBaseEnum> {
private Class<E> type;
public ValueEnumTypeHandler(Class<E> type) {
if (type == null) {
throw new IllegalArgumentException("Type argument cannot be null");
}
this.type = type;
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, MyBaseEnum parameter, JdbcType jdbcType)
throws SQLException {
// ps.setInt(i, parameter.getCode());
ps.setObject(i, parameter.getCode());
}
@Override
public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
int code = rs.getInt(columnName);
return rs.wasNull() ? null : codeOf(code);
}
@Override
public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
int code = rs.getInt(columnIndex);
return rs.wasNull() ? null : codeOf(code);
}
@Override
public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
int code = cs.getInt(columnIndex);
return cs.wasNull() ? null : codeOf(code);
}
private E codeOf(int code){
try {
return codeOf(type, code);
} catch (Exception ex) {
throw new IllegalArgumentException("Cannot convert" + code + "to" + type.getSimpleName() + "by code value.", ex);
}
}
private static <E extends Enum<?> & MyBaseEnum> E codeOf(Class<E> enumClass, Object code) {
E[] enumConstants = enumClass.getEnumConstants();
for (E e : enumConstants) {
if (e.getCode() == code) {
return e;
}
}
return null;
}
}

package com.liu.susu.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.liu.susu.enums.handler.MyBaseEnum;
public enum SexEnum implements MyBaseEnum {
BOY("1","男孩"),
GIRL("2","女孩");
// @EnumValue
private String code;
private String desc;
SexEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
@Override
public String getCode() {
return this.code;
}
@Override
public String getDesc() {
return this.desc;
}
}
ValueEnumTypeHandler):@TableField(typeHandler = ValueEnumTypeHandler.class)
private SexEnum sex;

type-enums-package 也可用 typeEnumsPackage):mybatis-plus:
type-aliases-package: com.liu.susu.*.entity
type-enums-package: com.liu.susu.*.entity.enums;com.liu.susu.message.enums


package com.liu.susu.message.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
public enum SexEnum {
BOY("1", "男孩"),
GIRL("2", "女孩");
SexEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
@EnumValue //标注:存数据库里存 1 2
private final String code;
@JsonValue //给前端返回时用
private final String desc;
}

package com.liu.susu.message.enums;
import com.baomidou.mybatisplus.annotation.IEnum;
public enum ColourEnum implements IEnum<String> {
BLACK("b", "黑色"),
WHITE("w", "白色");
private String value;
private String name;
ColourEnum(String value, String name) {
this.value = value;
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}








需要注意,如果按照上面的加注解,反序列化需要注意可能会出问题,如下


要解决上面的报错,很简单,前端也往后端传汉字就行了






