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

相关推荐
wang09071 小时前
自己动手写一个spring之系列
spring
jeffer_liu2 小时前
Spring AI 生产级实战:裁判员
java·人工智能·后端·spring·大模型
夜微凉43 小时前
三、Spring
java·后端·spring
Qiuner3 小时前
Pico 重塑Agent时代人与数据交互方式
windows·docker·ai·架构
FL16238631294 小时前
Windows x64 系统安装 ChromeDriver
windows
biubiubiu07064 小时前
SpringBoot关于外部化配置
java·spring boot·spring
Full Stack Developme4 小时前
Spring Bean 依赖注入
python·spring·log4j
zzz_23684 小时前
【Spring】面试突击系列(二):SpringBoot 入门与自动配置原理
java·spring boot·spring
Full Stack Developme4 小时前
Spring AOP 与 AspectJ
java·后端·spring
百事牛科技5 小时前
两种方法锁定 PDF,拒绝内容被随意篡改
windows·pdf