![](/img/trans.png)
[英]How to change ItemWriter target filename in a spring-batch job?
[英]How to create spring-batch ItemWriter for entity with ArrayList field?
我用spring-batch来按表定位实体。 问题是关于ItemWriter,或者可能是关于ItemProcessor。
对于这个实体一切都好。 我可以从源读取实体并将其保存为User_export表
@Getter @Setter
class User{
String objectId;
String rev;
String value;
String type;
}
我有这个ItemWriter
:
@Bean
@StepScope
public ItemWriter<UserExport> writer() {
JdbcBatchItemWriter<UserExport> writer = new JdbcBatchItemWriter<>();
writer.setDataSource(dataSource);
String sql = "insert into User_export(objectId, REV, Value, Type)" +
"values (:objectId, :rev, :value, :type)";
writer.setSql(sql);
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
writer.afterPropertiesSet();
return writer;
}
2)然后,我在我的实体用户中添加了字段。 此字段是列表,我需要将此字段保存在其他表 - Device_Export中。
@Getter @Setter
class User{
String objectId;
String rev;
String value;
String type;
List<String> devices;
}
我有两个表User_export和Device_export。 Device_export具有User_export的外键,并且与一个用户的关系是许多设备。 我需要按表映射我的用户实体。 所以,我的解决方案是:
@Bean
public Step exportStep1() {
return stepBuilderFactory.get("step1").<InputUser, List<OutputUser>>chunk(1)
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
阅读器 - >处理器>作家
读者(从来源talbe读取实体) - 这是okey。
@Bean
public JdbcCursorItemReader<User> reader() {
JdbcCursorItemReader<InputUser> reader = new JdbcCursorItemReader<>();
String sql = "select * from User_Table";
reader.setSql(sql);
reader.setDataSource(dataSource);
reader.setName("User_Table");
reader.setRowMapper(new BeanPropertyRowMapper<>(User.class));
return reader;
}
处理完毕后,我的用户实体已填充设备列表。 我需要将它映射到表:
我用过ComposeWriter:
@Bean
@StepScope
@DependsOn({"userWriter", "deviceWriter"})
public CompositeItemWriter composeWriter() {
CompositeItemWriter writer = new CompositeItemWriter();
ItemWriter<UserExport> userWriter = userWriter();
ItemWriter<DeviceExport> deviceWriter = deviceWriter();
List<ItemWriter> writers = new ArrayList<>();
writers.add(userWriter);
writers.add(deviceWriter);
writer.setDelegates(writers);
return writer;
}
@Bean
@StepScope
public ItemWriter<UserExport> userWriter() {
JdbcBatchItemWriter<UserExport> writer = new JdbcBatchItemWriter<>();
writer.setDataSource(dataSource);
String sql = "insert into User_Export (objectId, REV, Value, Type)"
"values (:objectId, :rev, :value, :type)";
writer.setSql(sql);
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
writer.afterPropertiesSet();
return writer;
}
@Bean
@StepScope
public ItemWriter<DeviceExport> deviceWriter() {
JdbcBatchItemWriter<DeviceExport> writer = new JdbcBatchItemWriter<>();
writer.setDataSource(dataSource);
String sql = "insert into Device_Export (PR_KEY, objectId, device) values (:prKey, :objectId, :device)";
writer.setSql(sql);
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
writer.afterPropertiesSet();
return writer;
}
但是使用这样的ItemWriter,我只能在设备表中只写一条记录。 如何在Device_export中编写设备(记录)列表?
我的近似处理器是这样的:
@Bean
public ItemProcessor<User, List<OutputUser>> processor() {
return new ItemProcessor<User, List<OutputUser>>() {
@Override
public List<OutputUser> process(OutputUser item) throws Exception {
OutputUser outputUser = mapToUser(item);
List<OutputDevice> outputDevices = mapToDevices(item);
// Не понятно что делать дальше
}
};
}
JdbcBatchItemWriter
无济于事。 您需要编写代码以使用其devices
保存用户并将该代码包装为自定义Spring Batch编写器。 否则,使用ORM将实体映射到表并使用JpaItemWriter
或HibernateItemWriter
。
这里有一个类似的问题: 读取一个记录/项目并使用spring批处理写入多个记录/项目
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.