iBatis - iterate 태그로 동적 Query를 생성해 보자

Published on: 2010. 10. 6. 13:44 by louis.dev
Query문 중 가끔 동적으로 어떠한 쿼리를 생성해야 할 경우가 있습니다.. 
예를 들면 어떠한 리스트에 있는 값을 통해 쿼리문을 생성한다던지 하는 경우 iBatis에서는 iterate 태그로 for문과 같은 역할을 하여 동적 쿼리를 생성 할 수 있습니다.

<select id="getData" parameterClass="java.util.List" resultClass="int">
	SELECT
		count(0)
	FROM data_tb
	<iterate prepend="WHERE id IN" open="(" close=")" conjunction="," >
        	#[]#
     	</iterate>
</select>

위와 같이 parameterClass를 java의 List형태로 전달해 주면 동적쿼리를 생성할수 있습니다. 만약 list에 1,2,3,4 의 데이터가 들어가 있으면 결과적으로
다음과 같은 쿼리가 실행되는 것과 같습니다.
<select id="getData" parameterClass="java.util.List" resultClass="int">
	SELECT
		count(0)
	FROM data_tb
	WHERE id IN (1,2,3,4)
</select>
이렇게  iterate를 사용하여 동적으로 쿼리문을 생성할 수 있습니다.

또한 parameterClass가 list형태가 아닌 Map이 List를 가지고 있는 형태도 iterate의 property 속성을 통해 접근할 수 있습니다.
만약 HashMap에 paramList라는 이름으로 list형이 들어가 있다고 가정하면
예)
 HashMap<String, Object> paramMap = new HashMap<String, Object>();
List<Integer> paramList = new ArrayList<Integer>();
paramMap.put("paramList", paramList);
<select id="getData" parameterClass="HashMap" resultMap="myResult">
	SELECT
		*
	FROM data_tb
	<iterate property="paramList" prepend="WHERE id IN" open="(" close=")" conjunction="," >
                #paramList[]#
     	</iterate>
 </select>

위와 같이 HashMap에 들어있는 list는 iterate의 property 속성을 통해 List를 가져 옵니다. ##사이는 HashMap에 put했던 list이름을 넣어주셔야 작동합니다.