PB 在 JAVA 代码中使用 JdbcBatchItemWriter 和 CompositeItemWriter- Spring-Batch
PB using JdbcBatchItemWriter with CompositeItemWriter in JAVA code- Spring-Batch
我扩展了官方提供的批处理服务代码Spring-批处理站点-Batch Processing Service并修改了ItemWriter以生成CSV并写入数据库。
我已经使用 CompositeItemWriter 在 CSV 和数据库中写入。
但是,JdbcBatchItemWriter 无法与 CompositeItemWriter 一起正常工作。代码如下所示。
@Bean
public ItemWriter<Person> writer(DataSource dataSource) {
CompositeItemWriter<Person> cWriter = new CompositeItemWriter<Person>();
// For DataBase
JdbcBatchItemWriter<Person> writer = new JdbcBatchItemWriter<Person>();
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Person>());
writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)");
writer.setDataSource(dataSource);
// For CSV
FlatFileItemWriter<Person> csvWriter = new FlatFileItemWriter<Person>();
csvWriter.setResource(new FileSystemResource(new File("./csv/new-data.csv")));
csvWriter.setShouldDeleteIfExists(true);
DelimitedLineAggregator<Person> lineAggregator = new DelimitedLineAggregator<Person>();
lineAggregator.setDelimiter(",");
BeanWrapperFieldExtractor<Person> fieldExtractor = new BeanWrapperFieldExtractor<Person>();
String[] names = {"firstName", "lastName"};
fieldExtractor.setNames(names);
lineAggregator.setFieldExtractor(fieldExtractor);
csvWriter.setLineAggregator(lineAggregator);
List<ItemWriter<? super Person>> mWriter = new ArrayList<ItemWriter<? super Person>>();
mWriter.add(writer); // **Comment this line and the code works fine**
mWriter.add(csvWriter);
cWriter.setDelegates(mWriter);
return cWriter;
}
评论这一行 - mWriter.add(writer); 运行 代码。这表明 CompositeItemWriter 与 FlatFileitemWriter 配合良好,但与 JdbcBatchItemWriter 配合使用时效果不佳。我得到的错误是 -
or.springframework.jdbc.BadSqlGrammerException: PreparedStatementCallback; bad SQL grammar
[insert into people(first_name, last_name) VALUES (:firstName, :lastName)]
Caused by: Syntax error in SQl statement "insert into people((first_name, last_name) VALUES (:[*]firstName, :lastName)"; expected"), DEFAULT, NOT, EXISTS, INTERSECTS, SELECT, FROM"; SQL Statement:
如何解析 JdbcBatchItemWriter 以使其与 CompositeItemWriter 一起正常工作?
这是 jdbc 自动配置的问题,在多个 itemWriters 的情况下 运行 不是。请按相同顺序添加最后一行:-
JdbcBatchItemWriter<Person> writer = new JdbcBatchItemWriter<Person>();
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Person>());
writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)");
writer.setDataSource(dataSource);
writer.afterPropertiesSet();
我扩展了官方提供的批处理服务代码Spring-批处理站点-Batch Processing Service并修改了ItemWriter以生成CSV并写入数据库。
我已经使用 CompositeItemWriter 在 CSV 和数据库中写入。 但是,JdbcBatchItemWriter 无法与 CompositeItemWriter 一起正常工作。代码如下所示。
@Bean
public ItemWriter<Person> writer(DataSource dataSource) {
CompositeItemWriter<Person> cWriter = new CompositeItemWriter<Person>();
// For DataBase
JdbcBatchItemWriter<Person> writer = new JdbcBatchItemWriter<Person>();
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Person>());
writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)");
writer.setDataSource(dataSource);
// For CSV
FlatFileItemWriter<Person> csvWriter = new FlatFileItemWriter<Person>();
csvWriter.setResource(new FileSystemResource(new File("./csv/new-data.csv")));
csvWriter.setShouldDeleteIfExists(true);
DelimitedLineAggregator<Person> lineAggregator = new DelimitedLineAggregator<Person>();
lineAggregator.setDelimiter(",");
BeanWrapperFieldExtractor<Person> fieldExtractor = new BeanWrapperFieldExtractor<Person>();
String[] names = {"firstName", "lastName"};
fieldExtractor.setNames(names);
lineAggregator.setFieldExtractor(fieldExtractor);
csvWriter.setLineAggregator(lineAggregator);
List<ItemWriter<? super Person>> mWriter = new ArrayList<ItemWriter<? super Person>>();
mWriter.add(writer); // **Comment this line and the code works fine**
mWriter.add(csvWriter);
cWriter.setDelegates(mWriter);
return cWriter;
}
评论这一行 - mWriter.add(writer); 运行 代码。这表明 CompositeItemWriter 与 FlatFileitemWriter 配合良好,但与 JdbcBatchItemWriter 配合使用时效果不佳。我得到的错误是 -
or.springframework.jdbc.BadSqlGrammerException: PreparedStatementCallback; bad SQL grammar
[insert into people(first_name, last_name) VALUES (:firstName, :lastName)]
Caused by: Syntax error in SQl statement "insert into people((first_name, last_name) VALUES (:[*]firstName, :lastName)"; expected"), DEFAULT, NOT, EXISTS, INTERSECTS, SELECT, FROM"; SQL Statement:
如何解析 JdbcBatchItemWriter 以使其与 CompositeItemWriter 一起正常工作?
这是 jdbc 自动配置的问题,在多个 itemWriters 的情况下 运行 不是。请按相同顺序添加最后一行:-
JdbcBatchItemWriter<Person> writer = new JdbcBatchItemWriter<Person>();
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Person>());
writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)");
writer.setDataSource(dataSource);
writer.afterPropertiesSet();