Spring-Batch:Parent-Child 关系的项目作者
Spring-Batch: Item writer for Parent-Child relationship
我写了一个项目处理器,其中 returns Objects 的列表。此 object 需要拆分为 2 个数据库 table(一个 parent 和一个 child)。一个 header 行和对应的 header ID 我们在 child table 中关联了 child 行。我已经使用 ListUnpackingItemWriter 示例来解决列表问题。我已经使用 CompositeItemWriter 将结果拆分为 2 个编写器,现在我需要将每个拆分为 header 和 child table。现在每个作者都有相同的行数。有更好的方法吗?解决两个 Table 主键问题。我需要示例编写自定义项目编写器,它在插入之前进行验证。提前致谢。
下面是代码
public JdbcBatchItemWriter<T> myWriter() {
JdbcBatchItemWriter<T> myWriter = new JdbcBatchItemWriter<T>();
myWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<T>());
myWriter.setSql("INSERT INTO Parent table( colums) values ( values )");
myWriter.setDataSource(dataSource);
myWriter.afterPropertiesSet();
return myWriter;
}
public JdbcBatchItemWriter<T> myOtherWriter() {
JdbcBatchItemWriter<T> myWriter = new JdbcBatchItemWriter<T>(); 1
myWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<T>());
myWriter.setSql("INSERT INTO child table( colums) values ( values )");
myWriter.setDataSource(dataSource);
myWriter.afterPropertiesSet();
return myWriter;
}
public CompositeItemWriter<T> compositeItemWriter() {
CompositeItemWriter<T> writer = new CompositeItemWriter<T>();
writer.setDelegates(Arrays.asList(myWriter(),myOtherWriter()));
return writer;
}
```
如果复合编写器不适合您,那么您可以使用自定义编写器吗,例如:
import java.util.List;
import javax.sql.DataSource;
import org.springframework.batch.item.ItemWriter;
import org.springframework.jdbc.core.JdbcTemplate;
public class MyParentChildWriter implements ItemWriter<Object> {
private JdbcTemplate jdbcTemplate;
public MyParentChildWriter(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public void write(List<?> items) {
for (Object item : items) {
// get parent/child values from item and use them in the query as needed
jdbcTemplate.update("INSERT INTO Parent table( colums) values ( values )");
jdbcTemplate.update("INSERT INTO child table( colums) values ( values )");
}
}
}
请注意,所有更新语句都将在单个事务中执行,如 Chunk-oriented Processing 部分所述。
我写了一个项目处理器,其中 returns Objects 的列表。此 object 需要拆分为 2 个数据库 table(一个 parent 和一个 child)。一个 header 行和对应的 header ID 我们在 child table 中关联了 child 行。我已经使用 ListUnpackingItemWriter 示例来解决列表问题。我已经使用 CompositeItemWriter 将结果拆分为 2 个编写器,现在我需要将每个拆分为 header 和 child table。现在每个作者都有相同的行数。有更好的方法吗?解决两个 Table 主键问题。我需要示例编写自定义项目编写器,它在插入之前进行验证。提前致谢。
下面是代码
public JdbcBatchItemWriter<T> myWriter() {
JdbcBatchItemWriter<T> myWriter = new JdbcBatchItemWriter<T>();
myWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<T>());
myWriter.setSql("INSERT INTO Parent table( colums) values ( values )");
myWriter.setDataSource(dataSource);
myWriter.afterPropertiesSet();
return myWriter;
}
public JdbcBatchItemWriter<T> myOtherWriter() {
JdbcBatchItemWriter<T> myWriter = new JdbcBatchItemWriter<T>(); 1
myWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<T>());
myWriter.setSql("INSERT INTO child table( colums) values ( values )");
myWriter.setDataSource(dataSource);
myWriter.afterPropertiesSet();
return myWriter;
}
public CompositeItemWriter<T> compositeItemWriter() {
CompositeItemWriter<T> writer = new CompositeItemWriter<T>();
writer.setDelegates(Arrays.asList(myWriter(),myOtherWriter()));
return writer;
}
```
如果复合编写器不适合您,那么您可以使用自定义编写器吗,例如:
import java.util.List;
import javax.sql.DataSource;
import org.springframework.batch.item.ItemWriter;
import org.springframework.jdbc.core.JdbcTemplate;
public class MyParentChildWriter implements ItemWriter<Object> {
private JdbcTemplate jdbcTemplate;
public MyParentChildWriter(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public void write(List<?> items) {
for (Object item : items) {
// get parent/child values from item and use them in the query as needed
jdbcTemplate.update("INSERT INTO Parent table( colums) values ( values )");
jdbcTemplate.update("INSERT INTO child table( colums) values ( values )");
}
}
}
请注意,所有更新语句都将在单个事务中执行,如 Chunk-oriented Processing 部分所述。