실무에서 SQL문을 작성하다 보면 동적인 쿼리문 작성을 작성해야 할 때가 많이 있다.
이때 지겹게 if~else if 문을 통해 아주 지저분한 소스 코드를 생성할 때가 왕왕 있게 마련이다.
이때 ibatis에서는 아주 깔금하게 구현할 수 있는 방법을 제공해 준다.
<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요소를 사용할 때 리스트 프로퍼티의 끝에 중괄호[]를 포함하는 것은 중요하다. 중괄호는 문자열처럼 리스트를 간단하게 출력함으로부터 파서를 유지하기 위해 리스트처럼 객체를 구별한다. |