Query Service - General Case
일반적으로 Query 서비스는 매핑 XML 파일에 정의되어 있는 매핑 정보와 쿼리문들을 이용하여 특정 쿼리문을 실행한다.
Query 서비스 속성 정의 파일 Sample
다음은 Query 서비스를 정의한
applicationContext-query-common.xml
과
Query 서비스에서 읽어들일 매핑 XML 파일의 위치를 정의한
applicationContext-query-sqlloader.xml
파일의 일부이다.
<bean id="queryService" class="anyframe.core.query.impl.QueryServiceImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
<property name="sqlRepository" ref="sqlLoader"/>
<!-- 중략 -->
</bean>
<bean id="jdbcTemplate" class="anyframe.core.query.impl.jdbc.PagingJdbcTemplate">
<property name="dataSource" ref="common_datasource" />
</bean>
<!-- 중략 -->
<bean name="sqlLoader" class="anyframe.core.query.impl.config.loader.SQLLoader">
<config:configuration>
<filename>classpath:/services/query/mappings/mapping-general-query.xml</filename>
<!-- 중략 -->
</config:configuration>
</bean>
<!-- 중략 -->
매핑 XML 파일 Sample
다음은 앞서 정의한 Query 서비스를 통해 로드된
mapping-general-query.xml
로,
테이블 매핑 정보와 다양한 쿼리문들을 포함하고 있다.
<queryservice>
<table-mapping>
<!-- 매핑할 테이블명과 클래스를 정의한다. -->
<table name="TBL_CUSTOMER"
class="integration.anyframe.services.query.vo.CustomerVO">
<!-- DB의 칼럼명과 VO 클래스의 attribute를 매핑한다.-->
<field-mapping>
<dbms-column>ssno</dbms-column>
<class-attribute>ssno</class-attribute>
</field-mapping>
<field-mapping>
<dbms-column>name</dbms-column>
<class-attribute>nm</class-attribute>
</field-mapping>
<field-mapping>
<dbms-column>address</dbms-column>
<class-attribute>addr</class-attribute>
</field-mapping>
<primary-key>
<dbms-column>ssno</dbms-column>
</primary-key>
</table>
</table-mapping>
<queries>
<!-- INSERT 쿼리문 -- >
<query id="create" isDynamic="false">
<statement>
INSERT INTO TBL_CUSTOMER ( ssno, name, address ) VALUES (?,?,?)
</statement>
<param type="VARCHAR" />
<param type="VARCHAR" />
<param type="VARCHAR" />
</query>
<!-- SELECT 쿼리문 -- >
<query id="selectGeneral" isDynamic="false">
<statement>
SELECT * FROM TBL_CUSTOMER WHERE SSNO like ?
</statement>
<param type="VARCHAR" />
</query>
<query id="selectUsingTableMapping" isDynamic="false">
<statement>
SELECT * FROM TBL_CUSTOMER WHERE SSNO like ?
</statement>
<param type="VARCHAR" />
<result class="integration.anyframe.core.query.vo.CustomerVO"/>
</query>
<query id="selectUsingResultMapping" isDynamic="false">
<statement>
SELECT NAME FROM TBL_CUSTOMER WHERE SSNO like ?
</statement>
<param type="VARCHAR" />
<result class="integration.anyframe.core.query.vo.CompositionCustomerVO">
<result-mapping column="NAME" attribute="compositionName"/>
</result>
</query>
<query id="selectUsingOnlyResultClass" isDynamic="false">
<statement>
SELECT * FROM TBL_CUSTOMER WHERE SSNO like ?
</statement>
<param type="VARCHAR" />
<result class="integration.anyframe.services.query.vo.CamelCasedCustomerVO"/>
</query>
<!-- UPDATE 쿼리문 -- >
<query id="update" isDynamic="false">
<statement>
UPDATE TBL_CUSTOMER SET ssno = ? , name = ?, address = ? WHERE ssno = ?
</statement>
<param type="VARCHAR" />
<param type="VARCHAR" />
<param type="VARCHAR" />
<param type="VARCHAR" />
<result class="integration.anyframe.core.query.vo.CustomerVO"/>
</query>
<!-- DELETE 쿼리문 -- >
<query id="delete" isDynamic="false">
<statement>
DELETE FROM TBL_CUSTOMER WHERE ssno = ?
</statement>
<param type="VARCHAR" />
<result class="integration.anyframe.core.query.vo.CustomerVO"/>
</query>
</queries>
</queryservice>
Query 서비스 테스트 코드 Sample
다음은 앞서 언급한 매핑 XML 파일에 정의된 INSERT, SELECT, UPDATE, DELETE 쿼리문을 실행하는 소스 코드
QueryServiceTestGeneral.java
이다.
/**
* Query 서비스를 통해 DB에 신규 데이터를 입력하는 테스트 코드
*/
public void testInsertQuery() throws Exception{
IQueryService queryService = (IQueryService) context.getBean("queryService");
//create() : 매핑 XML 파일에 정의되어 있는 query id를 이용하여 INSERT를 실행한다.
int rs = queryService.create("create"
, new Object[] { "1234567890123", "AAAAA" , "seoul"});
}
/**
* Query 서비스를 통해 DB에 입력된 데이터를 조회하는 테스트 코드
*/
public void testSelectQuery() throws Exception{
IQueryService queryService = (IQueryService) context.getBean("queryService");
//find() : 매핑 XML 파일에 정의되어 있는 query id를 이용하여 SELECT를 실행한다.
//일반적인 경우
ArrayList rsquery = (ArrayList) queryService
.find("selectGeneral", new Object[] { "%12345%" });
Map hsRsquery = new HashMap();
for( int i = 0 ; i < rsquery.size() ; i ++ ){
hsRsquery = (Map) rsquery.get(i);
String name = (String) hsRsquery.get("name");
}
// table-mapping을 정의한 경우
Collection rsqueryUsingTableMapping = queryService.find(
"selectUsingTableMapping", new Object[] { "%12345%" });
Iterator rsqueryItr = rsqueryUsingTableMapping.iterator();
while (rsqueryItr.hasNext()) {
CustomerVO customer = (CustomerVO) rsqueryItr.next();
String name = customer.getNm();
}
// result-mapping을 정의한 경우
Collection rsqueryUsingResultMapping = queryService.find("selectUsingResultMapping"
, new Object[] { "%12345%" });
Iterator rsqueryItr_01 = rsqueryUsingResultMapping.iterator();
while (rsqueryItr_01.hasNext()) {
CompositionCustomerVO compositionCustomer
= (CompositionCustomerVO) rsqueryItr_01.next();
String name = compositionCustomer.getCompositionName();
}
// result class만 정의한 경우
Collection rsqueryUsingOnlyResultClass = queryService.find(
"selectUsingOnlyResultClass", new Object[] { "%12345%" });
Iterator rsqueryItr_02 = rsqueryUsingOnlyResultClass.iterator();
while (rsqueryItr_02.hasNext()) {
CamelCasedCustomerVO camelCasedCustomerVO
= (CamelCasedCustomerVO) rsqueryItr_02.next();
String name = camelCasedCustomerVO.getName();
}
// ...
}
/**
* Query 서비스를 통해 DB에 입력된 데이터를 수정하는 테스트 코드
*/
public void testUpdateQuery() throws Exception {
IQueryService queryService = (IQueryService) context.getBean("queryService");
//update() : 매핑 XML 파일에 정의되어 있는 query id를 이용하여 UPDATE를 실행한다.
int rs = queryService.update("update", new Object[] { "9999999999999", "AAAAA"
, "busan" , "1234567890123"});
}
/**
* Query 서비스를 통해 DB에 입력된 데이터를 삭제하는 테스트 코드
*/
public void testDeleteQuery() throws Exception {
IQueryService queryService = (IQueryService) context
.getBean("queryService");
//remove() : 매핑 XML 파일에 정의되어 있는 query id를 이용하여 DELETE를 실행한다.
int rs = queryService.remove("delete", new Object[] { "9999999999999" });
}
앞서 소개된 샘플 테스트 코드를 포함하여 Query 서비스 소개 페이지에서 제공하는 모든 샘플 테스트 코드는 HSQL DB를
기반으로 실행된다. ( 단, ※ CallableStatement, LOB의 경우는 Oracle 9i, 10g를 기반으로 함. )
Resources
다운로드
샘플 테스트 코드를 포함하고 있는 anyframe-querytest-src.zip 파일을 다운받은 후, 테스트 환경 설정
을 참조하여
위에서 제시한 예제 코드를 실행해 볼 수 있다.
| Name |
Download |
| anyframe-querytest-src.zip |
Download
|