Search
🧺

[iBatis] 하나의 Iterator에서 다중 property를 활용하고 싶을 때

작성일
2020/10/12
수정일
카테고리
데이터베이스
태그
Ibatis
목표: Ibatis의 하나의 iterator블록에서 두개 이상의 property를 활용하는 방안을 알아본다.
회사업무를 보다가 Ibatis 쿼리에서 하나의 iterator을 통해 두 개의 변수를 반복해야 할 필요성이 생겼다. 하지만 iBatis Iterator는 하나의 property만을 받을 수 있다...!
방법을 고민하다 List에 Map을 담고, 해당 List를 iterate 시키면서 map의 Key로 2개의 데이터를 집어놓고 활용해야겠다는 방안을 떠올렸다. 2개의 인덱스를 가진 Array들의 List 이지만, iBatis에서 인덱스를 활용할 수 없으므로 Map을 대신 활용하는 트릭 '_'
parameter를 다음과 같이 전달한다. 변수명과 비즈니스 로직은 변경하였다.
//iterator용 list를 생성한다 List<Map<String,String>> twoParamsMapList = new ArrayList<Map<String,String>>(); //내가 활용해야 할 두개의 변수들을 준비한다. String[] firstProperties = request.getFirstProperties(); String[] secondProperties = request.getSecondProperties(); //map에 KEY, VALUE로 값을 담는다. 해당 맵을 List에 담아준다. for (int i = 0; i < firstProperties.length; i++) { HashMap<String, String> twoParamsMap= new HashMap<String, String>(); twoParamsMap.put("FIRST", firstProperties[i]); twoParamsMap.put("SECOND", secondProperties[i]); twoParamsMapList.add(twoParamsMap); } param.put("LIST_FOR_ITERATING_TWO_PROPERTY", twoParamsMapList);
Java
복사
iBatis에선 다음과 같이 작성하였다.
<select id="C21_BL_List_Dao.selectBLList" parameterClass="java.util.List" resultClass="java.util.HashMap"> SELECT * FROM Atable a <isNotEmpty property="LIST_FOR_ITERATING_TWO_PROPERTY"> <iterate prepend="WHERE a.ID IN " property="LIST_FOR_ITERATING_TWO_PROPERTY" open="(" close=")" conjunction="," > #twoParamsMapList[].FIRST#, $twoParamsMapList[].SECOND$, </iterate> <isNotEmpry> <select/>
XML
복사
참고로 iterator의 파라미터들이 의미하는 것은 다음과 같다.
Search
iterator parameters
name
mean
자료구조 명(Array, List)
반복이 시작되기 전 들어갈 문장(prepend 뒤)
반복이 끝난 후 들어갈 문장
반복 사이사이에 들어갈 문장
실제 업무에선 parameter로 map이 넘어가고, 그 map에 리스트를 담고, 그 리스트를 iterator 시켰어야 했다.
list를 넘겨야 할 곳에 속에 있는 map을 property로 준다던지.. map의 key값을 잘 못 준다던지.. 다양한 시행착오를 겪었다.
이런 방식으로 하나의 iterator에서 2개 이상의 다양한 변수를 반복시킬 수 있다.