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

相关推荐
zizisuo2 小时前
面试篇:Spring MVC
java·spring·mvc
-曾牛2 小时前
Spring AI 与 Hugging Face 深度集成:打造高效文本生成应用
java·人工智能·后端·spring·搜索引擎·springai·deepseek
modest —YBW2 小时前
Ollama+OpenWebUI+docker完整版部署,附带软件下载链接,配置+中文汉化+docker源,适合内网部署,可以局域网使用
人工智能·windows·docker·语言模型·llama
code在飞3 小时前
windows 部署 Kafka3.x KRaft 模式 不依赖 ZooKeeper
windows·分布式·zookeeper·kafka
计算机学姐3 小时前
基于SpringBoot的小区停车位管理系统
java·vue.js·spring boot·后端·mysql·spring·maven
添砖Java中4 小时前
深入剖析缓存与数据库一致性:Java技术视角下的解决方案与实践
java·数据库·spring boot·spring·缓存·双写一致性
不会飞的鲨鱼4 小时前
Windows系统下使用Kafka和Zookeeper,Python运行kafka(二)
windows·zookeeper·kafka
天上掉下来个程小白5 小时前
添加购物车-02.代码开发
java·服务器·前端·后端·spring·微信小程序·苍穹外卖
2501_9153738814 小时前
Electron 打包与发布指南:让你的应用运行在 Windows、macOS、Linux
windows·macos·electron
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧15 小时前
MyBatis快速入门——实操
java·spring boot·spring·intellij-idea·mybatis·intellij idea