Framework/iBatis
iBatis - iterate 태그로 동적 Query를 생성해 보자
louis.dev
2010. 10. 6. 13:44
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);
위와 같이 HashMap에 들어있는 list는 iterate의 property 속성을 통해 List를 가져 옵니다. ##사이는 HashMap에 put했던 list이름을 넣어주셔야 작동합니다.
또한 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이름을 넣어주셔야 작동합니다.