Spring Boot 3.0.1中Spring Batch无法将CSV数据导入MySQL问题
Spring Boot 3.0.1 Spring Batch CSV导入MySQL无数据插入(无报错)
我用Spring Boot 3.0.1开发Spring Batch导入CSV到MySQL的项目,已完成Reader、Writer、Processor、Step和Job的配置,采用Spring Boot 3.0废弃旧的JobBuilderFactory/StepBuilderFactory后的新实现方式。运行后数据库表已创建,但数据未插入,且无任何报错。
配置类BatchConfig
@Configuration @EnableBatchProcessing public class BatchConfig { @Autowired private PlayerRepository playerRepository; @Bean public FlatFileItemReader<Player> reader() { FlatFileItemReader<Player> reader=new FlatFileItemReader<Player>(); reader.setResource(new ClassPathResource("People.csv")); reader.setLineMapper(getLineMapper()); reader.setLinesToSkip(1);//Skip header line return reader; } private LineMapper<Player> getLineMapper() { DefaultLineMapper<Player> lineMapper = new DefaultLineMapper<Player>(); DelimitedLineTokenizer lineTokenizer=new DelimitedLineTokenizer(); lineTokenizer.setNames(new String[] {"playerID","birthYear","","","","","birthCity","","","","","","","nameFirst","nameLast","","","","","","","","retroID","bbrefID"}); lineTokenizer.setIncludedFields(new int[] {0,1,6,13,14,22,23}); BeanWrapperFieldSetMapper<Player> fieldSetMapper=new BeanWrapperFieldSetMapper<Player>(); fieldSetMapper.setTargetType(Player.class); lineMapper.setLineTokenizer(lineTokenizer); lineMapper.setFieldSetMapper(fieldSetMapper); return lineMapper; } @Bean public PlayerItemProcessor processor() { return new PlayerItemProcessor(); } @Bean public ItemWriter<Player> writer() { return player-> { playerRepository.saveAll(player); }; } @Bean public Job importPlayerJob(JobRepository jobRepository,Step step1) { return new JobBuilder("PLAYER-IMPORT-JOB",jobRepository) .incrementer(new RunIdIncrementer()) .flow(step1) .end() .build(); } @Bean public Step step1(JobRepository jobRepository,JpaTransactionManager jpaTransactionManager) { return new StepBuilder("step1",jobRepository) .<Player,Player>chunk(10,jpaTransactionManager) .reader(reader()) .processor(processor()) .writer(writer()) .build(); } }
PlayerItemProcessor
package com.aryan.batch.config; import org.springframework.batch.item.ItemProcessor; import com.aryan.batch.modal.Player; public class PlayerItemProcessor implements ItemProcessor<Player, Player> { @Override public Player process(Player player) throws Exception { return player; } }
Player实体类
package com.aryan.batch.modal; import jakarta.persistence.Entity; import jakarta.persistence.Id; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor @Entity public class Player { @Id private String playerId; int birthYear; String birthCity; String nameFirst; String nameLast; String retroID; String bbrefID; }
PlayerRepository
import org.springframework.data.jpa.repository.JpaRepository; import com.aryan.batch.modal.Player; public interface PlayerRepository extends JpaRepository<Player, String> { }
application.yml配置
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/batchdemo username: hbstudent password: hbstudent batch: jdbc: initialize-schema: always jpa: show-sql: true hibernate: ddl-auto: update
排查方向与解决方案
Job未触发执行
Spring Boot默认不会自动执行Job,需手动触发。添加以下配置类,让项目启动时自动执行Job:@Component public class JobRunner implements ApplicationRunner { @Autowired private JobLauncher jobLauncher; @Autowired private Job importPlayerJob; @Override public void run(ApplicationArguments args) throws Exception { JobParameters jobParameters = new JobParametersBuilder() .addLong("time", System.currentTimeMillis()) .toJobParameters(); jobLauncher.run(importPlayerJob, jobParameters); } }CSV文件与字段映射问题
- 确认
People.csv放在src/main/resources目录下,文件名大小写与代码中一致(Linux/Mac环境大小写敏感)。 - 检查CSV列分隔符,若不是逗号,需在
DelimitedLineTokenizer中设置:lineTokenizer.setDelimiter("\t");(示例为制表符)。 - 实体类
playerId与CSV字段playerID大小写不一致,BeanWrapperFieldSetMapper默认大小写敏感,可配置忽略:
或修改实体类字段名为fieldSetMapper.setStrict(false);playerID,与CSV字段名完全匹配。
- 确认
日志排查
添加详细日志配置,查看Batch执行流程:logging: level: org.springframework.batch: DEBUG org.springframework.jdbc: DEBUG通过日志确认Job是否启动、Reader是否读取到数据、Writer是否执行等关键节点。
事务与主键检查
确认JpaTransactionManager配置正确,排查是否存在主键重复导致的静默回滚(可通过日志或手动插入测试数据验证主键唯一性)。
内容的提问来源于stack exchange,提问作者Aryan Singh
相关产品推荐
相关产品推荐

