異常描述:
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;
}
讀取數據庫中的兩條數據進行測試,可以看到值被成功轉換為了枚舉。