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

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

resultMap의 property 속성 옵션 정리


ibatis에서 쿼리를 통해 실행된 결과를 리턴하는 타입을 정의하기 위한 <resultMap>을 명시한다.


[Java Web/MyBatis, iBatis] - [ibatis] resultClass, resultMap 사용 기본


1. <resultMap>의 <result> 옵션 값


   <resultMap id="resultMapName" class="some.domain.Class" [extends="parent-resultMap"]>
       <result property="propertyName" column="COLUMN_NAME"
                 [columnIndex="1"] [javaType="int"] [jdbcType="NUMERIC"]
                [nullValue="-999999"] [select="someOtherSatement"] />

    </resultMap>
    
빨간색으로 표시한 부분이 속성 값이며, [괄호]로 둘러싼 부분은 옵션이다.

<resultMap> 은 자신의 id 를 가지며, class 에서 반환할 클래스의 형을 명시한다. 이 클래스는 아래 <result>의 속성들으 포함하여, result 반환 객체를 매핑하고 생성한다.
extends 옵션은 다른 resultMap의 이름을 명시하며, 이 명시된 resultMap의 <result> 프로퍼티들을 모두 포함한다. 이것은 자바의 상속을 이용해 확장하는 것과 같다.

resultMap의 <result> 프로퍼티 들은 자바 객체의 변수로 선언되어 잇어야 하며, get/set 메소드가 설정되어 있어야 한다.

(1) property

- result map의 property 속성은 mapping statement에 의해 반환되는 result 객체의 자바빈즈 프로퍼티(get메소드) 이름이다.

(2) column

- column 속성 값은 결과 쿼리 결과 ResultSet 내의 칼럼의 이름이다.

(3) columnIndex

- 옵션값으로서 columnIndex 는 ResultSet 내의 컬럼의 인덱스이다.

(4) jdbcType

- jdbcType 속성은 ResultSet 컬럼의 데이터베이스 컬럼 타입을 명시적으로 정의하는데 사용한다.
- Date 타입 같은 경우에 명시적으로 선언할 때 필요하다. JAVA는 하나의 Date 타입을 가지지만, SQL 데이터베이스는 여러 타입의 Date를 가진다. 이것을 jdbcType 을 통해 명시적으로 지시할 수 있다.
- String 타입은 VARCHAR, CHAR 또는 CLOB에 의해 생성될 것이다. 이런 경우  jdbcType을 정의한다.

(5) javaType

- javaType 속성은 객체에 셋팅되는 변수 타입을 명시적으로 정의하기 위해 사용된다.
- Map과 XML mapping과 같은 매핑은 프레임워크를 위한 타입을 제공할 수 없다.
- 만약 javaType이 셋팅되지 않고 프레임워크가 그 타입을 구분할 수 없다면 타입은 객체로 가정되어 처리된다.

(6) nullValue

- nullValue 속성은 데이터베이스의 NULL 값 반환을 대신하여 사용하기 위해 값을 정의한다.
- ResultSet으로 부터 결과가 NULL이 나온 변수는 nullValue 를 통해 NULL 대신 다른 값으로 셋팅한다.

(7) select

- select 속성은 객체 사이의 관계를 서술하고 자동적으로 복합 프로퍼티 타입을 로드하는데 사용된다.
- statement의 프로퍼티 값은 다른 매핑된 statement의 이름이 되야 한다.
- column 값은 파라미터 처럼 정의되어 실행되는 statement에 전달된다.
    
    <resultMap id=”get-category-result” class=”com.ibatis.example.Category”>
          <result property=”id” column=”CAT_ID”/>
          <result property=”description” column=”CAT_DESCRIPTION”/>
          <result property=”productList” column=”CAT_ID” select=” getProductsByCatId”/>
</resultMap>

위와 같은 경우 Category 클래스의 productList 변수는 "getProductsByCatId" 라는 id 의 <statement>가 실행된 결과 값을 저장한다. column 으로 지정된 "CAT_ID" 는 <statement> "getProductsByCatId" 를 실행하기 위한 파라미터 인자로 사용된다.

"getProductsByCatId"의 파라미터가 여러개 필요할 경우는 column="{column1, column2,..}" 와 같이 나열하면 되며,
parameter에 이름 지정이 필요할 경우는 column ={"key1=column1, key2=column2..}" 의 형태로 나열하면 된다.


* <resultMap> 속성 값 사용 예



<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
    "http://www.ibatis.com/dtd/sql-map-2.dtd">

    
<sqlMap namespace="Product">

   <resultMap id="getProduct" class="com.ibatis.example.Product">
       <result property="prdid" column="PRD_ID"/>
    </resultMap>
    
    <resultMap id="get-category-result" class="com.ibatis.example.Category" extends="getProduct">
       <result property="catid" column="CAT_ID" columnIndex="1" 
                    javaType="int" jdbcType="NUMERIC" nullValue="-999999" />

        <result property="prdnum" column="CAT_ID" select="getProductsByCatId"/>
    </resultMap>
    
     <statement id="selectCategory"  resultMAP="get-category-result">
       select * from CATEGORY
    </statement>
    
    <statement id="getProductsByCatId"  parameterClass="java.lang.String" resultMAP="int">
       select prdnum from PRODUCT where CAT_ID = #cat_id#
    </statement>

</sqlMap>


<resultMap> 은 get-category-result 를 id로 가지며,  com.ibatis.example.Category 를 리턴 객체로 한다.

이 <resultMap> 은 id="getProduct" <resultMap>을 상속하여, "getProduct" 의 프로퍼티들을 포함한다.


"getProduct" <resultMap> 외의 추가적으로 "catid" 와 "productList" 변수를 Category 객체에 셋팅한다.

"catid" 는 데이터베이스 컬럼 "CAT_ID" 에 매핑되며 인덱스는 "1"로 지정된다.

데이터 베이스에서 조회되는 jdbcType 은 "NUMERIC"이며, 이것을 javaType 인 "int" 형으로 변환하여 객체의 변수에 셋팅한다.

"productList"는 <statement id="getProductByCatId"> 쿼리의 결과 값을 셋팅한다. "getProductByCatId" 를 실행하기 위해서 column 값인 "CAT_ID" 가 파라미터로 넘겨준다.



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