Mybatis枚举映射异常
异常描述:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'xxx' from result set. Cause: java.lang.IllegalArgumentException: No enum constant com.xxx.xxx.enums.XxxEnum.Xxx
原因:没有配置枚举的扫描包 type-enums-package
解决:在配置文件中指定枚举的扫描包
application.yaml:
mybatis-plus:
type-enums-package: xxx.xxx.xxx.enums
application.properties:
mybatis-plus.type-enums-package=com.cyan.test.demo.enums
完整使用Mybatis映射枚举
1)在配置文件中加入 type-enums-package 指定枚举的扫描包
MyBatis-Plus将为包内(包含子包)所有枚举进行适配,可以使用逗号或分号分隔多个包名(支持统配符 *)
application.yaml:
mybatis-plus:
type-enums-package: 枚举包
application.properties:
mybatis-plus.type-enums-package=枚举包
2)在枚举类中指定数据库值所对应的属性。有两种方式
① 实现官方提供的 IEnum 接口,接口中的 getValue 方法与数据库值对应的属性。
@Getter
@AllArgsConstructor
@ToString
public enum SexEnum implements IEnum<Integer> {
WOMAN(0, "女"),
MAN(1, "男");
// 标记数据库存的值是value
private final Integer value;
private final String desc;
}
② 将属性使用 EnumValue 注解标记数据库值对应的属性。
@Getter
@AllArgsConstructor
@ToString
public enum SexEnum {
WOMAN(0, "女"),
MAN(1, "男");
// 标记数据库存的值是value
@EnumValue
private final Integer value;
private final String desc;
}
3)在类的属性声明上直接将字段类型写为枚举类型,读取时将自动转换数据库值为枚举对象。
@Data
@TableName(value = "personal")
public class Personal {
private Integer id;
private String name;
private SexEnum sex;
private Integer age;
}
读取数据库中的两条数据进行测试,可以看到值被成功转换为了枚举。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构