【问题标题】:Spring-Batch: Item writer for Parent-Child relationshipSpring-Batch:父子关系的项目编写器
【发布时间】:2020-04-03 15:03:29
【问题描述】:

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

下面是代码

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;
        }
    ```

【问题讨论】:

  • 我添加了一个答案(和一个评论来回答你的第二个问题)。如果有帮助,请接受答案:stackoverflow.com/help/someone-answers。

标签: spring-batch itemwriter


【解决方案1】:

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

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 部分所述。

【讨论】:

  • 谢谢马哈茂德。您的意见肯定会有很大帮助。干杯,BR
  • 不错不错。如果有帮助,请采纳答案:stackoverflow.com/help/someone-answers.
  • 这个设计中的一个问题是性能,每次更新都会调用DB,这将调用性能问题。如何执行批量更新?谢谢BR
  • 不,所有报表都会有一个事务。我编辑了答案以添加此注释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多