출처:
http://narrowway.tistory.com/entry/iBatis%EB%8F%99%EC%A0%81-%EC%BF%BC%EB%A6%AC%EB%AC%B8-%EC%83%9D%EC%84%B1
<statement id="dynamicGetAccountList" resultMap="account-result">
select * from account
<dynamic prepend="WHERE">
<isNotNull prepend="AND" property="firstName">
(acc_first_name = #firstName#
<isNotNull prepend="OR" property="lastName">
acc_last_name = #lastName#
</isNotNull>
)
</isNotNull>
<isNotNull prepend="AND" property="emailAddress">
acc_email like #emailAddress#
</isNotNull>
<isGreaterThan prepend="AND" property="id" campareValue="0">
acc_id = #id#
</isGreaterThan>
</dynamic>
order by acc_last_name
</statement>
상황에 의존적인 위 동적 statement로 부터 각각 다른 16가지의 SQL문이 생성될 수 있다. if-else구조와 문자열 연결을 코딩하는 경우 수백라인이 필요할 수도 있다.
동적 statement를 사용하는 것은 몇몇 조건적인 태그를 추가하는 것처럼 간단하게 작성할 수 있다.
이러한 조건들에 대해 간단히 정리하면 아래와 같다.
바이너리 조건 요소-바이너리 조건 요소는 정적값 또는 다른 프로퍼티값을 위한 프로퍼티값과 비교한다. 만약 결과가 true라면 몸체부분의 SQL쿼리가 포함된다.
바이너리 조건 속성
prepend
|
Statement에 붙을 오버라이딩 가능한 SQL부분(옵션)
|
property
|
비교되는 property(필수)
|
compareProperty
|
비교되는 다른 property (필수 또는 compareValue)
|
compareValue
|
비교되는 값(필수 또는 compareProperty)
|
<isEqual>
|
프로퍼티가 값 또는 다른 프로퍼티가 같은지 체크
|
<isNotEqual>
|
프로퍼티가 값 또는 다른 프로퍼티가 같지 않은지 체크
|
<isGreaterThan>
|
프로퍼티가 값 또는 다른 프로퍼티 보다 큰지 체크
|
<isGreaterEqual>
|
프로퍼티가 값 또는 다른 프로퍼티 보다 크거나 같은지 체크
|
<isLessThan>
|
프로퍼티가 값 또는 다른 프로퍼티 보다 작은지 체크
|
<isLessEqual>
|
프로퍼티가 값 또는 다른 프로퍼티 보다 작거나 같은지 체크
사용법 예제)
<isLessEqual prepend="AND" property="age" compareValue="18">
ADOLESCENT = 'TRUE'
</isLessEqual>
|
단일 조건 요소-단일 조건 요소는 특수한 조건을 위해 프로퍼티의 상태를 체크한다.
prepend
|
statement에 붙을 오버라이딩 가능한 SQL부분(옵션)
|
property
|
체크하기 위한 프로퍼티(필수)
|
<isPropertyAvailable>
|
프로퍼티가 유효한지 체크
(이를 테면 파라미터의 프로퍼티이다.)
|
<isNotPropertyAvailable>
|
프로퍼티가 유효하지 않은지 체크
(이를 테면 파라미터의 프로퍼티가 아니다.)
|
<isNull>
|
프로퍼티가 null인지 체크
|
<isNotNull>
|
프로퍼티가 null이 아닌지 체크
|
<isEmpty>
|
Collection, 문자열 또는 String.valueOf() 프로퍼티가 null이거나 empty(“” or size() < 1)인지 체크
|
<isNotEmpty>
|
Collection, 문자열 또는 String.valueOf() 프로퍼티가 null 이아니거나 empty(“” or size() < 1)가 아닌지 체크
사용법 예제)
<isNotEmpty prepend="AND" property="firstName">
FIRST_NAME = #firstName#
</isNotEmpty>
|
다른 요소들
Parameter Present : 파라미터 객체가 존재하는지 체크
Parameter Present Attributes : prepend - the statement에 붙을 오버라이딩 가능한 SQL부분
<isParameterPresent>
|
파라미터 객체가 존재(not null)하는지 체크
|
<isNotParameterPresent>
|
파라미터 객체가 존재하지(null) 않는지 체크
사용법 예제)
<isNotParameterPresent prepend="AND">
EMPLOYEE_TYPE = 'DEFAULT'
</isNotParameterPresent>
|
Iterate : 이 태그는 Collection을 반복하거나 리스트내 각각을 위해 몸체 부분을 반복한다.
Iterate Attributes :
prepend - the statement에 붙을 오버라이딩 가능한 SQL부분 (옵션)
property - 반복되기 위한 java.util.List타입의 프로퍼티 (필수)
open - 반복의 전체를 열기 위한 문자열, 괄호를 위해 유용하다. (옵션)
close - 반복의 전체를 닫기 위한 문자열, 괄호를 위해 유용하다. (옵션)
conjunction - 각각의 반복 사이에 적용되기 위한 문자열, AND 그리고 OR을 위해 유용하다. (옵션)
<iterate>
|
java.util.List 타입의 프로퍼티 반복
사용법 예제)
<iterate prepend="AND" property="userNameList" open="(" close=")" conjunction="OR">
username = #userNameList[]#
</iterate>
주의:iterator요소를 사용할 때 리스트 프로퍼티의 끝에 중괄호[]를 포함하는 것은 중요하다. 중괄호는 문자열처럼 리스트를 간단하게 출력함으로부터 파서를 유지하기 위해 리스트처럼 객체를 구별한다.
|