태그 : ibatis
이때 지겹게 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)가 아닌지 체크
사용법 예제) |
다른 요소들
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을 위해 유용하다. (옵션)
java.util.List 타입의 프로퍼티 반복
사용법 예제) <iterate prepend="AND" property="userNameList" open="(" close=")" conjunction="OR"> username = #userNameList[]# </iterate>
주의:iterator요소를 사용할 때 리스트 프로퍼티의 끝에 중괄호[]를 포함하는 것은 중요하다. 중괄호는 문자열처럼 리스트를 간단하게 출력함으로부터 파서를 유지하기 위해 리스트처럼 객체를 구별한다. |
# by | 2009/02/06 10:58 | JAVA | 트랙백 | 덧글(0)
# by | 2008/12/19 12:46 | JAVA | 트랙백 | 덧글(0)
iBATIS는 간단한 XML서술자를 사용해서 간단하게 자바빈즈를 SQL statement에 맵핑시킨다. 간단함(Simplicity)이란 다른 프레임워크와 객체관계맵핑툴에 비해 iBATIS의 가장 큰 장점이다. iBATIS Data Mapper를 사용하기 위해서 당신은 자바빈즈와 XML 그리고 SQL에 친숙할 필요가 있다. 여기엔 배워야 할것도 거의 없고 테이블을 조인하거나 복잡한 쿼리문을 수행하기 위해 필요한 복잡한 스키마도 없다. Data Mapper를 사용하면 당신은 실제 SQL문의 모든 기능을 가질수 있다. JDBC 로만 프로그래밍 할 때의 번거로움을 줄여주기 위해 재사용 모듈로 개발된 것인데 그 주요한 어려움을 ibatis 개발자 가이드에서 다음과 같이 정리하고 있다.
iBATIS의 주요기능
Data Mapper (com.ibatis.sqlmap.*)
개념
iBATIS Data Mapper API는 프로그래머에게 자바빈즈 객체를 PreparedStatement파라미터와 ResultSets으로 쉽게 맵핑할 수 있도록 한다. Data Mapper의 기본적인 생각은 간단함(simple)이다. 이는 자바코드의 20%를사용하여 JDBC기능의 80%를 제공하는 간단한 프레임워크라는 뜻이다.
작동원리
Data Mapper는 자바빈즈, Map구현, 원시래퍼타입(String, Integer…) 그리고 SQL문을 위한 XML문서를 맵핑하기 위한 XML서술자를 사용하는 매우 간단한 프레임워크를 제공한다.
다음은 생명주기에 대한 높은 레벨의 서술이다.
1) 파라미터(자바빈즈, Map 또는 원시래퍼)로써 객체를 제공한다. 파라미터 객체는 update문내에 입력값을 셋팅하기 위해 사용되거나 쿼리문의 where절을 셋팅하기 위해서 사용된다.
2) 맵핑된 statement을 실행한다. 이 단계는 마법이 일어나는곳이다. Data Mapper프레임워크는
PreparedStatement 인스턴스를 생성할것이고 제공된 파라미터객체를 사용해서 파라미터를 셋팅한다. 그리고 statement를 실행하고 ResultSet으로부터 결과 객체를 생성한다.
3) update의 경우에 영향을 미친 rows의 숫자를 반환한다. 조회문일경우에 한 개(single)의 객체 또는 컬렉션 객체를 반환한다. 파라미터처럼 결과 객체는 자바빈즈, Map 원시타입래퍼또는 XML이 될수 있다.
# by | 2008/11/06 16:13 | JAVA | 트랙백 | 덧글(0)
◀ 이전 페이지 다음 페이지 ▶