现有一个data.csv文件如下所示,通过批处理框架读取data.csv并将之插入数据表中
id username address gender
1 张三 深圳 男
2 里斯 广州 男
3 王五 广州 男
4 赵六 北京 女
- 创建一个Spring Boot工程,添加如下倚赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-test</artifactId>
<scope>test</scope>
</dependency>
- 配置文件
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql:///batch
#项目启动时的建表sql脚本,该脚本由Spring Batch提供
spring.datasource.schema=classpath:/org/springframework/batch/core/schema-mysql.sql
#在项目启动时进行执行建表sql
spring.batch.initialize-schema=always
#禁止Spring Batch自动执行,既需要用户触发才能执行
spring.batch.job.enabled=false
#spring.batch.job.names=parentJob
3.启动类添加 @EnableBatchProcessing 以开启Spring Batch支持
@SpringBootApplication
@EnableBatchProcessing
public class BatchApplication {
public static void main(String[] args) {
SpringApplication.run(BatchApplication.class, args);
}
}
- 配置批处理
import org.springframework.batch.core.*;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepScope;
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.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import javax.sql.DataSource;
@Configuration
public class CsvBatchJobConfig {
@Autowired
JobBuilderFactory jobBuilderFactory;
@Autowired
StepBuilderFactory stepBuilderFactory;
@Autowired
DataSource dataSource;//构建持久化操作这里使用Spring-Jdbc
//配置itemReader,即数据的写入逻辑
@Bean
@StepScope
FlatFileItemReader<User> itemReader() {
//FlatFileItemReader是一个用来加载文件的itemReader
FlatFileItemReader<User> reader = new FlatFileItemReader<>();
reader.setLinesToSkip(1); //跳过第一行的标题
reader.setResource(new ClassPathResource("data.csv")); //设置csv的位置
//设置每一行的数据信息
reader.setLineMapper(new DefaultLineMapper<User>(){{
setLineTokenizer(new DelimitedLineTokenizer(){{
setNames("id","username","address","gender"); //配置了四行文件
setDelimiter("\t");//配置列于列之间的间隔符,会通过间隔符对每一行进行切分
}});
//设置要映射的实体类属性
setFieldSetMapper(new BeanWrapperFieldSetMapper<User>(){{
setTargetType(User.class);
}});
}});
return reader;
}
//配置itemWriter写出逻辑
@Bean
JdbcBatchItemWriter jdbcBatchItemWriter() {
//通过Jdbc写入到数据库中
JdbcBatchItemWriter writer = new JdbcBatchItemWriter();
writer.setDataSource(dataSource);
//其中占位符的写法是 :属性名
writer.setSql("insert into user(id,username,address,gender) " +
"values(:id,:username,:address,:gender)");
//setItemSqlParameterSourceProvider 表示将实体类中的属性和占位符一一映射
writer.setItemSqlParameterSourceProvider(
new BeanPropertyItemSqlParameterSourceProvider<>());
return writer;
}
//配置一个Step
@Bean
Step csvStep() {
//下面的csvStep和上面的一直,chunk的配置表示每读到两条数据进行一次写操作
return stepBuilderFactory.get("csvStep")
.<User, User>chunk(2)
.reader(itemReader())
.writer(jdbcBatchItemWriter())
.build();
}
//配置一个Job
@Bean
Job csvJob() {
return jobBuilderFactory.get("csvJob")
.start(csvStep())
.build();
}
}
- User实体类
public class User {
private Integer id;
private String username;
private String address;
private String gender;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", address='" + address + '\'' +
", gender='" + gender + '\'' +
'}';
}
//getter setter
- 创建一个Controller请求时来触发任务
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
//JobLauncher由框架提供
@Autowired
JobLauncher jobLauncher;
@Autowired
Job job;
@GetMapping("/hello")
public void hello() {
try {
jobLauncher.run(job, new JobParametersBuilder().toJobParameters());//执行一个批处理任务
} catch (Exception e) {
e.printStackTrace();
}
}
}
-按照User类创建user表,启动项目,可以看到其它表也会自动创建,请求http://localhost:8080/hello ,可以看到数据被成功写入