Spring Batch 入门示例

下面详细讲解Spring Batch入门示例的完整攻略,内容包括:

  • Spring Batch 简介
  • Spring Batch 入门示例概述
  • 示例1:批处理读取 CSV 文件并输出到控制台
  • 示例2:批处理读取数据库中的数据并写入到 XML 文件中

Spring Batch 简介

Spring Batch 是一个高效、强大、可重用的批处理框架,能够处理海量的数据量。Spring Batch 建立在 Spring 框架之上,可以轻松地集成 Spring 生态系统的其他工具和框架,如 Spring Boot、Spring Data 和 Spring Integration 等。

Spring Batch 支持以下功能:

  • 大批量处理任务
  • 失败重试机制
  • 多线程并发处理
  • 分布式处理
  • 报告和统计

Spring Batch 入门示例概述

Spring Batch 入门示例主要包括以下内容:

  • 创建 Spring Batch 项目和 Maven 依赖
  • 编写 Job、Step、Reader、Processor 和 Writer
  • 运行 Spring Batch 示例

下面,我将分别介绍示例1和示例2的具体实现。

示例1:批处理读取 CSV 文件并输出到控制台

创建 Spring Batch 项目和 Maven 依赖

首先,我们需要创建一个基于 Maven 的 Spring Batch 项目,并添加以下 Maven 依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-batch</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.batch</groupId>
        <artifactId>spring-batch-core</artifactId>
        <version>4.3.3</version>
    </dependency>
    <dependency>
        <groupId>com.opencsv</groupId>
        <artifactId>opencsv</artifactId>
        <version>5.2</version>
    </dependency>
</dependencies>

编写 Job、Step、Reader、Processor 和 Writer

在 src/main/java 目录下创建 com.example.batch 包,并添加以下类:

  1. Student.java(实体类)
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Student {

    private String name;

    private String gender;

    private int age;

    private String classNo;

}
  1. CsvItemReader.java(CSV 文件读取器)
@Component
public class CsvItemReader extends FlatFileItemReader<Student> {

    public CsvItemReader() {
        setLinesToSkip(1); // 跳过表头
        setResource(new ClassPathResource("students.csv")); // CSV 文件路径
        setLineMapper(new DefaultLineMapper<Student>() {{
            setLineTokenizer(new DelimitedLineTokenizer("|") {{
                setNames(new String[]{"name", "gender", "age", "classNo"}); // CSV 文件中每一列对应实体类的属性
            }});
            setFieldSetMapper(new BeanWrapperFieldSetMapper<Student>() {{
                setTargetType(Student.class);
            }});
        }});
    }

}
  1. StudentItemProcessor.java(数据处理器)
@Component
public class StudentItemProcessor implements ItemProcessor<Student, Student> {

    @Override
    public Student process(Student student) throws Exception {
        student.setName(student.getName().toUpperCase()); // 将姓名转换为大写
        student.setAge(student.getAge() + 1); // 年龄加1
        return student;
    }

}
  1. ConsoleItemWriter.java(输出到控制台)
@Component
public class ConsoleItemWriter implements ItemWriter<Student> {

    @Override
    public void write(List<? extends Student> students) throws Exception {
        for (Student student : students) {
            System.out.println(student);
        }
    }

}
  1. BatchConfig.java(Spring Batch 配置类)
@Configuration
@EnableBatchProcessing
public class BatchConfig {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Autowired
    private CsvItemReader csvItemReader;

    @Autowired
    private StudentItemProcessor studentItemProcessor;

    @Autowired
    private ConsoleItemWriter consoleItemWriter;

    @Bean
    public Job job() {
        return jobBuilderFactory.get("job")
                .incrementer(new RunIdIncrementer())
                .start(step())
                .build();
    }

    @Bean
    public Step step() {
        return stepBuilderFactory.get("step")
                .<Student, Student>chunk(10)
                .reader(csvItemReader)
                .processor(studentItemProcessor)
                .writer(consoleItemWriter)
                .build();
    }

}

运行 Spring Batch 示例

在 resources 目录下添加 students.csv,文件内容如下:

name|gender|age|classNo
张三|男|20|001
李四|女|22|002
王五|男|21|003
赵六|女|19|004

运行 com.example.batch.SpringBatchExampleApplication 类的 main 方法即可运行示例1。

示例2:批处理读取数据库中的数据并写入到 XML 文件中

创建 Spring Batch 项目和 Maven 依赖

首先,我们需要创建一个基于 Maven 的 Spring Batch 项目,并添加以下 Maven 依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-batch</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.batch</groupId>
        <artifactId>spring-batch-core</artifactId>
        <version>4.3.3</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.batch</groupId>
        <artifactId>spring-batch-infrastructure</artifactId>
        <version>4.3.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-dbcp2</artifactId>
        <version>2.9.0</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.5</version>
    </dependency>
</dependencies>

编写 Job、Step、Reader、Processor 和 Writer

在 src/main/java 目录下创建 com.example.batch 包,并添加以下类:

  1. User.java(实体类)
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User {

    private int id;

    private String name;

    private int age;

}
  1. UserItemReader.java(数据库读取器)
@Component
public class UserItemReader extends MyBatisCursorItemReader<User> {

    public UserItemReader(SqlSessionFactory sqlSessionFactory) {
        setSqlSessionFactory(sqlSessionFactory);
        setQueryId("com.example.batch.mapper.UserMapper.selectAll"); // 调用 UserMapper 接口查询所有用户
    }

}
  1. UserItemProcessor.java(数据处理器)
@Component
public class UserItemProcessor implements ItemProcessor<User, User> {

    @Override
    public User process(User user) throws Exception {
        user.setName("Hello, " + user.getName()); // 姓名添加前缀
        user.setAge(user.getAge() + 1); // 年龄加1
        return user;
    }

}
  1. XmlItemWriter.java(写入 XML 文件)
