请给我一个springbatch项目,第一步读出一些数据,第二步把读出的数据写表的例子
时间: 2024-03-27 15:35:31 浏览: 215
好的,以下是一个简单的 Spring Batch 项目示例,其中包含一些数据读取和写入表的步骤:
首先,我们需要创建一个名为 `BatchConfiguration` 的类,该类将配置 Spring Batch:
```java
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Bean
public FlatFileItemReader<Person> reader() {
FlatFileItemReader<Person> reader = new FlatFileItemReader<>();
reader.setResource(new ClassPathResource("persons.csv"));
reader.setLineMapper(new DefaultLineMapper<Person>() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames(new String[] { "firstName", "lastName" });
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
setTargetType(Person.class);
}});
}});
return reader;
}
@Bean
public JdbcBatchItemWriter<Person> writer(DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<Person>()
.itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
.sql("INSERT INTO person (first_name, last_name) VALUES (:firstName, :lastName)")
.dataSource(dataSource)
.build();
}
@Bean
public Step step1(JdbcBatchItemWriter<Person> writer) {
return stepBuilderFactory.get("step1")
.<Person, Person>chunk(10)
.reader(reader())
.writer(writer)
.build();
}
@Bean
public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
return jobBuilderFactory.get("importUserJob")
.incrementer(new RunIdIncrementer())
.listener(listener)
.flow(step1)
.end()
.build();
}
}
```
在上面的代码中,我们定义了一个名为 `reader` 的 `FlatFileItemReader` bean,它将从名为 `persons.csv` 的 CSV 文件中读取数据,并将每行映射到一个 `Person` 对象中。然后我们定义了一个名为 `writer` 的 `JdbcBatchItemWriter` bean,它将数据写入 `person` 表中。最后,我们定义了一个名为 `step1` 的步骤,它使用 `reader` 和 `writer` 来读取和写入数据。我们还定义了一个名为 `importUserJob` 的作业,它包含一个步骤 `step1`。
接下来,我们需要创建一个名为 `Person` 的简单 Java 类,用于存储读取的 CSV 数据:
```java
public class Person {
private String firstName;
private String lastName;
// getters and setters
}
```
最后,我们需要创建一个名为 `JobCompletionNotificationListener` 的类,它将在作业完成时输出一些日志:
```java
@Component
public class JobCompletionNotificationListener extends JobExecutionListenerSupport {
private static final Logger log = LoggerFactory.getLogger(JobCompletionNotificationListener.class);
private final JdbcTemplate jdbcTemplate;
@Autowired
public JobCompletionNotificationListener(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public void afterJob(JobExecution jobExecution) {
if (jobExecution.getStatus() == BatchStatus.COMPLETED) {
log.info("Job completed successfully!");
List<Person> results = jdbcTemplate.query("SELECT first_name, last_name FROM person", new RowMapper<Person>() {
@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: " + person.getFirstName() + " " + person.getLastName());
}
}
}
}
```
在上面的代码中,我们定义了一个名为 `JobCompletionNotificationListener` 的 bean,它在作业完成时查询 `person` 表并输出日志。
现在,我们可以运行这个 Spring Batch 项目,它将读取 `persons.csv` 文件中的数据,并将它们写入 `person` 表中。
阅读全文