iBatis에서 Dynamic 기능중 iterate 노드가 있다.
예를 들어
"select * from tableName where idx in ('3','6','9')"
와 같이 조건절에 or절이 아닌 in 으로 쿼리를 구성할때 iBatis에서는 iterate 구문으로 구현이 가능하다.
먼저 파라메터클래스로 넘겨줄 값을 배열형식의 맵으로 생성한다.
ArrayList<String> idxList = new ArrayList<String>();
idxList.add("3");
idxList.add("6");
idxList.add("9");
....
idxList.add("3");
idxList.add("6");
idxList.add("9");
....
HashMap<String, ArrayList<String>> idxMap = new HashMap<String, ArrayList<String>>() ;
idxMap.put("idxArr", idxList);
idxMap.put("idxArr", idxList);
그리고 iBatis query.xml 파일에 아래처럼 작성한다.
<select id="getList" parameterClass="idxMap"
resultClass="dataVO">
select * from table
<dynamic prepend="where">
<isNotEmpty prepend="and" property="idxArr">
<iterate prepend=" idx in " property="idxArr" open="(" close=")" conjunction=",">
#idxArr[]#
</iterate>
</isNotEmpty>
</dynamic>
</select>
select * from table
<dynamic prepend="where">
<isNotEmpty prepend="and" property="idxArr">
<iterate prepend=" idx in " property="idxArr" open="(" close=")" conjunction=",">
#idxArr[]#
</iterate>
</isNotEmpty>
</dynamic>
</select>
그러면 iBatis에서 내부적으로
select * from table where idx='3' or idx='6' or idx='9'
이런 쿼리로 만들어서 실행하게 된다.
위에서 dynamic 의 prepend 속성으로 "where" 가 지정되어 있지만 하위 요소의 조건이 하나라도 만족하지 않으면 sql 문에 추가되지 않는다. 그리고 하위 요소로 isNotNull 태그에 prepend="and" 는 처음 true 가 되는 조건의 prepend 는 parent 인 dynamic 의 prepend 인 "where" 로 덮어진다.
$property명$ 로 작성된 영역은 #property명# 와 같이 prepared statement 의 바인드 변수로 처리되는 것이 아니라
SQL 문 자체에 텍스트가 replace 되어 처리됨에 유의한다.
'Java > iBatis' 카테고리의 다른 글
[iBatis] NUMBER(INT) 타입 컬럼 처리 시 cast 오류 발생 (1) | 2011.03.29 |
---|---|
[iBATIS] iBatis int 형 데이타 값이 NULL 일때 예외 발생 (1) | 2009.12.11 |