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

相关推荐
Mr.wangh34 分钟前
SpringBoot 配置⽂件
java·spring boot·spring
安 当 加 密1 小时前
如何在Windows服务器上搭建RADIUS认证服务器,有哪些开源方案和付费解决方案
服务器·windows·开源
菲兹园长1 小时前
Spring Web MVC(Spring MVC)
前端·spring·mvc
三体世界3 小时前
C++ List的模拟实现
java·c语言·开发语言·数据结构·c++·windows·list
爱的叹息9 小时前
Spring容器从启动到关闭的注解使用顺序及说明
java·后端·spring
蜡笔小祎在线学习10 小时前
小林coding-12道Spring面试题
java·后端·spring
落淼喵_G10 小时前
【windows搭建lvgl模拟环境(一)之VSCode】
ide·windows·vscode
2401_8848107413 小时前
Spring-MVC笔记(下)
笔记·spring·mvc
Foyo Designer13 小时前
【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的缓存技术:使用 Redis 提升性能
java·spring boot·redis·spring·缓存
努力也学不会java14 小时前
【MyBatis】MyBatis 操作数据库
java·数据库·spring boot·spring·java-ee·intellij-idea·mybatis