【问题标题】:Spring Batch read from one table and insert into anotherSpring Batch 从一个表中读取并插入到另一个表中
【发布时间】:2020-07-27 20:07:32
【问题描述】:

我使用 Spring Boot 和 Spring Batch 读取并插入两个不同的表。

jdbc 游标在下面的代码 sn-p 中逐条读取,不知道如何将其保存到逐条插入语句中。

     @Bean
    public JdbcCursorItemReader<Studdetail> jdbcitemReader()  {

        JdbcCursorItemReader<Studdetail> jdbcItemReader = new JdbcCursorItemReader<>();
        
        jdbcItemReader.setDataSource(dataSource);
        
        jdbcItemReader.setSql("SELECT * FROM Schema1.Table1");
        
        jdbcItemReader.setRowMapper(new StuddetailRowMapper());
        
        int counter = 0;
        
        ExecutionContext executionContext = new ExecutionContext();
        
        jdbcItemReader.open(executionContext);
        
        Object Studdetail = new Studetail();
        
        while(Studdetail != null){
            
        try {
        
        Studdetail = jdbcItemReader.read();

                   jdbcitemWriter() ;
        
        } catch (UnexpectedInputException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }
            counter++;
           }
    
        jdbcItemReader.close();
        
        return jdbcItemReader;
    }
    
 
 private static final String QUERY_INSERT_STUDENT = "INSERT " + "INTO Schema2.Table2(Column1,Column2,Column3,Column4,Column5,Column6) " + "VALUES(:ID1,:ID2,:ID3,:ID4,:ID5,:ID6)";
    
    @Bean
    public ItemWriter<Studdetail> jdbcitemWriter()  {
        
        JdbcBatchItemWriter<Studdetail> jdbcItemWriter= new JdbcBatchItemWriter<>();
        
        jdbcItemWriter.setDataSource(dataSource);
        
        jdbcItemWriter.setSql(QUERY_INSERT_STUDENT);
        
        ItemSqlParameterSourceProvider<Studdetail> paramProvider = new BeanPropertyItemSqlParameterSourceProvider<>();
        
        jdbcItemWriter.setItemSqlParameterSourceProvider(paramProvider);

        return jdbcItemWriter;
        
    }   
    

记录在 jdbcitemReader() 的 Studdetail 中填充,但无法插入。 没有错误或异常,我知道插入时丢失了一些东西。有什么建议吗?

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

    你正在同时阅读和写作,也许你应该拆分任务ItemReader和ItemWriter。

    @Bean
    public Job sampleJob() {
        return this.jobBuilderFactory.get("sampleJob")
                    .start(step1())
                    .end()
                    .build();
    }
    
    @Bean
    public Step step1() {
        return this.stepBuilderFactory.get("step1")
                    .<String, String>chunk(2)
                    .reader(itemReader())
                    .writer(databaseItemWriter())
                    .build();
    }
    
    @Bean
    public JdbcCursorItemReader<Studdetail> itemReader() {
        return new JdbcCursorItemReaderBuilder<Studdetail>()
                .dataSource(this.dataSource)
                .name("studdetail")
                .sql("SELECT * FROM Schema1.Table1")
                .rowMapper(new StuddetailRowMapper())
                .build();
    
    }
    private static final String QUERY_INSERT_STUDENT = "INSERT " + "INTO Schema2.Table2(Column1,Column2,Column3,Column4,Column5,Column6) " + "VALUES(:ID1,:ID2,:ID3,:ID4,:ID5,:ID6)";
    
    @Bean
    public ItemWriter<Studdetail> databaseItemWriter() {
        JdbcBatchItemWriter<Studdetail> databaseItemWriter = new JdbcBatchItemWriter<>();
        databaseItemWriter.setDataSource(dataSource);
        databaseItemWriter.setJdbcTemplate(jdbcTemplate);
    
        databaseItemWriter.setSql(QUERY_INSERT_STUDENT);
    
        return databaseItemWriter;
    }
    

    【讨论】:

    • 谢谢你..它在分离读者和作家后工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多