簡體   English   中英

如何為 jdbc 使用復合文件寫入器或將數據寫入數據庫?

[英]How to use composite file writer for jdbc or writing data to database?

我已經編寫了一個用於寫入平面文件的復合項目編寫器,但是如果滿足某些條件,我也想在數據庫中寫入。 那么,我該怎么做……我是初學者。 請幫助..

復合文件寫入器 class:

@Component("CompositeFileWriter")

公共 class ChargeBackCompositeFileWriter 實現 ItemStreamWriter{

@Autowired
private PartOrderDao partOrderDao;

@Autowired
@Qualifier("errorFileWriter")
private ItemStreamWriter<ChargeBack> errorFileWriter;

@Autowired
@Qualifier("retryFileWriter")
private ItemStreamWriter<ChargeBack> retryFileWriter;



@Autowired
@Qualifier("processedFileWriter")
private ItemStreamWriter<ChargeBack> processedFileWriter;




@Override
public void write(List<? extends ChargeBack> items) throws Exception {
    
    
    
    List<ChargeBack> errorRecords = items.stream().filter(ChargeBack::isBadRecord).collect(Collectors.toList());

    List<ChargeBack> retryRecords = items.stream().filter(ChargeBack::isRetryRecord)
            .collect(Collectors.toList());
    
    List<ChargeBack> processedRecords = items.stream()
            .filter(chargeBack -> !chargeBack.isBadRecord())
            .filter(chargeBack-> !chargeBack.isRetryRecord())
            .collect(Collectors.toList());
    
    
    
    
    //ChargeBack chargeBack = new ChargeBack();

    if (CollectionUtils.isNotEmpty(errorRecords)) {
        errorFileWriter.write(errorRecords);
    }

    if (CollectionUtils.isNotEmpty(processedRecords)) {
        processedFileWriter.write(processedRecords);
    }
    
    if (CollectionUtils.isNotEmpty(retryRecords)) {
        
    }
}


@Override
public void open(ExecutionContext executionContext) throws ItemStreamException {
    errorFileWriter.open(executionContext);
    processedFileWriter.open(executionContext);
    //retryFileWriter.open(executionContext);
}

@Override
public void update(ExecutionContext executionContext) throws ItemStreamException {
    errorFileWriter.update(executionContext);
    processedFileWriter.update(executionContext);
    //retryFileWriter.update(executionContext);
}

@Override
public void close() throws ItemStreamException {
    errorFileWriter.close();
    processedFileWriter.close();
    //retryFileWriter.close();
}

}

批處理配置文件

@Bean
public ItemStreamWriter<ChargeBack> processedFileWriter(
        @Value("${processed.file}") FileSystemResource processedFile) {
    FlatFileItemWriter<ChargeBack> writer = new FlatFileItemWriter<>();
    writer.setResource(processedFile);
    writer.setLineAggregator(new DelimitedLineAggregator<ChargeBack>() {
        {
            setDelimiter("|");
            setFieldExtractor(new BeanWrapperFieldExtractor<ChargeBack>() {
                {
                    setNames(new String[] { ""
                              });
                }
            });
        }
    });
    return writer;
}

//for reading retry file and passing it, for writing record to the table.
@Bean
@StepScope
public FlatFileItemReader retryFileReader(@Value("${input.retryFile}") FileSystemResource inputFile){
    FlatFileItemReader reader = new FlatFileItemReader();
    reader.setResource(inputFile);
    reader.setLinesToSkip(0);
    reader.setStrict(false);
    reader.setLineMapper(new DefaultLineMapper(){
        {setFieldSetMapper(new BeanWrapperFieldSetMapper(){{
         setTargetType(ChargeBack.class);}});
         setLineTokenizer(new DelimitedLineTokenizer(){{
         setNames(new String[]{""});
         setDelimiter("|");}});}});
    return reader;
}


 @Bean
 public JdbcBatchItemWriter retryFileWriterToDB(){
     JdbcBatchItemWriter writer = new JdbcBatchItemWriter ();
     writer.setDataSource(pdccRepositoryConfig.pdccDataSource());
     writer.setSql(")" +
             " values (?, ?, ?, ? , ?, ?, ? , ?, ?, ? , ?, ?, ?, ?, ? ) ");
     writer.setItemPreparedStatementSetter(new ItemPreparedStatementSetter<ChargeBack>() {
         @Override
         public void setValues(ChargeBack item, PreparedStatement ps) throws SQLException {
             ps.setString(1, item.getAccertifyCBControlNumber().toString());
             ps.setString(2,item.getInternalComment2());
             ps.setString(3, item.getDisputeType());
             ps.setString(4, item.getBrand());
             ps.setString(5,item.getResolution1ts());
             ps.setString(6, item.getReasonCode());
             ps.setString(7, item.getReasonDescription());
             ps.setString(8,item.getWonLossStatus());
             ps.setString(9, item.getDisputedDate());
             ps.setString(10, Double.toString(item.getDisputedAmount()));
             ps.setString(11, item.getReportingGroup());
             ps.setString(12, item.getDueDate());
             ps.setString(13,item.getLocation());
             ps.setString(14, item.getResolution1ts());
             ps.setString(15, item.getTransactionDate());
            
         }

        
     });

     return writer;

 }

