[iBatis] queryForMap() 사용법

프로그래밍/Framework 2009. 4. 21. 18:57 Posted by galad
참조: http://openframework.or.kr/Wiki.jsp?page=QueryForMapExample

<resultMap id="AccountResult" class="Account">
  <result property="id" column="ACC_ID"/>
  <result property="firstName" column="ACC_FIRST_NAME"/>
  <result property="lastName" column="ACC_LAST_NAME"/>
  <result property="emailAddress" column="ACC_EMAIL"/>
</resultMap>


<select id=
"selectAllAccounts" resultMap="AccountResult">
  select * from ACCOUNT
</select>

위와 같은 iBatis sql문에 대해 다음과 같이 쿼리.

queryForMap("selectAllAccounts", null, "id");

파라미터는 null이고, 쿼리 결과를 Map으로 받는데 키는 id에 대응하는 ACC_ID 칼럼값이 된다.
테이블에서는 모든 값(칼럼)을 가져와서 Accout 클래스형으로 값을 저장.
즉, key=ACC_ID칼럼값, value=Account클래스의 형태의 Map이 된다.

queryForMap("selectAllAccounts", null, "id""emailAddress");

역시 파라미터는 null이고 결과를 Map으로 받는데, 키는 id에 대응하는 ACC_ID 칼럼값이며,
값은 emailAddress에 대응하는 ACC_EMAIL칼럼값만 가져온다.
즉, key=ACC_ID칼럼값, value=ACC_EMAIL칼럼값의 형태의 Map이 된다.

두번째 사용법.

<statement id="getContentType" resultClass="org.apache.commons.collections.SequencedHashMap">
    SELECT * FROM OMPDBA.CONTENT_TYPE WHERE STATUS = 'U'
</statement>

위와 같이 resultMap이 없는 경우.

queryForMap(sqlId, paramMap, keyColumn, valueColumn);

파라미터명으로 써있는데로, 실제 칼럼명 자체를 파라미터로 넘겨준다.

중요.
    <statement id="SELECT_SERVICE_TYPE" resultClass="java.util.HashMap">
        SELECT
            a.SERVICE_TYPE, b.SERVICE_TYPE_NAME
        FROM
            CONTENT_SERVICE_SYSTEM a, SERVICE_TYPE b
        WHERE
            a.SERVICE_TYPE = b.SERVICE_TYPE
            AND a.CONTENT_TYPE = #PARAM0#
            AND b.STATUS = 'U'
        ORDER BY
            b.DISPLAY_ORDER ASC
    </statement>


위의 두번째 사용법에서 resultClass에 주목.
queryForMap은 결과를 map으로 돌려주는 것이므로, 위의 쿼리 결과는 SequencedHashMap이 Map안에 들어간 형태로 나와버린다?
이건 아닌 듯. resultClass 속성을 삭제하면 결과가 String으로 나와버림.
원하는 key-value형태로 나오지 않음.
java.util.HashMap(Map아님. interface라 안되는듯)으로 하면, ORDER BY 해도 순서가 제멋대로.
org.apache.commons.collections.map.ListOrderedMap로 해도 순서가 제멋대로.
즉, 키-값으로 넣을 수 있는 것이 반드시 resultClass 또는 resultMap 속성에 와야 하지만, 그렇다고 순서를 보장하진 않음.(Map답네..)