Ответ от Махмуд Бен Хассин и комментарии в значительной степени охватывают все аспекты решения и являются принятым ответом.
Вот реализация, которую я использовал, если кому-то интересно:
public class JdbcCustomBatchSizeItemWriter<W> extends JdbcDaoSupport implements ItemWriter<W> {
private int batchSize;
private ParameterizedPreparedStatementSetter<W> preparedStatementSetter;
private String sqlFileLocation;
private String sql;
public void initReader() {
this.setSql(FileUtilties.getFileContent(sqlFileLocation));
}
public void write(List<? extends W> arg0) throws Exception {
getJdbcTemplate().batchUpdate(sql, Collections.unmodifiableList(arg0), batchSize, preparedStatementSetter);
}
public void setBatchSize(int batchSize) {
this.batchSize = batchSize;
}
public void setPreparedStatementSetter(ParameterizedPreparedStatementSetter<W> preparedStatementSetter) {
this.preparedStatementSetter = preparedStatementSetter;
}
public void setSqlFileLocation(String sqlFileLocation) {
this.sqlFileLocation = sqlFileLocation;
}
public void setSql(String sql) {
this.sql = sql;
}
}
Примечание:
- Использование
Collections.unmodifiableList
предотвращаетнеобходимость любого явного приведения. - Я использую
sqlFileLocation
, чтобы указать внешний файл, содержащий sql, а FileUtilities.getfileContents
просто возвращает содержимое этого файла sql. Это можно пропустить, и при создании компонента можно напрямую передать sql
классу.