Java springboot整合springbatch實現讀取csv,並寫入數據庫


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.完成!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM