ETC

MyBatis에서 ENUM 다루기

버스는그만 2023. 9. 17. 15:10

Enum

  • 테스트용으로 간단하게 생성해본다.
public enum TestEnum {
    FIRST, SECOND
}

TypeHandler 커스텀

  • 마이바티스가 PreparedStatement에 파라미터를 설정하고 ResultSet에서 값을 가져올때마다 TypeHandler는 적절한 자바 타입의 값을 가져오기 위해 사용된다. 다음의 표는 디폴트 TypeHandlers를 설명한다.(공식문서)
  • @MappedJdbcTypes: Mybatis는 DB와 서버간의 데이터 타입 간의 매핑을 정의할 떄 사용
  • 제일 아래의 메서드에서 CallableStatement는 Mybatis에서 프로시저를 관리하는 역할이다.
@MappedJdbcTypes(JdbcType.VARCHAR)
public class TestTypeHandler extends BaseTypeHandler<TestEnum> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, TestEnum parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, parameter.name());
    }

    @Override
    public TestEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String value = rs.getString(columnName);
        if(Objects.isNull(value)) {
            return null;
        }
        return TestEnum.valueOf(value);
    }

    @Override
    public TestEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String value = rs.getString(columnIndex);
        if(Objects.isNull(value)) {
            return null;
        }
        return TestEnum.valueOf(value);
    }

    @Override
    public TestEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String value = cs.getString(columnIndex);
        if (value == null) {
            return null;
        }
        return TestEnum.valueOf(value);
    }
}

TypeHandler 등록(.yml)

mybatis:
  mapper-locations: classpath:/mapper/*-mapper.xml
  type-handlers-package: com.example.demo.test.typehandler
  • mybatis.type-handlers-package에 Typehandler가 있는 패키지를 등록해주면 된다.