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

相关推荐
用户8307196840821 天前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
阿白的白日梦1 天前
winget基础管理---更新/修改源为国内源
windows
NE_STOP4 天前
springMVC-HTTP消息转换器与文件上传、下载、异常处理
spring
JavaGuide5 天前
Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
java·spring·ai·claude code
玹外之音5 天前
Spring AI MCP 实战:将你的服务升级为 AI 可调用的智能工具
spring·ai编程
来一斤小鲜肉5 天前
Spring AI入门:第一个AI应用跑起来
spring·ai编程
埃博拉酱5 天前
VS Code Remote SSH 连接 Windows 服务器卡在"下载 VS Code 服务器":prcdn DNS 解析失败的诊断与 BITS 断点续传
windows·ssh·visual studio code
NE_STOP5 天前
springMVC-常见视图组件与RESTFul编程风格
spring
唐宋元明清21886 天前
.NET 本地Db数据库-技术方案选型
windows·c#