一个完整的 Spring Batch + RepositoryItemWriter + CrudRepository 示例,包含详细注释说明

以下是一个完整的 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. 运行说明

  1. 依赖配置 :确保在 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>
  2. 数据库配置 :在 application.properties 中配置H2数据库:

    properties 复制代码
    spring.datasource.url=jdbc:h2:mem:testdb
    spring.datasource.driver-class-name=org.h2.Driver
    spring.jpa.hibernate.ddl-auto=update
  3. 执行Job :运行 Application 类,Job会自动执行并保存数据到数据库。


代码关键点说明

  1. RepositoryItemWriter

    • 通过 setRepository(myRepository) 指定Spring Data的Repository接口实现。
    • setMethodName("save") 指定调用Repository的 save 方法批量保存数据。
    • 自动处理批量操作(无需手动循环调用save)。
  2. CrudRepository

    • 继承 CrudRepository 自动获得savefindById等方法。
    • Spring Batch通过RepositoryItemWriter调用save方法将数据持久化。
  3. 配置流程

    • 数据源myData() 提供测试数据(内存数据)。
    • 处理流程readerprocessor(可选) → writer
    • 事务管理 :Spring Batch默认按chunk大小提交事务(如示例中每2条提交一次)。

补充说明

  • 批量优化RepositoryItemWriter 默认逐条调用save方法,若需批量操作,需结合saveAll方法:

    java 复制代码
    writer.setMethodName("saveAll"); // 需确保Repository继承JpaRepository

    需要调整Repository接口:

    java 复制代码
    public interface MyRepository extends JpaRepository<MyEntity, Long> { /* ... */ }
  • 错误处理 :可通过@RetryableSkipPolicy处理保存失败的情况。

相关推荐
小王C语言2 小时前
【C++初阶】--- list容器功能模拟实现
c++·windows·list
xoxo-Rachel4 小时前
SpringBoot 基本原理
java·spring boot·spring
johnrui5 小时前
JAVA设计模式:注解+模板+接口
java·windows·设计模式
NovakG_5 小时前
SpringCloud小白入门+项目搭建
后端·spring·spring cloud
Yusei_05237 小时前
Linux 进程控制(自用)
linux·windows
带刺的坐椅8 小时前
能用 Java8 开发 MCP(或 MCP Server),这才是 MCP 自由(Solon AI MCP)!
java·spring·ai·solon·mcp·mcp-server
Eugene__Chen8 小时前
内存管理详解(曼波脑图超详细版!)
java·jvm·windows
Java个体户9 小时前
struts2和springmvc混合项目,上传文件报错
spring
走向自由9 小时前
Spring 学习笔记之 @Transactional详解
spring·spring aop·transactional注解
我不是立达刘宁宇10 小时前
subprocess 模块
windows