Query Service - Batch Update

다음은 Batch Update를 사용하는 경우이다. Query 서비스는 JDBC 2.0 batch updates를 사용해서 한번의 호출로 여러 건의 데이터를 INSERT, UPDATE, DELETE할 수 있게 한다.

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-batch-query.xml</filename>
 		    <!-- 중략 -->
	</config:configuration>		
</bean> 
<!-- 중략 -->

매핑 XML 파일 Sample

다음은 앞서 정의한 Query 서비스를 통해 로드된 mapping-batch-query.xml 로, 테이블 매핑 정보와 Batch로 처리할 쿼리문을 포함하고 있다.
<queryservice>
	<table-mapping>
		<table name="TBL_CUSTOMER"
			class="integration.anyframe.services.query.vo.CustomerVO">
			<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>
		<query id="insertbatch">
			<statement>
				INSERT INTO TBL_CUSTOMER ( ssno, name, address ) VALUES (?,?,?)
			</statement>
			<param type="VARCHAR" />
			<param type="VARCHAR" />
			<param type="VARCHAR" />
		</query>
	</queries>
</queryservice>

Query 서비스 테스트 코드 Sample

다음은 앞서 언급한 매핑 XML 파일에 정의된 INSERT 쿼리문을 Batch Update를 이용해 실행하는 소스 코드 QueryServiceTestBatch.java 이다. 입력 parameter를 LIST 형태로 담아서 Query 서비스에 전달하면, Query 서비스는 한 번의 실행으로 전달된 List의 개수 만큼의 쿼리문을 실행한다.
/**
 * 매핑 XML 파일에 정의된 쿼리문을 batch update를 이용해 실행.
 */
public void testBatchInsertQuery() throws Exception {
	IQueryService queryService = (IQueryService) context
			.getBean("queryService");

	//ArrayList에 입력할 데이터를 저장한다.
	ArrayList args = new ArrayList();
	Object[] arg = new Object[3];
	arg[0] = "1234567890123";
	arg[1] = "KimMinsu";
	arg[2] = "Ansan";
	args.add(arg);
	arg = new Object[3];
	arg[0] = "1234567890124";
	arg[1] = "LeeSungwook";
	arg[2] = "Seoul";
	args.add(arg);
	arg = new Object[3];
	arg[0] = "1234567890125";
	arg[1] = "ParkHeejin";
	arg[2] = "Seoul";
	args.add(arg);

	//ArrayList에 3개의 Object가 포함되어 있으므로 query id가 insertbatch인
	//쿼리문이 3번 실행된다.
	int[] results = queryService.batchUpdate("insertbatch", args);
	for (int i = 0; i < results.length; i++) {
		if (results[i] == -1) {
			throw new Exception("Batch Insert falied");
		}
	}
}

/**
 * 매핑 XML 파일에 쿼리문이 정의되어 있지 않을 때, 실행할 쿼리문을 직접 입력하여
 * batch update를 실행 
 */
public void testBatchInsertBySQLQuery() throws Exception {
	IQueryService queryService = (IQueryService) context
			.getBean("queryService");

	//실행 할 쿼리문을 정의
	String sql = "INSERT INTO TBL_CUSTOMER ( ssno, name, address ) VALUES (?,?,?)";

	//입력할 parameter의 SQL Type을 정의
	String[] types = new String[3];
	types[0] = "VARCHAR";
	types[1] = "VARCHAR";
	types[2] = "VARCHAR";

	//ArrayList에 입력할 데이터를 저장한다.
	ArrayList args = new ArrayList();
	Object[] arg = new Object[3];
	arg[0] = "1234567890126";
	arg[1] = "HongGildong";
	arg[2] = "Suwon";
	args.add(arg);
	arg = new Object[3];
	arg[0] = "1234567890127";
	arg[1] = "LeeSoonsin";
	arg[2] = "Seongnam";
	args.add(arg);
	arg = new Object[3];
	arg[0] = "1234567890128";
	arg[1] = "ChoiMinsu";
	arg[2] = "Seoul";
	args.add(arg);

	//ArrayList에 3개의 Object가 포함되어 있으므로 해당 쿼리문이 3번 실행된다.	
	int[] results = queryService.batchUpdateBySQL(sql, types, args);

	for (int i = 0; i < results.length; i++) {
		if (results[i] == -1) {
			throw new Exception("BatchInsertBySQL falied");
		}
	}
}

/**
 * OR Mapping을 이용해서 batch update를 실행
 */
public void testBatchInsertByObjectQuery() throws Exception {
	IQueryService queryService = (IQueryService) context
			.getBean("queryService");

	ArrayList args = new ArrayList();
	CustomerVO customerVO = new CustomerVO();

	customerVO.setSsno("1234567890129");
	customerVO.setNm("Smith");
	customerVO.setAddr("LA");
	args.add(customerVO);

	customerVO = new CustomerVO();
	customerVO.setSsno("1234567890130");
	customerVO.setNm("Brown");
	customerVO.setAddr("Newyork");
	args.add(customerVO);

	customerVO = new CustomerVO();
	customerVO.setSsno("1234567890131");
	customerVO.setNm("Eugene");
	customerVO.setAddr("Boston");
	args.add(customerVO);

	// 실행되는 쿼리문은 기본적인 INSERT문인
	// insert into TBL_CUSTOMER (ssno ,address ,name ) values ( ?, ?, ? )이다.
	int[] results = queryService.batchCreate(args);

	for (int i = 0; i < results.length; i++) {
		if (results[i] == -1) {
			throw new Exception("BatchInsertByObject falied");
		}
	}
}
앞서 소개된 샘플 테스트 코드를 포함하여 Query 서비스 소개 페이지에서 제공하는 모든 샘플 테스트 코드는 HSQL DB를 기반으로 실행된다. ( 단, ※ CallableStatement, LOB의 경우는 Oracle 9i, 10g를 기반으로 함. )

Resources

  • 다운로드
  • 샘플 테스트 코드를 포함하고 있는 anyframe-querytest-src.zip 파일을 다운받은 후, 테스트 환경 설정 을 참조하여 위에서 제시한 예제 코드를 실행해 볼 수 있다.
    Name
    Download
    anyframe-querytest-src.zip
    Download