Spring Boot Mybatis 使用枚举类
记录一下,在实际项目引用枚举的步骤;
为什么要使用枚举?
可以参照以前我总结的博客:
为什么要使用枚举?
如何引用
需要创建以下文件:
文件 | 描述 |
---|---|
<-- Interface --> IEnum | |
<-- class --> EnumKeyTypeHandler | 继承 BaseTypeHandler的自定义枚举类 |
<-- class --> 实体Bean | 数据库对应的PO,将需要用枚举表示的声明为Enum |
<-- enum --> 枚举类 | 数据库对应的PO中需要用枚举表示的字段 |
<-- Mybatis.xml --> 对应数据库映射的xml | 需要将用枚举表示的字段定义类型为自定义枚举类 |
- IEnum
public interface IEnum {
Object getKey();
void setKey(int key);
String getValue();
void setValue(String value);
}
- EnumKeyTypeHandler
public class EnumKeyTypeHandler extends BaseTypeHandler<IEnum> {
private static Pattern NUMBER_PATTERN = Pattern.compile("^[-\\+]?[\\d]*$");
private Class<IEnum> type;
private final IEnum[] enums;
/**
* 设置配置文件设置的转换类以及枚举类内容,供其他方法更便捷高效的实现
* @param type 配置文件中设置的转换类
*/
public EnumKeyTypeHandler(Class<IEnum> type) {
if (type == null) {
throw new IllegalArgumentException("Type argument cannot be null");
}
this.type = type;
this.enums = type.getEnumConstants();
if (this.enums == null) {
throw new IllegalArgumentException(type.getSimpleName() + " does not represent an enum type.");
}
}
@Override
public IEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
if(isInteger(columnName)) {
// 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
int i = rs.getInt(columnName);
if (rs.wasNull()) {
return null;
} else {
// 根据数据库中的code值,定位IEnum子类
return locateIEnum(i);
}
} else {
return locateIEnum(rs.getString(columnName));
}
}
@Override
public IEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
// 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
int i = rs.getInt(columnIndex);
if (rs.wasNull()) {
return null;
} else {
// 根据数据库中的code值,定位IEnum子类
return locateIEnum(i);
}
}
@Override
public IEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
// 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
int i = cs.getInt(columnIndex);
if (cs.wasNull()) {
return null;
} else {
// 根据数据库中的code值,定位IEnum子类
return locateIEnum(i);
}
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, IEnum parameter, JdbcType jdbcType)
throws SQLException {
// baseTypeHandler已经帮我们做了parameter的null判断
if(parameter.getKey() instanceof Integer) {
ps.setInt(i, (Integer) parameter.getKey());
} else
if(parameter.getKey() instanceof String) {
ps.setString(i, (String)parameter.getKey());
}
}
/**
* 枚举类型转换,由于构造函数获取了枚举的子类enums,让遍历更加高效快捷
* @param key 数据库中存储的自定义code属性
* @return code对应的枚举类
*/
private IEnum locateIEnum(Object key) {
for(IEnum status : enums) {
if(status.getKey() instanceof Integer) {
if((Integer)status.getKey()== key) {
return status;
}
} else
if(status.getKey() instanceof String) {
if(status.getKey().toString().equals(key)) {
return status;
}
}
}
throw new IllegalArgumentException("未知的枚举类型:" + key + ",请核对" + type.getSimpleName());
}
/*
* 判断是否为整数
* @param str 传入的字符串
* @return 是整数返回true,否则返回false
*/
public static boolean isInteger(String str) {
return NUMBER_PATTERN.matcher(str).matches();
}
}
- 实体Bean
public class Company implements Serializable {
private static final long serialVersionUID = -1505541566786459102L;
private Integer cId;
...
...
...
// 改为枚举类型
private CompanyStatusEnum status;
...
...
}
- *Enum.java
public enum CompanyStatusEnum implements IEnum {
SUBSISTING("subsisting","存续"),
EMPLOYED("employed","在业"),
REVOKE("revoke","吊销"),
ANNUL("annul","注销"),
MOVING("moving","迁入"),
EMIGRATION("emigration","迁出"),
SHUTOUT("shutout","停业"),
LIQUIDATE("liquidate","清算");
private final String key;
private final String value;
private CompanyStatusEnum (String key,String value){
this.key = key;
this.value = value;
}
/**
* 根据key获取枚举
* @param key
* @return
*/
public static CompanyStatusEnum getEnumByKey(String key){
if(null == key){
return null;
}
for(CompanyStatusEnum temp:CompanyStatusEnum.values()){
if(temp.getKey().equals(key)){
return temp;
}
}
return null;
}
@Override
public String getKey() {
return key;
}
@Override
public void setKey(int key) {
}
@Override
public String getValue() {
return value;
}
@Override
public void setValue(String value) {
}
}
- *Mapper.xml
....
...
<mapper namespace="com.bdjr.data.process.mapper.CompanyMapper" >
<resultMap id="BaseResultMap" type="com.spring.cloud.common.po.Company">
<id column="c_id" jdbcType="BIGINT" property="cId" />
...
...
<!-- 使用到枚举的就这么加,定义自定义枚举类 -->
<result column="status" jdbcType="VARCHAR" typeHandler="com.spring.cloud.common.typehandler.EnumKeyTypeHandler" property="status" />
</resultMap>
...
...
</mapper>