You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

排查方向与解决方案

  1. 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);
        }
    }
    
  2. CSV文件与字段映射问题

    • 确认People.csv放在src/main/resources目录下,文件名大小写与代码中一致(Linux/Mac环境大小写敏感)。
    • 检查CSV列分隔符,若不是逗号,需在DelimitedLineTokenizer中设置:lineTokenizer.setDelimiter("\t");(示例为制表符)。
    • 实体类playerId与CSV字段playerID大小写不一致,BeanWrapperFieldSetMapper默认大小写敏感,可配置忽略:
      fieldSetMapper.setStrict(false);
      
      或修改实体类字段名为playerID,与CSV字段名完全匹配。
  3. 日志排查
    添加详细日志配置,查看Batch执行流程:

    logging:
      level:
        org.springframework.batch: DEBUG
        org.springframework.jdbc: DEBUG
    

    通过日志确认Job是否启动、Reader是否读取到数据、Writer是否执行等关键节点。

  4. 事务与主键检查
    确认JpaTransactionManager配置正确,排查是否存在主键重复导致的静默回滚(可通过日志或手动插入测试数据验证主键唯一性)。

内容的提问来源于stack exchange,提问作者Aryan Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:41:19