@Component
public class XmlItemWriter extends StaxEventItemWriter<User> {

    public XmlItemWriter() throws IOException {
        setRootTagName("users");
        setResource(new FileSystemResource("users.xml")); // 输出的 XML 文件路径
        setMarshaller(getMarshaller());
    }

    private Marshaller getMarshaller() throws IOException {
        XStreamMarshaller marshaller = new XStreamMarshaller();
        marshaller.setAliases(Collections.singletonMap("user", User.class));
        marshaller.afterPropertiesSet();
        return marshaller;
    }

}
  1. BatchConfig.java(Spring Batch 配置类)
@Configuration
@EnableBatchProcessing
@MapperScan(basePackages = "com.example.batch.mapper")
public class BatchConfig {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Autowired
    private SqlSessionFactory sqlSessionFactory;

    @Autowired
    private UserItemReader userItemReader;

    @Autowired
    private UserItemProcessor userItemProcessor;

    @Autowired
    private XmlItemWriter xmlItemWriter;

    @Bean
    public Job job() {
        return jobBuilderFactory.get("job")
                .incrementer(new RunIdIncrementer())
                .start(step())
                .build();
    }

    @Bean
    public Step step() {
        return stepBuilderFactory.get("step")
                .<User, User>chunk(10)
                .reader(userItemReader)
                .processor(userItemProcessor)
                .writer(xmlItemWriter)
                .build();
    }

}

运行 Spring Batch 示例

创建数据库和表,并插入数据:

CREATE DATABASE springbatch
USE springbatch

CREATE TABLE user (
    id INT PRIMARY KEY,
    name VARCHAR(20),
    age INT
)

INSERT INTO user VALUES
(1, '张三', 20),
(2, '李四', 22),
(3, '王五', 21),
(4, '赵六', 19)

运行 com.example.batch.SpringBatchExampleApplication 类的 main 方法即可运行示例2。

以上就是 Spring Batch 入门示例的完整攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Batch 入门示例 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • springboot自定义starter方法及注解实例

    Spring Boot自定义Starter方法及注解实例 Spring Boot是一个快速开发框架,可以帮助开发人员快速构建Web应用程序。在Spring Boot中,我们可以使用自定义Starter来封装一些常用的依赖和配置,以便在多个项目中重复使用。本文将介绍Spring Boot自定义Starter的方法及注解实例,并提供两个示例。 自定义Starte…

    Java 2023年5月15日
    00
  • 一起来了解Java的File类和IO流

    一起来了解Java的File类和IO流 File类 Java中的File类是一个用于操作文件和目录的类。使用File类可以实现文件的创建、删除、重命名、遍历等操作。File类的构造函数可以传入一个文件路径字符串或者一个URI,用于表示文件或者目录的路径。下面是一些常用的File类的操作示例: 创建和删除文件 File file = new File(&quo…

    Java 2023年5月19日
    00
  • SpringBoot集合Mybatis过程解析

    SpringBoot集成Mybatis过程解析 1. 简介 SpringBoot是基于Spring框架的快速应用开发框架,整合了众多好用的组件,非常适合开发中小型项目。而Mybatis则是一个轻量级的ORM框架,可以让我们更加方便地操作数据库。 在本篇攻略中,我们将会详细讲解如何在SpringBoot项目中集成Mybatis,并完成对数据库的CRUD操作。 …

    Java 2023年5月19日
    00
  • Java 把json对象转成map键值对的方法

    将 JSON 对象转换成 Map 对象有两种方法: 1. 使用 Jackson 库 Jackson 是一个流行的 JSON 处理库,它可以轻松地将 JSON 转换成 Java 对象或 Map 对象,反之亦然。可以通过 Maven 或 Gradle 将 Jackson 依赖项添加到项目中: <dependency> <groupId>c…

    Java 2023年5月26日
    00
  • java8 stream 如何打印数据元素

    Java8 Stream 如何打印数据元素? Java8 中引入了 Stream API,它是用于描述对基于元素序列的一个或多个操作的流式计算的 API。使用 Stream API,可以以声明性的方式处理数据元素,而不是命令式的方式,这样可以极大地提高代码的可读性和表达性。 在 Java8 Stream 中,打印流中的所有元素通常是我们进行调试的一项重要操作…

    Java 2023年5月26日
    00
  • 在SpringBoot中整合使用Netty框架的详细教程

    下面是整合使用Netty框架的详细攻略: 1. 引入Netty依赖 在 Spring Boot 项目的 pom.xml 文件中,引入 Netty 的相关依赖库,这里以版本号 4.1.53.Final 为例: <dependency> <groupId>io.netty</groupId> <artifactId&gt…

    Java 2023年5月31日
    00
  • 如何实现Java线程安全问题

    Java线程安全是一个非常重要的问题,它涉及到在多线程情况下对共享资源的访问和操作。如果不注意线程安全问题,可能会导致数据混乱、竞态条件等问题。下面是一些实现Java线程安全的攻略: 1.使用同步方法和同步块 同步方法和同步块都可以用来实现线程安全。它们的核心思想是在多个线程访问共享资源时,只有一个线程能够访问这个资源,其他线程需要等待。具体实现方式如下: …

    Java 2023年5月26日
    00
  • SpringBoot小程序推送信息的项目实践

    SpringBoot小程序推送信息的项目实践攻略 简介 本项目实践基于SpringBoot和小程序,实现了推送信息到小程序的功能。本文将详细讲解本项目的实现过程。 准备工作 开发工具:IDEA、微信开发者工具 开发环境:Java 8、Maven 3.6.3、SpringBoot 2.4.0、MySQL 8.0.21 创建SpringBoot项目 在IDEA中…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部