레코드가있는 파일이 있습니다.스프링 배치를 통해 레코드 삭제
파일을 읽고 데이터베이스 테이블에서 동일한 레코드를 삭제하는 스프링 배치 프로그램을 개발해야합니다.
ItemWriter를 통해 삭제 쿼리를 실행할 수 있습니까 ???
레코드가있는 파일이 있습니다.스프링 배치를 통해 레코드 삭제
파일을 읽고 데이터베이스 테이블에서 동일한 레코드를 삭제하는 스프링 배치 프로그램을 개발해야합니다.
ItemWriter를 통해 삭제 쿼리를 실행할 수 있습니까 ???
업데이트 또는 삭제 작업간에 차이점은 없으며 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());
}
}
}
Serkans 대답은 잘하지만, 좀 더 가능성이
스프링 배치 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 < 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]);
}
}
}