상황에 의존적인 위 동적 statement로 부터 각각 다른 16가지의 SQL문이 생성될 수 있다. if-else구조와 문자열 연결을 코딩하는 경우 수백라인이 필요할 수도 있다. 동적 statement를 사용하는 것은 몇몇 조건적인 태그를 추가하는 것처럼 간단하게 작성할 수 있다.
이러한 조건들에 대해 간단히 정리하면 아래와 같다.
바이너리 조건 요소-바이너리 조건 요소는 정적값 또는 다른 프로퍼티값을 위한 프로퍼티값과 비교한다. 만약 결과가 true라면 몸체부분의 SQL쿼리가 포함된다.
바이너리 조건 속성
단일 조건 요소-단일 조건 요소는 특수한 조건을 위해 프로퍼티의 상태를 체크한다.
다른 요소들 Parameter Present : 파라미터 객체가 존재하는지 체크 Parameter Present Attributes : prepend - the statement에 붙을 오버라이딩 가능한 SQL부분
Iterate : 이 태그는 Collection을 반복하거나 리스트내 각각을 위해 몸체 부분을 반복한다. Iterate Attributes : prepend - the statement에 붙을 오버라이딩 가능한 SQL부분 (옵션) property - 반복되기 위한 java.util.List타입의 프로퍼티 (필수) open - 반복의 전체를 열기 위한 문자열, 괄호를 위해 유용하다. (옵션) close - 반복의 전체를 닫기 위한 문자열, 괄호를 위해 유용하다. (옵션) conjunction - 각각의 반복 사이에 적용되기 위한 문자열, AND 그리고 OR을 위해 유용하다. (옵션)
|
블로그의 모든 이미지는 별도의 표기가 되지 않는 한 구글이미지를 사용합니다
편의상 반말체를 사용하기도 합니다
배열을 파라메터로 받아서 처리할 경우가 생겨서 <iterate> 사용을 하려고 했는데 오류가 발생.
org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null]; error code [0];
--- The error occurred in hsmall/biz/event/EventMstDao.xml.
--- The error occurred while preparing the mapped statement for execution.
--- Check the EventMst.selectSmallFurniturePackageList.
--- Check the parameter map.
--- Cause: com.ibatis.sqlmap.client.SqlMapException: ParameterObject or property was not a Collection, Array or Iterator.; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in hsmall/biz/event/EventMstDao.xml.
--- The error occurred while preparing the mapped statement for execution.
--- Check the EventMst.selectSmallFurniturePackageList.
--- Check the parameter map.
--- Cause: com.ibatis.sqlmap.client.SqlMapException: ParameterObject or property was not a Collection, Array or Iterator.
...
요소를 잘 몰라서 삽질 좀 했다.
어떤 글에서는 ibatis bug 인 듯 싶다며, property 요소를 제거하고 사용하라는 말도 있었는데 property 속성은 필수인 듯 하다.
그 분은 특별히 어떠한 경우에 그렇게 사용해서 오류를 해결 했는지는 나도 모르겠지만..
파라메터가 잘못되었나 싶어서 HashMap 이나 List 로 parameterClass 를 받아서 처리하려고도 했었다.
결과는 같았다. 일단 결과는 둘째 치고, query 구문을 실행 조차 하지 않았으니까.
필수 요소와 옵션 요소에 대해서 잘 알고 사용해야 할 것 같다.
<isNotNull property="arr">
<iterate property="arr" open="where no in(" conjunction="," close=")">
#arr[]#
</iterate>
</isNotNull>
<isNull property="arr">
....