1.導入依賴:
<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>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.23</version>
</dependency>
<!-- csv依賴-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
`
2.創建數據庫,數據表,並且保證字段屬性要與實體類中數據類型對應 創建實體類:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Test {
Date time;
String base_station_name;
String integrity;
String energy_consumption;
String manufactor;
}
3.創建SpringBatch的配置類
@Configuration
public class CsvBatchJonConfig {
// 注入JobBuilderFactory,用來構建job
@Autowired
JobBuilderFactory jobBuilderFactory;
// 注入StepBuilderFactory,用來構建step
@Autowired
StepBuilderFactory stepBuilderFactory;
// 持久化操作----數據源
@Autowired
DataSource dataSource;
// 持久化操作----mybatis-plus
@Autowired
TestMapper testMapper;
// 配置一個ItemReader,即數據的讀取邏輯
@Bean
@StepScope
FlatFileItemReader<Test> itemReader() {
// FlatFileItemReader 是一個加載普通文件的 ItemReader
FlatFileItemReader<Test> reader = new FlatFileItemReader<>();
// 由於data.csv文件第一行是標題,因此通過setLinesToSkip方法設置跳過一行
reader.setLinesToSkip(2);
// setResource方法配置data.csv文件的位置
reader.setResource(new ClassPathResource("子報表.csv"));
// 通過setLineMapper方法設置每一行的數據信息
reader.setLineMapper(new DefaultLineMapper<Test>(){{
setLineTokenizer(new DelimitedLineTokenizer(){{
// setNames方法配置了data.csv文件一共有4列,分別是id、username、以及sex,
setNames("time","base_station_name","integrity","energy_consumption","manufactor");
// 配置列與列之間的間隔符(這里是空格)
setDelimiter(",");
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper(){{
setTargetType(Test.class);
}});
}});
return reader;
}
// 配置ItemWriter,即數據的寫出邏輯
@Bean
JdbcBatchItemWriter jdbcBatchItemWriter() {
// 使用的JdbcBatchltemWriter則是通過JDBC將數據寫出到一個關系型數據庫中。
JdbcBatchItemWriter writer = new JdbcBatchItemWriter();
// 配置使用的數據源
writer.setDataSource(dataSource);
// 配置數據插入SQL,注意占位符的寫法是":屬性名"
writer.setSql("insert into test(time,base_station_name,integrity,energy_consumption,manufactor) " +
"values(:time,:base_station_name,:integrity,:energy_consumption,:manufactor)");
// 最后通過BeanPropertyItemSqlParameterSourceProvider實例將實體類的屬性和SQL中的占位符一一映射
writer.setItemSqlParameterSourceProvider(
new BeanPropertyItemSqlParameterSourceProvider<>());
return writer;
}
// 配置一個Step
@Bean
Step csvStep() {
// Step通過stepBuilderFactory進行配置
return stepBuilderFactory.get("csvStep") //通過get獲取一個StepBuilder,參數數Step的name
.<Test, Test>chunk(2) //方法的參數2,表示每讀取到兩條數據就執行一次write操作
.reader(itemReader()) // 配置reader
.writer(jdbcBatchItemWriter()) // 配置writer
.build();
}
// 配置一個Job
@Bean
Job csvJob() {
// 通過jobBuilderFactory構建一個Job,get方法參數為Job的name
return jobBuilderFactory.get("csvJob")
.start(csvStep()) // 配置該Job的Step
.build();
}
}
`
4.主啟動類添加開啟springbatch
5.編寫一個controller接口進行測試
`
@RestController
public class Hello {
//JobLauncher 由框架提供
@Autowired
JobLauncher jobLauncher;
// Job 為剛才配置的
@Autowired
Job job;
@GetMapping("/hello")
public String hello(){
try {
JobParameters jobParameters = new JobParametersBuilder()
.toJobParameters();
// 通過調用 JobLauncher 中的 run 方法啟動一個批處理
jobLauncher.run(job, jobParameters);
} catch (Exception e) {
e.printStackTrace();
}
return "hello world";
}
}
`
6.完成!