2012-02-27 6 views
0

레코드가있는 파일이 있습니다.스프링 배치를 통해 레코드 삭제

파일을 읽고 데이터베이스 테이블에서 동일한 레코드를 삭제하는 스프링 배치 프로그램을 개발해야합니다.

ItemWriter를 통해 삭제 쿼리를 실행할 수 있습니까 ???

답변

0

업데이트 또는 삭제 작업간에 차이점은 없으며 SQL 변경 만 가능합니다. 귀하의 질문에 대한 간단한 대답은 '예'입니다. 다음 코드 부분은 Book 테이블에서 삭제한다고 가정 할 때 기본 요구 사항에 도움이 될 수 있습니다.

public class BookJdbcItemWriter implements ItemWriter<Book> { 

     private static final String DELETE_BOOK = "delete from Book where id = ?"; 

     private JdbcTemplate jdbcTemplate; 

     public BookJdbcItemWriter(DataSource dataSource) { 
       this.jdbcTemplate = new JdbcTemplate(dataSource); 
     } 

     public void write(List<? extends Book> items) throws Exception { 
       for(Book item : items) { 
         int updated = jdbcTemplate.update(DELETE_BOOK,item.getId());               
       } 
     } 
} 
3

Serkans 대답은 잘하지만, 좀 더 가능성이

  • 가 직접 spring-batch-jdbc-item-writer 볼 사용할 수있는 대신 일반 JDBC 템플릿의 spring-jdbc-batch-template을 사용할 수

    1. 배치 SQL로 작업이 있습니다 예제 코드

    스프링 배치 xml config 및 java 코드

    의 코드 예제
    <bean id="itemWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter"> 
        <property name="dataSource" ref="dataSource" /> 
        <property name="sql"> 
         <!-- Why CDATA? 
    
          because < etc. is not allowed for xml values 
          when you use &lt; xml parser will work, but 
          now the sql won't because of the & spring assumes 
          a placeholder, see 
          - AbstractSqlPagingQueryProvider.init(...) 
          - JdbcParameterUtils.countParameterPlaceholders(...) 
    
          --> 
         <value> 
          <![CDATA[ 
           DELETE FROM TEST 
           WHERE id = ? 
           and sub.id = ? 
           and ... 
          ]]> 
         </value> 
        </property> 
        <property name="itemPreparedStatementSetter"> 
         <bean class="...FieldSetItemPreparedStatementSetter" /> 
        </property>   
    </bean> 
    
    /** 
    * Implementation for {@link ItemPreparedStatementSetter}, 
    * sets the values from {@link FieldSet}. 
    * 
    */ 
    public class FieldSetItemPreparedStatementSetter implements ItemPreparedStatementSetter<FieldSet> { 
    
        /** {@inheritDoc} */ 
        @Override 
        public void setValues(FieldSet item, PreparedStatement ps) throws SQLException { 
         for (int i = 0; i < item.getValues().length; i++) { 
          // PreparedStatements start with 1 
          ps.setObject(i + 1, item.getValues()[i]); 
         } 
        } 
    }