[spring - mybatis tip] MyBatis(iBatis)에서 Java Enum code custom typeHandler 사용하기 :: 소림사의 홍반장!


요즘에야 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. 자바/참고소스 카테고리의 포스트를 톺아봅니다