iBATIS SQL Maps 2.0에 대한 소개 [번역 허태명]
iBatis SQL Maps는 여러분의 자바 객체와 관계형 데이터베이스 사이에서 이동하는데 매우 간단하고 유연한 수단을 제공합니다. 단 한 줄의 JDBC 코드 없이 진정한 SQL의 완전한 능력을 사용하세요!
SQL Maps 프레임워크는 일반적으로 관계형 데이터베이스에 접근하기 위해 필요로 하는 자바 코드의 양을 현저하게 줄여주는데 도움을 줍니다. 이 프레임워크는 매우 간단한 형식의 XML을 사용하여 자바 Bean을 SQL 문장에 매핑합니다. 단순성은 다른 프레임워크와 ORM 툴들에 비해 SQL Maps의 가장 큰 장점입니다. SQL Maps를 사용하기 위해 여러분은 단지 자바 Bean과 XML, SQL에만 친숙하면 됩니다. 새로이 배워야 할 것은 거의 없습니다. 테이블을 조인하거나 복잡한 쿼리를 실행하기 위해 필요로 하는 복잡한 설계는 없습니다. SQL Maps를 사용함으로써 여러분은 진정한 SQL의 완전한 능력을 당장 사용할 수 있습니다. SQL Maps 프레임워크는 대부분의 데이터베이스를 어떤 객체 모델로도 매핑할 수 있고 레거시 설계, 심지어 그것이 나쁜 설계라도 매우 유연하게 대처할 수 있습니다. 이것은 특정한 데이터베이스 테이블의 생성이나 객체, 코드 생성없이 모두 이루어 집니다.
궁금한가요? 여기에 왜 여러분이 iBATIS SQL Maps를 좋아할 수 있는지 10가지 이유가 있습니다.
***왜 iBATIS SQL Maps를 사용하나요?***
10 JDBC 드라이버를 가지고 있는 어떤 데이터베이스에서도 사용할 수 있습니다.(플러그-인이 필요없습니다.)
9 설정가능한 캐쉬 (의존성 포함)
8 Local 과 Global 트랜잭션 지원과 관리(JTA)
7 간단한 XML 매핑 문서 구조
6 Map, Collection, List와 기본형의 래퍼(Integer, String 등)을 지원합니다.
5 자바 Bean 스타일의 클래스를 지원합니다.(get/set 메소드)
4 복잡한 객체 매핑을 지원합니다. (list와 복잡한 객체 모델 등의 생성)
3 객체 모델은 결코 완벽하지 않습니다. (변경이 필요없습니다!)
2 데이터베이스 디자인은 결코 완벽하지 않습니다 (변경이 필요없습니다!)
1 여러분은 SQL을 이미 알고 있습니다. 왜 다른 것을 배우는데 시간을 낭비합니까?
무엇보다 가장 좋은 것은, 100% Open Source 프리웨어입니다!
예제는 어떤가요? 실제 코드에서 MappedStatement가 어떻게 사용되는지 확인해보세요.
<!-- 다음은 간단한 SQL Map의 예제입니다. 이 쿼리는 DB 컬럼의
알리어스를 자동적으로 자바 Bean 프로퍼티에 매핑해주는 SQL Map
프레임워크의 기능을 사용합니다. Address 클래스가 다음과 같은
프로퍼티를 가지고 있다고 생각해 보세요: id (int), description (String),
street (String), city (String), province (String), and postalCode (String).
SQL 문장(표준 SQL 기능)에서 컬럼 알리어스를 사용하고 result-class
어트리뷰트에서 Address 클래스를 명명함으로써, 컬럼의 값들은 자동적으로
자바 Bean에 매핑됩니다!
이것은 SQL Map 프레임워크를 사용하여 SQL 쿼리에서 객체(자바 Bean)을
얻는 단지 여러가지 방법 중의 하나입니다. -->
<select id="getAddress" parameterClass="int" resultClass="example.domain.Address">
select
ADR_ID as id,
ADR_DESCRIPTION as description,
ADR_STREET as street,
ADR_CITY as city,
ADR_PROVINCE as province,
ADR_POSTAL_CODE as postalCode
from ADDRESS
where ADR_ID = #value#
</select>
어떻게 자바에서 이것을 실행하나요?
/* 다음 간단한 몇 줄의 코드는 위의 문장의 #value# 파라미터에 전달할 키로써
* integer 5를 사용하여 위의 매핑된 문장을 실행합니다.
*/
Integer pk = new Integer(5);
Address address = (Address)sqlMap.queryForObject("getAddress", pk);
아래에 더 많은 예제가 있습니다.
<!-- SQL Maps은 단지 select 쿼리에서만 사용되지 않습니다, 여기에 어떻게
새로운 Address 클래스가 insert되는지 보여주고 있습니다. -->
<insert id="insertAddress" parameterClass="examples.domain.Address">
insert into ADDRESS (
ADR_ID,
ADR_DESCRIPTION,
ADR_STREET,
ADR_CITY,
ADR_PROVINCE,
ADR_POSTAL_CODE)
values (
#id#,
#description#,
#street#,
#city#,
#province#,
#postalCode#)
</insert>
// 이 insert 문장을 실행하는 것은 select 쿼리와 마찬가지로 쉽습니다.
// executeUpdate 메소드는 insert, update, delete를 위해 사용됩니다.
Address address = new Address();
address.setId(15);
address.setDescription("Bob's Comic Book Store");
address.setStreet ("16 Somestreet");
...
sqlMap.insert ("insertAddress", address);
<!-- 여기에 하나 이상의 결과를 리턴하는 예제가 있습니다. -->
<select id="getProductByCategory" parameterClass="string"
resultClass="examples.domain.Product">
select
PRD_ID as id,
PRD_CATEGORY as category,
PRD_DESCRIPTION as description,
PRD_RETAIL as retail,
PRD_QUANTITY as quantity
from PRODUCT
where PRD_CATEGORY = #value#
</select>
// "개" 카테고리의 제품 리스트를 위해 위의 문장을 실행하는
// 것은 다음과 같이 간단합니다.
String category = "dog";
List productList = sqlMap.queryForList("getProductByCategory", category);
// 결과가 너무 많은가요? 자바 Bean에 호환되고 JSP에서 쉽게
// 사용할 수 있는, 완전히 탐색가능하고 lazy-loading 기능과
// 페이징이 가능한 제품의 list 는 어떤가요?
// 페이지당 10개면 괜찮을까요?
PaginatedList productList = sqlMap.queryForList("getProductByCategory",
category,
10);
productList.nextPage();
productList.previousPage();
productList.isNextPageAvailable();
// 동일한 쿼리에서 단지 Product 클래스의 ID와 Description의 Map만 필요하나요?
Map descriptionMap = sqlMap.queryForMap ("getProductByCategory",
category,
"id",
"description");
Integer managerId = new Integer(15);
List employeeList = sqlMap.queryForList
("getEmployeesByManagerRecursively",managerId);