Spring-Batch:用于父子关系的项目编写器

问题描述 投票:0回答:1

我已经写了一个返回对象列表的项目处理器。该对象需要拆分为2个数据库表(一个父级和一个子级)。一个标题行,对于此对应的标题ID,我们在子表中具有关联的子行。我使用ListUnpackingItemWriter示例来解决列表问题。我已经使用CompositeItemWriter将结果拆分为2个writer,现在我需要将每个拆分为header和child表。现在,每个作者的行数都相同。有更好的方法吗?解决两个表主键问题。我需要示例编写自定义项目编写器,该示例在插入之前进行验证。预先感谢您。

下面是代码

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;
        }
    ```
spring-batch itemwriter
1个回答
0
投票

如果复合编写器对您不起作用,那么您可以使用自定义编写器吗,例如:

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部分中的说明在单个事务中执行。

© www.soinside.com 2019 - 2024. All rights reserved.