JAVA

mybatis bean 생성시 enum 이용(typeHandler)

질주하는구 2020. 9. 4. 15:58

mybatis연동 시 상태값을 enum으로 설정 시 작업 하는 방법 sql-mapper-config.xml 에 타입 핸들러 설정 및 사용하고자 하는 bean의 데이터를 설정

package utils;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import egovframework.comm.TempVO.Status;

public class StatusEnumTypeHandler implements TypeHandler{
	
	private static final Logger log = LoggerFactory.getLogger(StatusEnumTypeHandler.class);

	@Override
	public void setParameter(PreparedStatement ps, int i, Status parameter,
			JdbcType jdbcType) throws SQLException {
		 ps.setInt(i, parameter.getCode());//<-데이터 가공
	}

	@Override
	public Status getResult(ResultSet rs, String columnName)
			throws SQLException {
		int code = rs.getInt(columnName);
        return Status.getEnumByCode(code);//<-데이터 가공
	}

	@Override
	public Status getResult(ResultSet rs, int columnIndex)
			throws SQLException {
		int code = rs.getInt(columnIndex);
		return Status.getEnumByCode(code);//<-데이터 가공
	}

	@Override
	public Status getResult(CallableStatement cs, int columnIndex)
			throws SQLException {
		int code = cs.getInt(columnIndex);
		return Status.getEnumByCode(code);//<-데이터 가공
	}

}

bean에 해당하는 프로퍼티 생성 후 사용

package egovframework.comm;

import java.io.Serializable;
import java.util.Date;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

public class TempVO implements Serializable {
	private static final long serialVersionUID = 1L;
	
	/** 전송상태 */
	private Status status;
	
	public SendHistVO() {}
	
	public SendHistVO(Status status) {
		this.status = status;
	}
	
	public Status getStatus() {
		return status;
	}

	public void setStatus(Status status) {
		this.status = status;
	}
	
	public enum Status {
		FAILED(0, "실패"), WAITING(1, "대기"), RESERVATION(2, "예약"), SUCCESS(9, "성공");
		
		private int code;
		
		private String text;
		
		private Status(int code, String text) {
			this.code = code;
			this.text = text;
		}

		@JsonValue
		public int getCode() {
			return code; //디비에 저장할때 사용
		}

		public String getText() {
			return text;
		}
		
		//디비에서 데이터 가지고 올때 사용
		@JsonCreator
		public static Status getEnumByCode(int code) {
			Status[] values = values();
			for(Status value : values) {
				if(value.getCode() == code) {
					return value;
				}
			}
			return null;
		}
	}
}

TempVO 의 status 값을 mybatis에서 사용하는 경우 StatusEnumTypeHandler 의 메소드를 이용해서 데이터를 가공 해서 가지고 오게 동작 하게 됩니다.

반응형