본문 바로가기

DB/iBatis

The SqlMap API

The SqlMap API
JavaBean에 대해서 이해하고 있다면, iBaits의 API를 확인해 볼 준비가 된 것이다. SqlMapClient 인터페이스는 30개가 넘는 메소드가 있다.

1. The queryForObject() methods
이 메소드는 데이터베이스로 부터 자바 객체로 데이터를 가져오는 메소드이다. 이메소드는 2개의 내용이 있다.
■ Object queryForObject(String id, Object parameter) throws SQLException;
■ Object queryForObject(String id, Object parameter, Object result) throws SQLException;

첫번째 버젼은 가장 많이 사용되는 것이다. 그리고 Object를 반환하며, 그것은 기본 생성자가 필요하다. 기본 생성자가 존재하지 않는다면, runtime 예외가 발생하게 된다.

두번째는 반환값을 미리 전달하는 것이다. 이것은 객체를 생성한 후에 그 값을 전달하도록 하는 것이다. 두번째 방법은 객체를 쉽게 생성하지 못하는 상황에서 매우 유용한 메소드이다. 즉, 기본생성자가 없을경우 생성자를 통해서 객체를 생성하고 전달하면 된다.

가금 결과 객체가 단일 객체가 아닌경우 예외를 발생시킨다. 왜냐하면 이 메소드는 오직 한개의 로만을 반환할 수 있게 구현되어 있기 때문이다.

2. The queryForList() methods
이 메소드는 List를 반환한다.  이것역시 2개의 버젼을 가지고 있다.
■ List queryForList(String id, Object parameter) throws SQLException;
■ List queryForList(String id, Object parameter, int skip, int max) throws SQLException;

첫번째 메소드는 매핑된 문장에 대해서 row전체를 반환한다.

두번째 메소드는 전체 로중 서브셋만을 반환한다. 이것은 스킵파라미터에 의해 정의된 수만큼 파라미터를 스킵하고, 쿼리로부터 최대 row값만을 반환한다. 만약 결과가 100개의 로가 있고, 첫번째 10개의 로를 원할경우 당신은 이렇게 사용할 수 있다. 0번 스킵하고 최대로 10개만 가져와라 skip = 0, max = 10으로 지정하면 된다. 만약 다음번 10개의 레코드를 가져오고자 할 경우 다음 10 로를 획득할 수 있다.


맵을 이용하여 가져오고 싶은경우

3. The queryForMap() methods
이 메소드는 Map를 list대신 반환하며 하나 혹은 이상의 로를 데이터베이스로 부터 자바 객체로 가져온다. 이것은 다른 메소드와 같이 2개의 메소드를 가진다.
■ Map queryForMap(String id, Object parameter, String key) throws SQLException;
■ Map queryForMap(String id, Object parameter, String key, String value) throws SQLException;

첫번째 메소드는 쿼리를 수행하고, 결과로 Map 객체를 반환한다. 키 객체는 key 파라미터에 의해서 매핑된 이름으로 객체를 가져온다.

두번째 메소드는 맵과 유사한 결과를 반환한다. 그러나 객체는 value파라미터에 의해서 정의된 객체를 반환한다.

예제가 천개의 단어로 이루어진경우의 하나이다. account에 매핑된 내용을 반환하는 예제에 대해서 살펴보고자 한다.

첫번째 메소드를 이용하는 경우 당신은 Map를 생성하고 accountId를 가진 프로퍼티를 이용하여 map의 키로 지정하고, 값을 account 빈 전체에 매핑한다.

두번째 메소드를 이용하면, 맵의 키로 accountId 프로퍼티를 생성하고 account 이름에 대한 값을 지정하게 된다.
Map accountMap = sqlMap.queryForMap("Account.getAll", null, "accountId");
System.out.println(accountMap);

accountMap = sqlMap.queryForMap("Account.getAll",null,"accountId","username");
System.out.println(accountMap);

이제 iBatis를 이용하여 API의 일부분을 살펴보았다. 이제는 구문을 지정하는 다른 방법을 알아볼 것이다.

Mapped statement types
SqlMap API를 이용할 수 있도록 배워 보았다. 이제는 어떻게 문장을 생성하고 그것이 동작하는지에 대해서 알아보자.
이전 예제에서 우리는 Account.getAll이라고 매핑된 문장을 호출하였다.

구문을 매핑하는 몇가지 형식이 있으며 여기에서는 각 속성의 집합과 자식 엘리먼트의 목적에 대해서 알아볼 것이다.

1. <select> : 데이터를 읽을 때 사용한다.
  attributes : id, parameterClass, resultClass, parameterMap, resultMap, cacheModel

2. <insert> : 데이터를 입력하고자 할때 사용한다.
  attributes : id, parameterClass, parameterMap
  elements : selectKey

3. <update> : 데이터를 업데이트 하낟.
  attributes : id, parameterClass, parameterMap

4. <delete> : 데이터를 삭제한다.
  attributes : id, parameterClass, parameterMap

5. <procedure> : 저장 프로시저를 호출한다.
  attributes : id, parameterClass, resultClass, parameterMap, resultMap, xmlResultName

6. <statement> : 모든 문장 타입을 캐치한다.
  attributes : id, parameterClass, resultClass, parameterMap, resultMap, cacheModel, xmlResultName

7. <sql> : 실제 매핑된 쿼리문이 아니다. 그러나 매핑된 구문 안에서 이용될 수 있다.
  attriburtes : id

8. <include> : 실제 패밒된 쿼리문이 아니다. 그라나 <sql> 타입과 함께 매핑된 문장에 컴포넌트를 입력하고 문장을 생성할때 이용된다.

Working with mapped statements
In this chapter, we focus on the <select> mapped statement type.
이번 예제에서는 <select>매핑된 문장타입에 집중해 볼 것이다. 또한 매핑된 문장 타입에서 2개의 추가된 엘리먼트를 볼 것이다. 이것은 <sql>과 <include>이다.
이러한 엘리먼트는 매핑된 문장을 생성하고, 추가할때 이용된다. 우리는 복잡한 문장을 분할해서 중복없이 그것들을 이용하고자 할때 유용하게 쓸 수 있다.
<sql>엘리먼트는 완벽한 SQL 문장을 생성하기 위해서 그룹화 할 부분 문장을 이용할 때 사용된다.
예를 들어 WHERE 섹션에 복잡한 문장을 사용해야 한다고 할때, <sql> 문장을 이용햐여 쿼리에 추가할 수 있다.
<sql id="select-order">
    select * from order
</sql>
<sql id="select-count">
    select count(*) as value from order
</sql>

<sql id="where-shipped-after-value">
    <![CDATA[
        where ahipData > #value:DATE#
    ]]>
</sql>

<select id="getOrderShippedAfter" resultClass="map">
    <include refid="select-order" />
    <include refid="where-shipped-after-value"/>
</select>

<select id="getOrderShippedAfter" resultClass="int">
    <include refid="select-count"/>
    <include refid="where-shipped-after-value"/>
</select>

이예제를 보면서, 이러한 기술이 복잡함을 없애주고 명백하게 만들어 준다는 것을 알 수 있다.

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

iBatis 사용방법 정리  (1) 2008.12.15
IBATIS > Dynamic SQL  (1) 2008.11.07
iBatis sqlMap 설정하기  (0) 2008.07.03
IBATIS 에서 LIKE 검색 기능 이용하기  (0) 2008.07.03
Websphere 6 + iBatis 연동 설정  (0) 2008.06.10