我正在创建一个项目,用于使用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
类的JobBuilder
bean定义中指定了名称。也就是说,我认为没有必要将JobBuilder
和StepBuilder
定义为bean。