springspring-batch

Writing in multiple unrelated tables in spring batch writer


Can we have a writer which will write in 2 different unrelated tables simultaneously in spring batch? Actually, Along with the main data I need to store some metadata in a different table. How can I go about it?


Solution

  • Please find below . Let say you have 3 tables to write

    @Bean
        public CompositeItemWriter compositeWriter() throws Exception {
            CompositeItemWriter compositeItemWriter = new CompositeItemWriter();
            List<ItemWriter> writers = new ArrayList<ItemWriter>();
            writers.add(firstTableWriter());
            writers.add(secondTableWriter());
            writers.add(thirdTableWriter());
            compositeItemWriter.setDelegates(writers);
            return compositeItemWriter;
        }
    
        @Bean
        public JdbcBatchItemWriter<YourDTO> firstTableWriter() {
            JdbcBatchItemWriter<YourDTO> databaseItemWriter = new JdbcBatchItemWriter<>();
            databaseItemWriter.setDataSource(dataSource);
            databaseItemWriter.setSql("INSERT INTO FIRSTTABLE");
            ItemPreparedStatementSetter<YourDTO> invoicePreparedStatementSetter = new FirstTableSetter();
            databaseItemWriter.setItemPreparedStatementSetter(invoicePreparedStatementSetter);
            return databaseItemWriter;
        }
    
        @Bean
        public JdbcBatchItemWriter<YourDTO> secondTableWriter() {
            JdbcBatchItemWriter<YourDTO> databaseItemWriter = new JdbcBatchItemWriter<>();
            databaseItemWriter.setDataSource(dataSource);
            databaseItemWriter.setSql("INSERT INTO SECOND TABLE");
            ItemPreparedStatementSetter<YourDTO> invoicePreparedStatementSetter = new SecondTableSetter();
            databaseItemWriter.setItemPreparedStatementSetter(invoicePreparedStatementSetter);
            return databaseItemWriter;
        }
    
        @Bean
        public JdbcBatchItemWriter<YourDTO> thirdTableWriter() {
            JdbcBatchItemWriter<YourDTO> databaseItemWriter = new JdbcBatchCustomItemWriter<>();
            databaseItemWriter.setDataSource(dataSource);
            databaseItemWriter.setSql("INSERT INTO THIRD TABLE");
            ItemPreparedStatementSetter<YourDTO> invoicePreparedStatementSetter = new ThirdTableSetter();
            databaseItemWriter.setItemPreparedStatementSetter(invoicePreparedStatementSetter);
            return databaseItemWriter;
        }
    
        //SettterClass Example
        public class FirstTableSetter implements ItemPreparedStatementSetter<YourDTO> {
        
    
        @Override
        public void setValues(YourDTO yourDTO, PreparedStatement preparedStatement) throws SQLException {
            preparedStatement.setString(1, yourDTO.getMyValue());
        }
        }