Spring Batch代码案例
时间: 2023-07-03 11:27:24 浏览: 59
Spring Batch是一个轻量级的批处理框架,可以帮助我们高效地处理大量数据。下面是一个简单的Spring Batch的示例代码,它会读取一个CSV文件,并把数据写入到数据库中。
首先,我们需要定义一个数据模型类,表示CSV文件中的一行数据:
```java
public class User {
private String name;
private int age;
private String email;
// 省略getter和setter方法
}
```
接下来,我们需要定义一个ItemReader,用于读取CSV文件中的数据:
```java
public class UserItemReader implements ItemReader<User> {
private final String inputFilePath;
private boolean read;
public UserItemReader(String inputFilePath) {
this.inputFilePath = inputFilePath;
}
@Override
public User read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
if (!read) {
read = true;
BufferedReader reader = new BufferedReader(new FileReader(inputFilePath));
reader.readLine(); // 跳过第一行标题行
String line = reader.readLine();
if (line != null) {
String[] fields = line.split(",");
User user = new User();
user.setName(fields[0]);
user.setAge(Integer.parseInt(fields[1]));
user.setEmail(fields[2]);
return user;
}
}
return null;
}
}
```
上述代码中,我们使用BufferedReader读取CSV文件中的数据,并把数据解析为User对象。在read()方法中,我们使用了一个read标志位,保证只读取一次数据。
接下来,我们需要定义一个ItemWriter,用于把数据写入到数据库中:
```java
public class UserItemWriter implements ItemWriter<User> {
private final JdbcTemplate jdbcTemplate;
public UserItemWriter(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public void write(List<? extends User> items) throws Exception {
for (User user : items) {
jdbcTemplate.update("INSERT INTO user (name, age, email) VALUES (?, ?, ?)",
user.getName(), user.getAge(), user.getEmail());
}
}
}
```
上述代码中,我们使用JdbcTemplate执行SQL语句,把数据写入到数据库中。
最后,我们需要定义一个Job,把ItemReader、ItemWriter和数据处理逻辑串联起来:
```java
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Autowired
public BatchConfiguration(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
this.jobBuilderFactory = jobBuilderFactory;
this.stepBuilderFactory = stepBuilderFactory;
}
@Bean
public ItemReader<User> userItemReader() {
return new UserItemReader("input.csv");
}
@Bean
public ItemWriter<User> userItemWriter(DataSource dataSource) {
return new UserItemWriter(dataSource);
}
@Bean
public Step step1(ItemReader<User> userItemReader, ItemWriter<User> userItemWriter) {
return stepBuilderFactory.get("step1")
.<User, User>chunk(10)
.reader(userItemReader)
.writer(userItemWriter)
.build();
}
@Bean
public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
return jobBuilderFactory.get("importUserJob")
.incrementer(new RunIdIncrementer())
.listener(listener)
.flow(step1)
.end()
.build();
}
}
```
上述代码中,我们使用@EnableBatchProcessing注解启用Spring Batch,并定义了一个Job和一个Step。在Step中,我们指定了ItemReader和ItemWriter,以及每次处理的数据量(chunk)。在Job中,我们把Step串联起来,并指定了Job的名称和ID。
最后,我们还需要定义一个JobCompletionNotificationListener,用于在任务完成时输出一些信息:
```java
public class JobCompletionNotificationListener extends JobExecutionListenerSupport {
private final JdbcTemplate jdbcTemplate;
@Autowired
public JobCompletionNotificationListener(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public void afterJob(JobExecution jobExecution) {
if (jobExecution.getStatus() == BatchStatus.COMPLETED) {
System.out.println("Job completed successfully!");
int count = jdbcTemplate.queryForObject("SELECT COUNT(*) FROM user", Integer.class);
System.out.println("Total users inserted: " + count);
}
}
}
```
上述代码中,我们在任务完成时统计了插入的数据量,并输出到控制台。
这就是一个简单的Spring Batch的示例代码,它可以帮助你快速入门Spring Batch。