java - Spring 批量读取 REST api 并使用 JdbcBatchItemWriter 将一次读取的多条记录写入单个 DB 表的代码
问题描述
我做了一些搜索,但找不到示例代码。Spring 从 REST api 批量读取(我已经完成)并使用JdbcBatchItemWriter
. 下面是我的BatchConfig
代码,但它只写了一条记录。我想我必须让我的处理器返回一个注册对象列表,并且
JDBCItemWriter
必须写多条记录
代码
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Autowired
private Environment environment;
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
//my reader
@Bean
ItemReader<EmployeeEmploymentDTO> restEmployeeReader(Environment
environment,
RestTemplate restTemplate) {
return new RESTEmployeeReader(
environment.getRequiredProperty("rest.api.to.listemployees.ugs.api.url"),
restTemplate
);
}
//my processor which is a separate class
@Bean
public RegistrationItemProcessor processor() {
return new RegistrationItemProcessor();
}
//my writer which now only inserts one record for a read but i want to
insert multiple varying number of records for a read
@Bean
public JdbcBatchItemWriter<Registration> writer(DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<Registration>()
.itemSqlParameterSourceProvider(new
BeanPropertyItemSqlParameterSourceProvider<>())
.sql("INSERT INTO registration //.....*ommitted insert statement
.dataSource(dataSource)
.build();
}
@Bean
public Job importUserJob(JobCompletionNotificationListener listener,
Step step1) {
return jobBuilderFactory.get("importUserJob")
.incrementer(new RunIdIncrementer())
.listener(listener)
.flow(step1)
.end()
.build();
}
@Bean
public Step step1(JdbcBatchItemWriter<Registration> writer) {
return stepBuilderFactory.get("step1")
.<EmployeeEmploymentDTO, Registration> chunk(10)
.reader(restEmployeeReader(environment,restTemplate()))
.processor(processor())
.writer(writer)
.build();
}
}
解决方案
我的处理器返回了 List 列表
我的作家如下
public class MultiOutputItemWriter implements ItemWriter<List<Registration>> {
ItemWriter<Registration> itemWriter;
@Autowired
NamedParameterJdbcTemplate namedParamJdbcTemplate;
@Override
public void write(List<? extends List<Registration>> items) throws Exception {
for (List<Registration> registrations : items) {
final String SQL_INSERT_INTO_REGISTRATION="INSERT INTO registration (employee_id, ....";
final List<MapSqlParameterSource> params = new ArrayList<>();
for (Registration registration : registrations) {
MapSqlParameterSource param = new MapSqlParameterSource();
param.addValue("employeeId", registration.getEmployeeId());
param.addValue("startDate", registration.getStartDate());
param.addValue("user", registration.getUser());
param.addValue("endTime", registration.getEndTime());
params.add(param);
}
namedParamJdbcTemplate.batchUpdate(SQL_INSERT_INTO_REGISTRATION,params.toArray(new MapSqlParameterSource[params.size()]));
}
}
}
推荐阅读
- windows - 为 Intune Win32 从 bat 执行 PS
- neo4j - Janusgraph 的能力和未来
- dax - 如何为 SUMMARIZECOLUMN 中的列传递常量字符串值
- python - Python Outlook 收件箱保存附件 win32com.client
- colors - NCVIEWER:打印动作和非打印动作应该是不同的颜色
- go - 如何扩展 go-yaml 以支持自定义标签
- python - 出现错误:没有足够的值来解包(预期 2,得到 1)
- javascript - RandomNum 未定义,我不明白为什么
- typescript - 如何获得元组元组的扁平元组类型?
- sql-server - SQL Server 中 Xml 节点的多行