iterate의 사용예 (ibatis)
xml에서 아래와 같은 구문을 만났다. 무엇을 의미하고 어떻게 사용하는가?
<iterate property="pkValList" conjunction="AND" prepend="AND">
<![CDATA[
( B.APPR_RELA_PHSI_PK_NM = #pkValList[].apprRelaPhsiPkNm#
AND B.APPR_RELA_PK_VAL = #pkValList[].apprRelaPkVal#)
]]>
</iterate>
우선 각 옵션이 어떤 기능을 하는지 살펴본다.
ㅁ iterate의 옵션
ㅇ iterate
- 해당객체가 종료될때까지 반복 됩니다.
ㅇ property=pkValList
- pkValList는 배열변수 입니다.
- 여기서는 pkValist[] 배열 안에 있는 apprRelaPhsiPkNm 속성과, apprRelaPkVal 속성을 사용하고 있다.
ㅇ open=”(“
- iterate 쿼리 시작부분에 들어갈 기호를 ( 로 설정
ㅇ close=”)”
- iterate 쿼리가 끝날 때 들어갈 기호를 )로 설정
위 open, close의 결과 예는 아래와 같다.
SELECT * FROM xxx
where ( pkValList = ? and pkValList = ? and pkValList = ? )
ㅇ conjunction="AND"
- iterate가 종료되면 그 뒤에 추가할 식을 입력합니다.
ㅇ prepend="AND" [i]
- iterate 수행시 앞에 자동으로 AND를 붙여준다.
위 옵션을 넣어 쿼리문 수행시 어떤 결과가 나올까?
ㅁ 쿼리문 수행
실제 쿼리문이 수행되면 각 파라미터 값은 다음과 같다.
AND (
B.APPR_RELA_PHSI_PK_NM = ?
AND B.APPR_RELA_PK_VAL = ?
)
AND (B.APPR_RELA_PHSI_PK_NM = smgSn ANDB.APPR_RELA_PK_VAL = 26 )
AND (B.APPR_RELA_PHSI_PK_NM = rearchSn AND B.APPR_RELA_PK_VAL = 28 )
AND (B.APPR_RELA_PHSI_PK_NM = foreignSn AND B.APPR_RELA_PK_VAL = 30 )
위 파라미터 배열값을 어떻게 해서 넘어오는 걸까?
ㅁ iterate에 배열값 전달하기
Service.java
객체 배열을 만들고 그 안의 각각의 속성에 for 문을 돌려 내용을 add한다.
List<AprPkModel> pkValList = new ArrayList< AprPkModel >();
for(int j=0; j<pkList.size(); j++) {
...
AprPkModel model = new AprPkModel ();
model.setAprPkNm(divdList.get(i).getApprBusiDivdPkPhsiNm());
model.setAprPkVal(pkList.get(j).getApprRelaPkVal());
pkValList.add(model);
...
}
pkValist에 내용이 있다면 map에 에 pkValList 추가해준다.
그리고 DAO에 해당 map을 parameter로 넘겨준다.
if(pkValList != null && pkValList.size() > 0) {
HashMap resultMap = new HashMap();
resultMap.put("pkValList", pkValList);
return aprDAO.selectInformationList(resultMap);
}
DAO.java
받은 HashMap을 해당 XML 호출하여 parameter로 넘긴다.
public List selectInformationList(HashMap paramMap) throws Exception {
return sqlMapClient.queryForList("common.apv.selectInformationListByMap", paramMap);
}
aprSql.xml
받아온 배열을 아래처럼 iterate에서 #pkValList[].속성값# 으로 사용할 수 있다.
<select id="selectInformationListByMap" parameterClass="java.util.HashMap" resultClass="aprModel">
<![CDATA[
SELECT [...]
FROM TEST
WHERE 1=1
AND B_SN = #B_SN#
]]>
<iterate property="pkValList" conjunction="AND" prepend="AND">
<![CDATA[
(B.APPR_RELA_PHSI_PK_NM = #pkValList[].apprRelaPhsiPkNm#
AND B.APPR_RELA_PK_VAL = #pkValList[].apprRelaPkVal#)
]]>
</iterate>
</select>
미주
[i] <dynamic prepend="WHERE">의 경우 뒤에서 첫번째로 쓰이는 prepend는 처음에 자동으로 삭제된다. 그래서 WHERE 뒤에 바로 AND가 나와 오류가 나는 것을 막아준다.
예) 아래의 첫번째 빨간 and prepend구문은 dynamic 구문 뒤에 첫번째이기에 자동으로 삭제된다. 두번째 파란색 and prepend는 삭제되지 않는다.
<dynamic prepend="WHERE">
<isNotEmpty property="bcompid" prepend="and">
BCOMPID = #bcompid#
</isNotEmpty>
<isNotEmpty property="pass" prepend="and" >
PWD = #pass#
</isNotEmpty>
</dynamic>
참고로 <dynamic prepend="WHERE">의 prepend인 WHERE 는 무조건 입력된다.