以下是一个完整的 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
处理保存失败的情况。