2012-02-27 190 views
0

我有一個記錄文件。通過彈簧批次刪除記錄

我必須開發一個spring批處理程序,它將讀取文件並從數據庫表中刪除相同的記錄。

是否有可能通過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答案是正確的,但也有一些更多的可能性與SQL批處理

  1. 你可以使用spring-jdbc-batch-template而不是正常的JDBC模板
  2. ,你可以直接使用spring-batch-jdbc-item-writer看到工作示例代碼

使用spring批處理xml配置和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]); 
     } 
    } 
}