以下是一个完整的 Spring Batch + RepositoryItemWriter + CrudRepository 示例,包含详细注释说明:
1. 实体类(MyEntity.java)
java
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class MyEntity {
@Id
private Long id;
private String name;
// 构造函数、Getter/Setter
public MyEntity(Long id, String name) {
this.id = id;
this.name = name;
}
// Getters and Setters...
}
2. Spring Data Repository接口(MyRepository.java)
java
import org.springframework.data.repository.CrudRepository;
public interface MyRepository extends CrudRepository<MyEntity, Long> {
// 自动继承CRUD方法(如save、delete等)
}
3. Spring Batch配置类(BatchConfig.java)
java
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.database.RepositoryItemWriter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private MyRepository myRepository;
// -------------------------- Step 1: 定义数据源(示例:内存数据) --------------------------
@Bean
public List<MyEntity> myData() {
return List.of(
new MyEntity(1L, "Item1"),
new MyEntity(2L, "Item2")
);
}
// -------------------------- Step 2: 定义ItemReader(读取内存数据) --------------------------
@Bean
public ItemReader<MyEntity> reader() {
return new ListItemReader<>(myData());
}
// -------------------------- Step 3: 定义ItemProcessor(可选) --------------------------
@Bean
public ItemProcessor<MyEntity, MyEntity> processor() {
return item -> {
// 示例:修改name前缀
item.setName("Processed: " + item.getName());
return item;
};
}
// -------------------------- Step 4: 定义ItemWriter(使用RepositoryItemWriter) --------------------------
@Bean
public ItemWriter<MyEntity> writer() {
RepositoryItemWriter<MyEntity> writer = new RepositoryItemWriter<>();
// 配置Repository(Spring Data的接口实现)
writer.setRepository(myRepository);
// 配置要调用的Repository方法(默认是"save")
writer.setMethodName("save");
// 可选:指定方法参数(如save的参数是实体对象本身)
// writer.setArguments(...); // 通常不需要,因为save方法只有一个参数
return writer;
}
// -------------------------- Step 5: 定义Step --------------------------
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<MyEntity, MyEntity>chunk(2) // 每批处理2条数据
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
// -------------------------- Step 6: 定义Job --------------------------
@Bean
public Job job() {
return jobBuilderFactory.get("myJob")
.start(step1())
.build();
}
}
4. 启动类(Application.java)
java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
5. 运行说明
-
依赖配置 :确保在
pom.xml中添加以下依赖:xml<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> -
数据库配置 :在
application.properties中配置H2数据库:propertiesspring.datasource.url=jdbc:h2:mem:testdb spring.datasource.driver-class-name=org.h2.Driver spring.jpa.hibernate.ddl-auto=update -
执行Job :运行
Application类,Job会自动执行并保存数据到数据库。
代码关键点说明
-
RepositoryItemWriter:
- 通过
setRepository(myRepository)指定Spring Data的Repository接口实现。 setMethodName("save")指定调用Repository的save方法批量保存数据。- 自动处理批量操作(无需手动循环调用
save)。
- 通过
-
CrudRepository:
- 继承
CrudRepository自动获得save、findById等方法。 - Spring Batch通过
RepositoryItemWriter调用save方法将数据持久化。
- 继承
-
配置流程:
- 数据源 :
myData()提供测试数据(内存数据)。 - 处理流程 :
reader→processor(可选) →writer。 - 事务管理 :Spring Batch默认按
chunk大小提交事务(如示例中每2条提交一次)。
- 数据源 :
补充说明
-
批量优化 :
RepositoryItemWriter默认逐条调用save方法,若需批量操作,需结合saveAll方法:javawriter.setMethodName("saveAll"); // 需确保Repository继承JpaRepository需要调整Repository接口:
javapublic interface MyRepository extends JpaRepository<MyEntity, Long> { /* ... */ } -
错误处理 :可通过
@Retryable或SkipPolicy处理保存失败的情况。