问题
在数据库中保存的是枚举类的int编码数据。现在通过MyBatis查询这个枚举类,期望MyBatis能够自动将int数据转化成Java枚举类。
思路
在Mapper.xml文件的resultMap的配置枚举字段中,需要配置自定义typehandler处理类。自定义typehandler处理,主要就是将从数据库里面查询出来的int数据编码转化成java枚举类。
步骤
StatusEnum.java
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Getter;
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
@Getter
@AllArgsConstructor
public enum StatusEnum {
OPEN(1, "开启"),
CLOSE(2, "关闭");
private final int code;
private final String name;
public static StatusEnum getByCode(int code){
for (StatusEnum value : values()) {
if (value.getCode() == code) {
return value;
}
}
return null;
}
}
StatusEnumTypeHandler.java
import com.xxxx.StatusEnum;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.apache.ibatis.type.TypeHandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@MappedTypes(StatusEnum.class)
@MappedJdbcTypes(JdbcType.INTEGER)
public class StatusEnumTypeHandler implements TypeHandler<StatusEnum> {
@Override
public void setParameter(PreparedStatement preparedStatement, int i, StatusEnum StatusEnum, JdbcType jdbcType) throws SQLException {
preparedStatement.setInt(i, StatusEnum.getCode());
}
@Override
public StatusEnum getResult(ResultSet resultSet, String columnName) throws SQLException {
int code = resultSet.getInt(columnName);
return StatusEnum.getByCode(code);
}
@Override
public StatusEnum getResult(ResultSet resultSet, int columnIndex) throws SQLException {
int code = resultSet.getInt(columnIndex);
return StatusEnum.getByCode(code);
}
@Override
public StatusEnum getResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
int code = callableStatement.getInt(columnIndex);
return StatusEnum.getByCode(code);
}
}
Mapper.xml
<resultMap>
<result property="status" column="status" typeHandler="com.xxxx.typehandler.StatusEnumTypeHandler"/>
</resultMap>
总结
MyBatis通过自定义类型转换,实现int数据编码与java枚举类之间的转换。