不能使用Spring Batch从excel转储数据到MySQL



我正在创建一个项目,用于使用Spring 3.0.1从csv导入数据到MySQL。我按照以下步骤和作业为Reader、Writer和Processor bean创建了配置。使用JobBuilderFactory和StepBuilderFactory的旧方法已在Spring Boot 3.0中弃用

@Configuration
@EnableBatchProcessing
public class BatchConfig {


@Autowired
private PlayerRepository playerRepository;

@Bean
public FlatFileItemReader<Player> reader()
{
//Subclass of ItemReader class

FlatFileItemReader<Player> reader=new FlatFileItemReader<Player>();


reader.setResource(new ClassPathResource("People.csv"));
reader.setLineMapper(getLineMapper());
reader.setLinesToSkip(1);//Skip line in case of error
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();//Write .start() if there is only one step 

}
@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> //Input and Output
{
@Override
public Player process(Player player) throws Exception {

return player;
}
}

玩家模型是:

package com.aryan.batch.modal;
import jakarta.persistence.*;
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> {
}

应用程序中的配置。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

当我运行项目时,成功创建了表,但没有向表中插入数据。没有错误表明代码有任何问题。

使用Spring Boot 3,您不需要@EnableBatchProcessing,除非您想完全控制Spring Batch的配置和执行方式。因此,如果你删除了注释,你的作业应该在启动时执行。

另一个注意事项,您正在使用PlayerRepository,我猜是JPA存储库。如果是这种情况,请确保步骤中使用的事务管理器是JpaTransactionManager。您没有看到数据被持久化的原因可能与Spring Boot为您提供的DataSource自动配置DataSourceTransactionManager有关。

//如何指定名称?

关于importPlayerJob作业bean定义中的这个问题:您已经在CsvToMySqlApplication类的JobBuilderbean定义中指定了名称。也就是说,我认为没有必要将JobBuilderStepBuilder定义为bean。

最新更新