package demo; import javax.sql.DataSource; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemWriter; import org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider; import org.springframework.batch.item.database.JdbcBatchItemWriter; import org.springframework.batch.item.file.FlatFileItemReader; import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; import org.springframework.batch.item.file.mapping.DefaultLineMapper; import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; import org.springframework.boot.autoconfigure.batch.JobExecutionEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; @Configuration public class ContactBatchJobConfiguration { @Bean public ItemProcessor<Contact, Contact> processor() { return (person) -> new Contact(person.getFirstName(), person.getLastName(), person.getEmail().toLowerCase()); } @Bean public ItemReader<Contact> reader() { FlatFileItemReader<Contact> reader = new FlatFileItemReader<>(); reader.setResource(new ClassPathResource("data.csv")); reader.setLineMapper(new DefaultLineMapper<Contact>() { { setLineTokenizer(new DelimitedLineTokenizer() { { setNames(new String[] { "firstName", "lastName", "email" }); } }); setFieldSetMapper(new BeanWrapperFieldSetMapper<Contact>() { { setTargetType(Contact.class); } }); } }); return reader; } @Bean public ItemWriter<Contact> writer(DataSource dataSource) { JdbcBatchItemWriter<Contact> writer = new JdbcBatchItemWriter<>(); writer.setItemSqlParameterSourceProvider( new BeanPropertyItemSqlParameterSourceProvider<>()); writer.setSql("INSERT INTO contact (first_name, last_name, email) " + "VALUES (:firstName, :lastName, :email)"); writer.setDataSource(dataSource); return writer; } @Bean public Job importUserJob(JobBuilderFactory jobs, Step s1) { return jobs.get("importUserJob").incrementer(new RunIdIncrementer()).flow(s1) .end().build(); } @Bean public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader<Contact> reader, ItemWriter<Contact> writer, ItemProcessor<Contact, Contact> processor) { return stepBuilderFactory.get("step1").<Contact, Contact>chunk(10).reader(reader) .processor(processor).writer(writer).build(); } @Bean public JdbcTemplate jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } @Component public static class BatchJobFinishedListener implements ApplicationListener<JobExecutionEvent> { private final JdbcTemplate jdbcTemplate; public BatchJobFinishedListener(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Override public void onApplicationEvent(JobExecutionEvent event) { System.out.println("finished " + event.getJobExecution().toString()); this.jdbcTemplate .query("SELECT first_name, last_name, email FROM contact", (rs, i) -> new Contact(rs.getString("first_name"), rs.getString("last_name"), rs.getString("email"))) .forEach(System.out::println); } } }