我目前正在使用上面的 jdbcbatchitemwriter 在數據庫中單獨編寫,但我希望它被 streamitemwriter 使用,所以我可以同時編寫,而不是單獨編寫。 我的問題是我想使用這個 jdbcbatchitemwriter 供 streamitemwriter 使用,就像上面我使用平面文件項目編寫器一樣。 如果我不能在 streamwriter 中使用 jdbcbatchitemwriter 那么下一個解決方案是什么。 如果可能的話,請詳細說明..

因此,要將 JDBCitemwriter 與 Compositeitemwriter 一起使用,只需讓您的 JdbcitemWriter 返回類型為 itemwriter。

 @Bean 
 public ItemWriter retryFileWriterToDB(){
  JdbcBatchItemWriter writer = new JdbcBatchItemWriter ();
     writer.setDataSource(pdccRepositoryConfig.pdccDataSource());
     writer.setSql("insert into failed_forter_claim_api_order (accertify_cb_control_number, internal_comment2, dispute_type, brand, resolution1_name, reason_code, reason_description, won_loss_status, disputed_date, disputed_amount, reporting_group, due_date, location, resolution1_ts, transaction_date)" +
             " values (?, ?, ?, ? , ?, ?, ? , ?, ?, ? , ?, ?, ?, ?, ? ) ");
     writer.setItemPreparedStatementSetter(new ItemPreparedStatementSetter<ChargeBack>() {
         @Override
         public void setValues(ChargeBack item, PreparedStatement ps) throws SQLException {
             ps.setString(1, item.getAccertifyCBControlNumber().toString());
             ps.setString(2,item.getInternalComment2());
             ps.setString(3, item.getDisputeType());
             ps.setString(4, item.getBrand());
             ps.setString(5,item.getResolution1ts());
             ps.setString(6, item.getReasonCode());
             ps.setString(7, item.getReasonDescription());
             ps.setString(8,item.getWonLossStatus());
             ps.setString(9, item.getDisputedDate());
             ps.setString(10, Double.toString(item.getDisputedAmount()));
             ps.setString(11, item.getReportingGroup());
             ps.setString(12, item.getDueDate());
             ps.setString(13,item.getLocation());
             ps.setString(14, item.getResolution1ts());
             ps.setString(15, item.getTransactionDate());
            
         }

        
     });

     return writer;

 }
  1. 在您的compositeItemwriter 中自動裝配,如下所示,您可以更喜歡retryFileWriterToDB 作為關鍵字,我如何在下面的代碼中使用它。

@Component("CompositeFileWriter") public class ChargeBackCompositeFileWriter 實現 ItemStreamWriter{

@Autowired
private PartOrderDao partOrderDao;

@Autowired
@Qualifier("errorFileWriter")
private ItemStreamWriter<ChargeBack> errorFileWriter;

@Autowired
@Qualifier("retryFileWriterToDB")
private ItemWriter<ChargeBack> retryFileWriterToDB;



@Autowired
@Qualifier("processedFileWriter")
private ItemStreamWriter<ChargeBack> processedFileWriter;




@Override
public void write(List<? extends ChargeBack> items) throws Exception {
    

    
    List<ChargeBack> errorRecords = items.stream().filter(ChargeBack::isBadRecord).collect(Collectors.toList());

    List<ChargeBack> retryRecords = items.stream().filter(ChargeBack::isRetryRecord)
            .collect(Collectors.toList());
    
    List<ChargeBack> processedRecords = items.stream()
            .filter(chargeBack -> !chargeBack.isBadRecord())
            .filter(chargeBack-> !chargeBack.isRetryRecord())
            .collect(Collectors.toList());
    
    
    
    
    //ChargeBack chargeBack = new ChargeBack();

    if (CollectionUtils.isNotEmpty(errorRecords)) {
        errorFileWriter.write(errorRecords);
    }

    if (CollectionUtils.isNotEmpty(processedRecords)) {
        processedFileWriter.write(processedRecords);

    }
    
    if (CollectionUtils.isNotEmpty(retryRecords)) {
        
        System.out.println("writing ti DB:..");
    //  System.out.println("Calling partdao.......");
        //partOrderDao.insertFailedRecord(retryRecords);
        retryFileWriterToDB.write(retryRecords);
    }
}


@Override
public void open(ExecutionContext executionContext) throws ItemStreamException {
    errorFileWriter.open(executionContext);
    processedFileWriter.open(executionContext);
    //((ItemStream) retryFileWriter).open(executionContext);
}

@Override
public void update(ExecutionContext executionContext) throws ItemStreamException {
    errorFileWriter.update(executionContext);
    processedFileWriter.update(executionContext);
    //((ItemStream) retryFileWriter).update(executionContext);
}

@Override
public void close() throws ItemStreamException {
    errorFileWriter.close();
    processedFileWriter.close();
    //((ItemStream) retryFileWriter).close();
}

}

Rest 所有代碼都相同,粘貼在問題中。 在 batchCONfig 文件中,我只是更改了 jdbcitemwriter 的返回類型,在 Compositewriter class 中我已經自動連接了這個 jdbcitemwriter,就像這樣@Autowired @Qualifier("retryFileWriterToDB") private ItemWriter<ChargeBack> retryFileWriterToDB; 並在復合作家 class 中使用它作為

        retryFileWriterToDB.write(retryRecords);
    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM