본문 바로가기

Programming/iBatis

iBatis - 동적쿼리

JDBC를 사용해서 직접적으로 작동할 때 매우 공통적인 문제는 동적 SQL이다.

파라미터값 뿐만 아니라 파라미터와 칼럼이 모두 포함된 변경을 하는 SQL문에서 작업을 하는 것은 매우 어렵다.

전형적인 해결법은 조건적인 if-else문과 지겨운 문자열 연결 덩어리를 사용하는 것이다.

요구되는 결과는 종종 쿼리가 예제 객체와 유사한 객체를 찾기위해 빌드될수 있는 예제에 의해 쿼리된다.

SQL Map API는 어떤 맵핑된 statement요소에 적용될수 있는 상대적으로 훌륭한 해결법을 제공한다.

이것은 간단한 에제이다.

<select id="dynamicGetAccountList" cacheModel="account-cache" resultMap="account-result" >
    SELECT * FROM ACCOUNT
    <isGreaterThan prepend="and" property="id" compareValue="0">
        WHERE ACC_ID = #id#
    </isGreaterThan>
    ORDER BY ACC_LAST_NAME
</select>

위 예제에서 파라미터빈의 “id”프라퍼티의 상태에 의존해서 생성될수 있는 두가지 가능한 statement가 있다.

Case 1. 파라미터 > 0

SELECT * FROM ACCOUNT WHERE ACC_ID = ?

Case 2. 파라미터 <= 0

SELECT * FROM ACCOUNT

이처럼 동적쿼리를 사용하면 더욱 많은 statement에 대하여 유연하게 작업 할 수 있다.

 

바이너리 조건 요소

바이너리 조건적인 요소는 정적값또는 다른 프라퍼티값을 위한 프라퍼티값과 비교한다. 만약 결과가 true라면 몸체부분은 SQL쿼리에 포함된다.

바이너리 조건적인 속성:
  prepend – statement에 붙을 오버라이딩 가능한 SQL부분(옵션)
  property – 비교되는 프라퍼티(필수)
  compareProperty – 비교되는 다른 프라퍼티(필수 또는 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 의 속성 : prepend - the statement에 붙을 오버라이딩 가능한 SQL부분

  <isParameterPresent>

 파라미터 객체가 존재(Not Null) 하는지 체크 

  <isNotParameterPresent>

 파라미터 객체가 존재하지 않는지 (Null) 체크

 사용법 예제)

 <isNotParameterPresent prepend="AND">

     EMPLOYEE_TYPE = 'DEFAULT'

 </isNotParameterPresent>

 

Iterate

Collection을 반복하거나 리스트내 각각을 위해 몸체 부분을 반복한다.

Iterate 속성 :
  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 요소를 사용할 때 리스트 프로퍼티의 끝에 중괄호[]를 포함하는 것은 중요하다. 중괄호는 문자열처럼 리스트를 간단하기 출력함으로부터 파서를 유지하기 위해 리스트처럼 객체를 구별한다.


 

참조 : iBATIS-SqlMaps-2_ko(1).pdf

'Programming > iBatis' 카테고리의 다른 글

iBatis - selectKey (자동생성키)  (0) 2012.12.27
iBatis - Iterate  (1) 2012.11.16
QueryForList와 QueryForMap의 차이 예  (0) 2012.04.09
QueryForObject, List, Map  (0) 2012.04.09
iBatis - 동적쿼리  (0) 2012.04.06
Mapped Statements  (0) 2012.04.06