http://hyeonstorage.tistory.com/288
[ibatis] parameterMap, resultMap 지원되는 jdbcType, javaType 정리
ibatis 프레임워크를 통해 java와 jdbc 간 파라미터와 결과값을 객체에 매핑하여 전달한다.
여기서 JAVA와 JDBC에서 사용하는 클래스에 미묘한 차이가 있어, 매핑시에 문제가 발생하기도 한다.
예를 들어, 아래의 경우에 에러가 발생한다.
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 속성 옵션 정리
<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 | O | X | boolean |
java.lang.Boolean | O | O | boolean |
byte | O | X | byte |
java.lang.Byte | O | O | byte |
short | O | X | short |
java.lang.Short | O | O | short |
int | O | X | int/integer |
java.lang.Integer | O | O | int/integer |
long | O | X | long |
java.lang.Long | O | O | long |
float | O | X | float |
java.lang.float | O | O | float |
double | O | X | double |
java.lang.Double | O | O | double |
java.lang.String | O | O | string |
java.util.Date | O | O | date |
java.math.BigDecimal | O | O | decimal |
|
|
|
|
* java.sql.Time | O | O | N/A |
* java.sql.Timestamp | O | O | 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을 선언해줘야 한다.
'Web > 스프링' 카테고리의 다른 글
[Spring] sitemesh 설정하기 (0) | 2017.03.15 |
---|---|
윈도우 스프링개발환경 STS 설치 (0) | 2017.03.09 |
VO, DTO의 차이 (0) | 2017.02.03 |
String, StringBuffer, StringBuilder 차이점과 장단점 (0) | 2016.11.15 |
템플릿 메소드 패턴과 팩토리 메소드 패턴 (0) | 2016.07.27 |
댓글