목표: 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의 파라미터들이 의미하는 것은 다음과 같다.
Show All
Search
실제 업무에선 parameter로 map이 넘어가고, 그 map에 리스트를 담고, 그 리스트를 iterator 시켰어야 했다.
list를 넘겨야 할 곳에 속에 있는 map을 property로 준다던지.. map의 key값을 잘 못 준다던지.. 다양한 시행착오를 겪었다.
이런 방식으로 하나의 iterator에서 2개 이상의 다양한 변수를 반복시킬 수 있다.