From 1991d56d1b89fc10752b8242463a6d1a3fafa722 Mon Sep 17 00:00:00 2001 From: Mahmoud Ben Hassine Date: Thu, 8 Mar 2018 12:18:08 -0600 Subject: [PATCH] Use builders for reader/writers --- .../main/java/hello/BatchConfiguration.java | 59 +++++++++---------- .../JobCompletionNotificationListener.java | 22 ++----- complete/src/main/java/hello/Person.java | 2 +- 3 files changed, 34 insertions(+), 49 deletions(-) diff --git a/complete/src/main/java/hello/BatchConfiguration.java b/complete/src/main/java/hello/BatchConfiguration.java index 8c776cd02b..da10fbb89f 100644 --- a/complete/src/main/java/hello/BatchConfiguration.java +++ b/complete/src/main/java/hello/BatchConfiguration.java @@ -11,7 +11,9 @@ import org.springframework.batch.core.configuration.annotation.StepBuilderFactor import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider; import org.springframework.batch.item.database.JdbcBatchItemWriter; +import org.springframework.batch.item.database.builder.JdbcBatchItemWriterBuilder; import org.springframework.batch.item.file.FlatFileItemReader; +import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder; import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; import org.springframework.batch.item.file.mapping.DefaultLineMapper; import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; @@ -31,23 +33,18 @@ public class BatchConfiguration { @Autowired public StepBuilderFactory stepBuilderFactory; - @Autowired - public DataSource dataSource; - // tag::readerwriterprocessor[] @Bean public FlatFileItemReader reader() { - FlatFileItemReader reader = new FlatFileItemReader(); - reader.setResource(new ClassPathResource("sample-data.csv")); - reader.setLineMapper(new DefaultLineMapper() {{ - setLineTokenizer(new DelimitedLineTokenizer() {{ - setNames(new String[] { "firstName", "lastName" }); - }}); - setFieldSetMapper(new BeanWrapperFieldSetMapper() {{ + return new FlatFileItemReaderBuilder() + .name("personItemReader") + .resource(new ClassPathResource("sample-data.csv")) + .delimited() + .names(new String[]{"firstName", "lastName"}) + .fieldSetMapper(new BeanWrapperFieldSetMapper() {{ setTargetType(Person.class); - }}); - }}); - return reader; + }}) + .build(); } @Bean @@ -56,34 +53,34 @@ public class BatchConfiguration { } @Bean - public JdbcBatchItemWriter writer() { - JdbcBatchItemWriter writer = new JdbcBatchItemWriter(); - writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); - writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)"); - writer.setDataSource(dataSource); - return writer; + public JdbcBatchItemWriter writer(DataSource dataSource) { + return new JdbcBatchItemWriterBuilder() + .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>()) + .sql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)") + .dataSource(dataSource) + .build(); } // end::readerwriterprocessor[] // tag::jobstep[] @Bean - public Job importUserJob(JobCompletionNotificationListener listener) { + public Job importUserJob(JobCompletionNotificationListener listener, Step step1) { return jobBuilderFactory.get("importUserJob") - .incrementer(new RunIdIncrementer()) - .listener(listener) - .flow(step1()) - .end() - .build(); + .incrementer(new RunIdIncrementer()) + .listener(listener) + .flow(step1) + .end() + .build(); } @Bean - public Step step1() { + public Step step1(JdbcBatchItemWriter writer) { return stepBuilderFactory.get("step1") - . chunk(10) - .reader(reader()) - .processor(processor()) - .writer(writer()) - .build(); + . chunk(10) + .reader(reader()) + .processor(processor()) + .writer(writer) + .build(); } // end::jobstep[] } diff --git a/complete/src/main/java/hello/JobCompletionNotificationListener.java b/complete/src/main/java/hello/JobCompletionNotificationListener.java index e66aca5da8..577fc70635 100644 --- a/complete/src/main/java/hello/JobCompletionNotificationListener.java +++ b/complete/src/main/java/hello/JobCompletionNotificationListener.java @@ -1,18 +1,12 @@ package hello; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import org.springframework.batch.core.BatchStatus; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.listener.JobExecutionListenerSupport; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; @Component @@ -32,17 +26,11 @@ public class JobCompletionNotificationListener extends JobExecutionListenerSuppo if(jobExecution.getStatus() == BatchStatus.COMPLETED) { log.info("!!! JOB FINISHED! Time to verify the results"); - List results = jdbcTemplate.query("SELECT first_name, last_name FROM people", new RowMapper() { - @Override - public Person mapRow(ResultSet rs, int row) throws SQLException { - return new Person(rs.getString(1), rs.getString(2)); - } - }); - - for (Person person : results) { - log.info("Found <" + person + "> in the database."); - } - + jdbcTemplate.query("SELECT first_name, last_name FROM people", + (rs, row) -> new Person( + rs.getString(1), + rs.getString(2)) + ).forEach(person -> log.info("Found <" + person + "> in the database.")); } } } diff --git a/complete/src/main/java/hello/Person.java b/complete/src/main/java/hello/Person.java index 745c739150..d115ea8496 100644 --- a/complete/src/main/java/hello/Person.java +++ b/complete/src/main/java/hello/Person.java @@ -1,11 +1,11 @@ package hello; public class Person { + private String lastName; private String firstName; public Person() { - } public Person(String firstName, String lastName) {