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

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

parameterMap의 property 속성 옵션 정리


ibatis에서 쿼리를 실행하기 위해 넘어오는 parameter를 정의하기 위한<parameterMap>을 명시한다.


[Java Web/MyBatis, iBatis] - [ibatis] parameterClass, parameterMap 사용 기본


1. <parameterMap> 의 <parameter> 옵션 값


<parameterMap id="parameterMapName" [class="com.comain.Product"]>

    <parameter property ="propertyName" [jdbcType="VARCHAR"] [javaType="string"]
                    [nullValue="-999999" [typeName="{REF of user-defined type}"/>

     </parameter>
</parameterMap>

빨간색으로 표시한 부분이 <parameter> 의 요소이며, [괄호] 로 둘러싼 부분은 옵션이다.

(1) property

- 파라미터 map의 property 속성은 mapping된 statement에 전달되는 파라미터 객체의 변수(get메소드) 이다.
- 따라서 전달 파라미터 객체에는 get메소드가 구현되어 있어야 매핑이 가능하다.

(2) jdbcType

- jdbcType 속성은 이 property에 의해 셋팅되는 파라미터의 jdbc 컬럼 타입을 명시적으로 정의하는데 사용된다. 몇몇의 JDBC 드라이버는 jdbcType 과 같은 명시적인 컬럼 형식 없이 타입을 확인할 수 없다.
- jdbc 에서 변환되어 넘어온 파라미터 타입의 경우는 jdbcType 을 이용하여 타입 명시를 해줘야 한다.
- jdbcType 은 컬럼이 null 이 가능할 때 사용한다. 
(오라클에서 jdbcType을 지정하지 않고 null 값이 들어오면 "Invalid column type" 에러가 발생한다.)

- 또한, Date 값 타입을 파라미터로 넘어올 때 사용한다.

(JAVA는 Date 타입이 java.util.Date 하나이지만, SQL 데이터베이스는 여러개의 Date 타입을 가지기에 명시적으로 지시하기 위하여 Date 타입이 사용될 때 jdbcType으로 지정한다.)


(3) javaType


- javaType 속성은 파라미터의 셋팅을 위해 JAVA Type을 명시적으로 정의하기 위해 사용된다. 

- 대게 이것은 자바빈즈 변수에서 파생되지만, Map과 XML 맵핑 같은 특정 맵핑은 프레임워크를 위한 타입을 제공하지 않는다.

- 만약 javaType이 셋팅되지 않고 프레임워크도 어떤 타입인지 구별할 수 없다면 타입은 객체로 간주될 것이다.


(4) typeName


- typeName 속성은 REF 타입이나 사용자 정의 타입을 명시하기 위해 사용된다.

- 만약 파라미터가 사용자 정의 타입이나 REF 타입을 가지지 않는다면, typeName 은 무시된다.


(5) nullValue


- nullValue는 parameter property의 값이 특정 값일 경우 NULL로 대체하기 위한 옵션이다.

- NULL 이 들어오면 특정 값으로 변환하는 것이 아닌!!!! 특정값이 들어오면 NULL 로 변환하는 것이다 헷갈리지 말자

- 이것은 특히 NULL 이 될 수 없는 타입 (int, double, float 등)의 값이 데이터베이스에 NULL 로 변환해야 되는 경우 유용하게 사용할 수 있다.


* parameter 속성 옵션 사용 예



<?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">

   <parameterMap id="insert-product-param" class="com.domain.Product">
       <parameter property ="id" jdbcType="NUMERIC" javaType="int" nullValue="-9999999"/>
       <parameter property ="description" jdbcType="VARCHAR" nullValue="NO_ENTRY" />
   </parameterMap>

    <statement id="insertProduct"  parameterMap="insert-product-param">
       INSERT INTO PRODUCT(PRD_ID, PRD_DESCRIPTION) VALUES(?,?);
    </statement>

</sqlMap>


위 예제에서 Product 객체의 id 와 description은 목록화 되는 순서대로 mapping된 statement인 insertProduct의 파라미터에 대체된다. "id"는 첫번째 "?" 에 적용되고 description은 두번째 "?"에 적용된다. 만약 순서가 반대라면 <parameterMap> 에서 <parameter>의 순서를 바꿔줘야 한다.


* <parameterMap> 을 다른 SQL Map XML 파일에서 참조하기 위해서는 namespace를 사용하여 접근하여야 한다.

ex> Product.insert-product-param


2. 인라인 Parameter Maps


<parameterMap> 을 사용하면 파라미터에 대한 선언이 자세하게 명시되지만, 너무 복잡하다.

statement에 파라미터를 인라인 시키면 파라미터 Maps를 위한 정의를 간단하게 하고 코드도 줄일 수 있다.


타입 선언은 다음과 같이 인라인 파라미터로 사용할 수 있다.


 

<statement id="insertProduct"  parameterClass="com.domain.Product">
       INSERT INTO PRODUCT(PRD_ID, PRD_DESCRIPTION) 
       VALUES(#id:NUMERIC##description:VARCHAR#);
</statement>



nullValue 의 인라인 파라미터 사용은 아래와 같다



  <statement id="insertProduct"  parameterClass="com.domain.Product">
     INSERT INTO PRODUCT(PRD_ID, PRD_DESCRIPTION) 
     VALUES(#id:NUMERIC:-999999##description:VARCHAR:NO_ENTRY#);
  </statement>


* 인라인 파라미터를 사용할 때 타입정의 없이 nullValue 를 사용할 수 없다. 순서대로 파싱하기 위해서 둘 다 명시해야 된다. 



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