[iBatis] iterate 사용법

프로그래밍/Framework 2009. 4. 13. 20:13 Posted by galad
    <statement id="CHECK_SUB_CONTENT_TYPE_FOR_DELETE" resultClass="java.lang.String">
        SELECT
            COUNT(*) TOTAL_COUNT
        FROM
            SUB_CONTENT_TYPE
        <iterate prepend="WHERE" property="deleteContentTypeList" open="("  conjunction="," close=")">
            CONTENT_TYPE IN #deleteContentTypeList[]#
        </iterate>
    </statement>

    <statement id="CHECK_SUB_CONTENT_TYPE_FOR_DELETE" resultClass="java.lang.String">
        SELECT
            COUNT(*) TOTAL_COUNT
        FROM
            SUB_CONTENT_TYPE
        <iterate prepend="WHERE CONTENT_TYPE IN " property="deleteContentTypeList" open="("  conjunction="," close=")">
            #deleteContentTypeList[]#
        </iterate>
    </statement>

    <statement id="CHECK_SUB_CONTENT_TYPE_FOR_DELETE" parameterClass="java.util.List" resultClass="java.lang.String">
        SELECT
            COUNT(*) TOTAL_COUNT
        FROM
            SUB_CONTENT_TYPE
        <dynamic prepend="WHERE">
            <iterate property="deleteContentTypeList" open="("  conjunction="," close=")">
                CONTENT_TYPE IN #deleteContentTypeList[]#
            </iterate>
        </dynamic>
    </statement>

버근지 뭔지 몰라도 위의 방식은 하나도 안된다. property속성을 쓰면 안되는건지...
근데 되는 사람들도 있는 것 같고..

    <statement id="CHECK_SUB_CONTENT_TYPE_FOR_DELETE" resultClass="java.lang.String">
        SELECT
            COUNT(*) TOTAL_COUNT
        FROM
            SUB_CONTENT_TYPE
        <dynamic prepend="WHERE">
            <iterate open="CONTENT_TYPE IN ("  close=")" conjunction="," >
                #[]#
            </iterate>
        </dynamic>
    </statement>

이것처럼 아예 property 속성을 없애고, list의 이름을 없이 하면 잘됨.

참고:http://lostsin.tistory.com/tag/iBATIS

sql의 xml설정은 다음과 같이 하고

     <delete id="deletes" >
          DELETE FROM users
          <dynamic prepend="WHERE id IN">
              <iterate open="(" conjunction="," close=")">
                  #[]#
              </iterate>
          </dynamic>
      </delete>


DAO는 다음과 같이 한다
    public int delete(Integer[] ids) {
        return getSqlMapClientTemplate().delete("users.deletes", ids);
    }

해당 쿼리는 <iterate> 구문에 의하여 WHERE id IN (1,2,3,4,5) 방식으로
값이 매핑되게 된다.


보너스1.
List<>를 사용하는 방법도 xml 쿼리 부분은 동일하다.

List<String> list = new ArrayList<String>(3);

list.add("1");

list.add("2");

list.add("3");

List objs = sqlMapClient.queryForList("select-test",list);




보너스2.
parameterClass="map" 을 사용할 땐

     WHERE

session_id IN

<iterate property="sessionIds" open="(" close=")" conjunction=",">

#key[]#

</iterate>

hash의 key 값으로 사용된 string을 지정해주면 된다 (?)

추가.
            HashMap map = new HashMap();
            map.put("deleteContentTypeList", deleteContentTypeList);
            map.put("updateId", updateId);
            map.put("updateTime", updateTime);
           
            this.update("contenttype.DELETE_CONTENT_TYPE", map);

    <statement id="DELETE_CONTENT_TYPE">
        UPDATE
            CONTENT_TYPE
        SET
              STATUS = 'D'
            , UPDATE_ID = #updateId#
            , UPDATE_TIME = #updateTime#
        <dynamic prepend="WHERE">
            <iterate property="deleteContentTypeList" open="CONTENT_TYPE IN (" close=")" conjunction=",">
                #deleteContentTypeList[]#
            </iterate>
        </dynamic>
    </statement>

이건 또 된다. map에 넣어서 넘겨주면 멀쩡히 잘 되는군...

# 추가
list 를 패러미터로 전달 시 iterate 태그에서 property 를 설정하면(map으로 넘겼을 떄 말고),
전달된 list 에서 해당 property 를 찾으려고 시도하는 것 같다.
<iterate> 태그에서 property 속성을 제거하면 정상적으로 작동한다.

<select id="selectSomething" parameterClass="list">
    // select something and use iterate
    <iterate> // iterate 태그 내 property 속성을 제거하라
        #someList[]#
    </iterate>
</select>