[ibatis] parameterMap, resultMap 지원되는 jdbcType, javaType 정리

2019. 10. 7. 17:22 Java 관련/MyBatis, iBatis

[ibatis] parameterMap, resultMap 지원되는 jdbcType, javaType 정리


ibatis 프레임워크를 통해 java와 jdbc 간 파라미터와 결과값을 객체에 매핑하여 전달한다.


여기서 JAVA와 JDBC에서 사용하는 클래스에 미묘한 차이가 있어, 매핑시에 문제가 발생하기도 한다.


예를 들어, 아래의 경우에 에러가 발생한다.

 

<select id="getEmployee" parameterClass="java.lang.String" resultClass="Employee">
    SELECT ID, NAME, GRADE
    FROM EMPLOYEE
    WHERE ID = #id#
</select>


EMPLOYEE 테이블에서 조회된 데이터 컬럼 ID, NAME, GRADE 는 resultClass인 Employee 객체의 id, name, grade 변수에 각각 매핑되어 반환될 것이다.

여기서, GRADE 컬럼이 LONG 타입이고 Employee 객체의 grade 변수도 Long 이라고 가정할때, 서로 같은 타입이기에 정상적으로 매핑이 될거 라고 생각된다.

하지만, 실행 결과는 에러가 발생한다.


[ibatis] parameterClass, parameterMap 사용 기본


[ibatis] resultClass, resultMap 사용 기본



resultClass 와 매핑시에 java.lang.Long 으로 지원하고 long 으로는 지원되지 않기 때문에 매핑이되지 않는 것이다.

이렇게 resultClass에서 서로 호환되지 않을때, 매핑시키기 위해서는 resultMap 을 사용하여 각 컬럼의 타입을 지정해줘야 한다. (Parameter Class도 마찬가지다.)


[ibatis] parameterMap의 property 속성 옵션 정리


[ibatis] resultMap의 property 속성 옵션 정리



<resultMap  id="resultEmployee" class="Employee">
   <result property="id" column="id"/>
   <result property="name" column="name"/>
   <result property="grade" column="grade" javaType="java.lang.Long"/>
</resultMap>

<select id="getEmployee" parameterClass="java.lang.String" resultMap="resultEmployee">
    SELECT ID, NAME, GRADE
    FROM EMPLOYEE
    WHERE ID = #id#
</select>


위와 같이 resultMap 을 사용하여 결과를 매핑한 후, Long 타입인 grade 컬럼은 javaType="java.lang.Long" 을 설정함으로써, 결과 타입이 java.lang.Long으로 변환되어 매핑되게 된다.


아래에는 각 타입의 resultClass / parameterClass 의 지원 여부이다.

지원되지 않는 컬럼에 대해서는 resultMap / parameterMap 을 사용하여 위와 같이 직접 타입을 선언해줘야 한다.


 Java Type

JavaBean

/ Map property Mapping

ResultClass

/ ParameterClass 

Type 

boolean 

boolean 

java.lang.Boolean 

O

boolean 

byte

byte 

java.lang.Byte 

byte 

short 

short 

java.lang.Short 

O

short 

int 

int/integer 

java.lang.Integer 

int/integer 

long 

long 

java.lang.Long 

long 

float 

float 

java.lang.float 

float 

double 

double 

java.lang.Double 

double 

java.lang.String 

string 

java.util.Date 

date 

java.math.BigDecimal 

decimal 

* java.sql.Date 

N/A 

* java.sql.Time 

N/A 

* java.sql.Timestamp 

N/A 


* java.sql.date 타입은 사용하지 않는게 좋다. 대신 java.util.Date를 사용하자.


* 붉은 색으로 표시한 boolean,byte, short, int ,long, float, double 과 같은 원시타입은 iBATIS가 직접적으로 지원하지 못한다. 따라서 위의 컬럼들의 매핑을 위해서는 resultMap / parameterMap 을 통해 컬럼에서 javaType / jdbcType 에서 타입 변환이 필요하다.


* 특히 Boolean 은 JAVA에서는 true / false로 대입되고 JDBC에서는 1 / 0 으로 대입된다. 따라서 Boolean의 경우는 1 -> True , 0 -> False 로 변환을 위해 resultMap 에서 javaType을 선언해줘야 한다.



출처: https://hyeonstorage.tistory.com/288?category=549765 [개발이 하고 싶어요]