首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JAVA代码中使用JdbcBatchItemWriter和CompositeItemWriter的PB -Spring-批处理

在JAVA代码中使用JdbcBatchItemWriter和CompositeItemWriter的PB -Spring-批处理
EN

Stack Overflow用户
提问于 2015-09-18 16:11:39
回答 1查看 5.5K关注 0票数 1

我扩展了官方Spring站点- 批处理服务提供的批处理服务代码,并修改了ItemWriter以生成CSV并写入数据库。

我使用CompositeItemWriter编写了CSV和数据库。然而,JdbcBatchItemWriter并没有正确地使用CompositeItemWriter。代码如下所示。

代码语言:javascript
复制
    @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(编写器);以运行代码。这表明CompositeItemWriter在FlatFileitemWriter上运行得很好,但是与JdbcBatchItemWriter没有关系。我所犯的错误是-

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-19 03:35:17

这是jdbc自动配置的问题,在多个itemWriters的情况下没有运行。请按相同顺序添加最后一行:-

代码语言:javascript
复制
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();
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32656581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档