요즘에야 JPA - Hibernate를 많이 쓰는 추세라 이런 고민은 안하겠지만..
프로젝트는 spring - mybatis기반이고.. 객체 지향 설계를 하다보니 enum들은 많아지고
그렇다고 mybatis에서 기본 제공되는 EnumTypeHandler를 쓰자니 DB에 저장되는 값이 커지고..
뭐 그래서 암튼 enum 요소에 매핑되는 code값들을 db에 넣고 싶은데
이놈들을 코드값으로 넣고 빼고 하는건.. 아무래도 customizing이 필요함.
사용법은 아래처럼..
MediaEnumUtil.java
public class MediaEnumUtils {
public static <T extends Enum<T> & CodeEnum> T getCodeEnum(Class<T> enumClass, String code) {
return EnumSet.allOf(enumClass).stream()
.filter(type -> type.getCode().equals(code))
.findFirst()
.orElseGet(null);
}
}
CodeEnum.java
public interface CodeEnum extends Serializable{
public String getCode();
public Enum getEnumByCode(String code);
}
MediaTypeEnumHandler.java
public class MediaEnumTypeHandler<E extends Enum<E> & CodeEnum> extends BaseTypeHandler<E> {
private Class<E> type;
public MediaEnumTypeHandler(Class<E> type) {
if (type == null) throw new IllegalArgumentException("Type argument cannot be null");
this.type = type;
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
if (jdbcType == null) {
ps.setString(i, parameter.getCode());
} else {
ps.setObject(i, parameter.getCode(), jdbcType.TYPE_CODE);
}
}
public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
String s = rs.getString(columnName);
return MediaEnumUtils.getCodeEnum(type, s);
}
@Override
public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String s = rs.getString(columnIndex);
return MediaEnumUtils.getCodeEnum(type, s);
}
@Override
public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String s = cs.getString(columnIndex);
return MediaEnumUtils.getCodeEnum(type, s);
}
}
MediaResourceType.java
public enum MediaResourceType implements CodeEnum {
IMAGE("I") {
@Override public Enum getEnumByCode(String code) {
return IMAGE;
}
},
VIDEO("V") {
@Override public Enum getEnumByCode(String code) {
return VIDEO;
}
},
LIVE("L") {
@Override public Enum getEnumByCode(String code) {
return LIVE;
}
};
final private String code;
private MediaResourceType(String code) {
this.code = code;
}
public String getCode() {
return code;
}
}
sql.xml - 해당되는 컬럼에 typeHandler 사용한부분.
<resultMap id="resourceMap" type="com.tmoncorp.api.domain.entity.resource.MediaResource">
<id column="resource_seqno" property="resourceSeqno" jdbcType="BIGINT"/>
<result column="resource_tp" property="resourceType" jdbcType="VARCHAR" typeHandler="com.tmoncorp.api.domain.enums.MediaEnumTypeHandler"/>
<result column="tp_seqno" property="typeSeqno" jdbcType="INTEGER"/>
<result column="file_nm" property="fileName" jdbcType="VARCHAR"/>
<result column="org_file_nm" property="orgFileName" jdbcType="VARCHAR"/>
<result column="file_path" property="filePath" jdbcType="VARCHAR"/>
<result column="file_url" property="fileUrl" jdbcType="VARCHAR"/>
</resultMap>
MediaResource.java - Enum으로 변수 선언한 부분.
public class MediaResource implements Serializable {
protected Long resourceSeqno;
protected String orgFileName;
protected String fileName;
protected Integer fileSize;
protected Short width;
protected Short height;
protected String filePath;
protected MediaResourceType resourceType;
protected Integer typeSeqno;
protected String fileUrl;
// getter, setter
}
'Dev. 자바 > 참고소스' 카테고리의 다른 글
[jackson] json serialize 만 ignore 하고 싶다면? (1) | 2019.01.25 |
---|---|
[jackson] json serialize 시 상위클래스 필드 무시하기 (0) | 2019.01.15 |
[java 팁] split - pipeline(|)을 구분자로 문자열 쪼갤때 주의 (1) | 2014.06.11 |
[reflection] 클래스(Class) 의 필드명, 값 map으로 가져오기 (0) | 2014.05.08 |
[자바 소스] 폴더내 파일들을 모두 검색하여 원하는 결과 값 찾기 (web application log 검색) (0) | 2014.01.27 |