Mybatis ENUM 사용법
Mybatis에는 타입 핸들러가 있어서 기본적으로 EnumTypeHandler와 EnumOrdinalTypeHandler를 제공하고 있다.
EnumTypeHandler는 varchar 타입으로 컨버트 해주고 EnumOrdinalTypeHandler는 NUMERIC or DOUBLE으로 변경해준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| import static java.util.stream.Collectors.toMap;
import java.util.Map; import java.util.Objects; import java.util.stream.Stream; import lombok.Getter; import lombok.extern.slf4j.Slf4j;
@Slf4j public enum SyncNyType {
SYNC_NO("N", "동기화 안됨"), SYNC_COMPLETE("Y", "동기화 완료"), SYNC_ERROR("E", "동기화 에러");
private static final Map<String, SyncNyType> stringToEnum = Stream.of(values()).collect(toMap(SyncNyType::getCode, e -> e));
@Getter private String code; private String description;
SyncNyType(String code, String description) { this.code = code; this.description = description; }
public static SyncNyType fromString(String symbol) { SyncNyType syncNyType = stringToEnum.get(symbol); if (Objects.isNull(syncNyType)) { log.error("잘못된 동기화 타입입니다. SyncNy = {}", symbol); throw new IllegalArgumentException("잘못된 동기화 타입입니다."); } return syncNyType; }
}
|
위처럼 타입에 벨류 값이 DB에 코드가 아닌경우에는 TypeHandler를 통해서 처리 하면 된다
1 2 3 4 5
| public interface CodeEnum { String getCode(); }
|
먼저 CodeEnum 인터페이스를 만들고
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import kr.co.parkingcloud.local.commons.model.CodeEnum; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.TypeException; import org.apache.ibatis.type.TypeHandler;
public abstract class CodeEnumTypeHandler<E extends Enum<E>> implements TypeHandler<CodeEnum> {
private Class<E> type;
public CodeEnumTypeHandler(Class<E> type) { this.type = type; }
@Override public void setParameter(PreparedStatement ps, int i, CodeEnum parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, parameter.getCode()); }
@Override public CodeEnum getResult(ResultSet rs, String columnName) throws SQLException { String code = rs.getString(columnName); return getCodeEnum(code); }
@Override public CodeEnum getResult(ResultSet rs, int columnIndex) throws SQLException { String code = rs.getString(columnIndex); return getCodeEnum(code); }
@Override public CodeEnum getResult(CallableStatement cs, int columnIndex) throws SQLException { String code = cs.getString(columnIndex); return getCodeEnum(code); }
private CodeEnum getCodeEnum(String code) { try { CodeEnum[] enumConstants = (CodeEnum[]) type.getEnumConstants(); for (CodeEnum codeNum : enumConstants) { if (codeNum.getCode().equals(code)) { return codeNum; } } return null; } catch (Exception e) { throw new TypeException("Can't make enum object '" + type + "'", e); } } }
|
위와 같이 타입 핸들러를 만들어 준다.
그다음에 위에 SyncNyType 을 CodeEnum을 상속 받게 하면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| import static java.util.stream.Collectors.toMap;
import java.util.Map; import java.util.Objects; import java.util.stream.Stream; import lombok.Getter; import lombok.extern.slf4j.Slf4j;
@Slf4j public enum SyncNyType implements CodeEnum {
SYNC_NO("N", "동기화 안됨"), SYNC_COMPLETE("Y", "동기화 완료"), SYNC_ERROR("E", "동기화 에러");
private static final Map<String, SyncNyType> stringToEnum = Stream.of(values()).collect(toMap(SyncNyType::getCode, e -> e));
@Getter private String code; private String description;
SyncNyType(String code, String description) { this.code = code; this.description = description; }
public static SyncNyType fromString(String symbol) { SyncNyType syncNyType = stringToEnum.get(symbol); if (Objects.isNull(syncNyType)) { log.error("잘못된 동기화 타입입니다. SyncNy = {}", symbol); throw new IllegalArgumentException("잘못된 동기화 타입입니다."); } return syncNyType; }
}
|
참조