在我们日常开发中,为了方便有些状态的字段需要定义枚举来管理,如何通过mybaits将数据库的字段映射到java的枚举对象?
1.定义枚举对象
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.communal.common.anotations.Remark;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
@Getter
@AllArgsConstructor
public enum AuditStatus implements Remark {
ALL("全部") {
@Override
public <T> void query(QueryWrapper<T> queryWrapper) {
queryWrapper.isNotNull("audit_status");
}
},
UN_AUDIT("未审核"),
PASS("审核通过"),
UN_PASS("审核不通过")
;
private String remark;
public static boolean validate(String name) {
for (AuditStatus auditStatus : AuditStatus.values()) {
if (StringUtils.equals(name, auditStatus.name())) {
return true;
}
}
return false;
}
public <T> void query(QueryWrapper<T> queryWrapper) {
queryWrapper.eq("audit_status", this.name());
}
2.新建一个枚举的转换器
import com.multimedia.enums.AuditStatus;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class AuditStatusEnumHandler extends BaseTypeHandler<Enum<AuditStatus>> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Enum parameter, JdbcType jdbcType) throws SQLException {
}
@Override
public Enum<AuditStatus> getNullableResult(ResultSet rs, String columnName) throws SQLException {
return Enum.valueOf(AuditStatus.class, rs.getString( columnName));
}
@Override
public Enum<AuditStatus> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return Enum.valueOf(AuditStatus.class, rs.getString(columnIndex));
}
@Override
public Enum<AuditStatus> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return Enum.valueOf(AuditStatus.class, cs.getString(columnIndex));
}
}
3.定义map的映射
<result column="audit_status" property="status" typeHandler="com.multimedia.AuditStatusEnumHandler"/>
这样我们就可以拿到枚举对象了