SpringBatch 实列学习《一》

通过Spring batch的官方文档,学习springbatch, 记录每个实列。

本案例是官方提供的第一个入门实列

官方文档地址

https://spring.io/guides/gs/batch-processing/#scratch

源码地址

https://gitee.com/bseaworkspace/study_java_web/tree/master/springbatchdemobasic

代码结构

SpringBatch 实列学习《一》

 

业务数据

Typically, your customer or a business analyst supplies a spreadsheet. For this simple example, you can find some made-up data in src/main/resources/sample-data.csv:

比如用户提供了一个需要处理的表格数据。

Jill,Doe
Joe,Doe
Justin,Doe
Jane,Doe
John,Doe

 

 

这个表格数据 每一行包含了 名和姓 并且用逗号隔开。

接下来,我们需要准备一个sql 用来创建需要的数据表 src/main/resources/schema-all.sql:

DROP TABLE people IF EXISTS;

CREATE TABLE people  (
    person_id BIGINT IDENTITY NOT NULL PRIMARY KEY,
    first_name VARCHAR(20),
    last_name VARCHAR(20)
);

 

Spring Boot runs schema-@@platform@@.sql automatically during startup. -all is the default for all platforms.

Spring Boot提供两种方法来定义数据库的表结构以及添加数据。

  1. 使用Hibernate提供的工具来创建表结构,该机制会自动搜索@Entity实体对象并创建对应的表,然后使用import.sql文件导入测试数据;
  2. 利用旧的Spring JDBC,通过schema.sql文件定义数据库的表结构、通过data.sql导入测试数据。

这里采用了Spring JDBC的方式,在springboot项目启动的时候,自动创建相关的表。

Spring Boot可以自动创建DataSource的模式(DDL脚本)并初始化它(DML脚本),并从标准的位置 schema.sqldata.sql (位于classpath根目录)加载SQL,脚本的位置可以通过设置 spring.datasource.schemaspring.datasource.data 来改变。此外,Spring Boot将加载 schema-${platform}.sqldata-${platform}.sql 文件(如果存在),在这里 platformspring.datasource.platform 的值,比如,可以将它设置为数据库的供应商名称( hsqldb , h2 , oracle , mysql , postgresql 等)。
Spring Boot默认启用Spring JDBC初始化快速失败特性,所以如果脚本导致异常产生,那应用程序将启动失败。能通过设置spring.datasource.continue-on-error的值来控制是否继续。一旦应用程序成熟并被部署了很多次,那该设置就很有用,例如,插入失败时意味着数据已经存在,也就没必要阻止应用继续运行。
如果想要在一个JPA应用中使用 schema.sql ,那如果Hibernate试图创建相同的表, ddl-auto=create-drop 将导致错误产生。为了避免那些错误,可以将 ddl-auto 设置为""或 none 。
最后要提的一点是,spring.datasource.initialize=false 可以阻止数据初始化。

 


 

 

开始代码实现

 

设置Maven的pom文件

 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.4.3</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>batch-processing</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>batch-processing</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-batch</artifactId>
		</dependency>

		<dependency>
			<groupId>org.hsqldb</groupId>
			<artifactId>hsqldb</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.batch</groupId>
			<artifactId>spring-batch-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

业务实体类

 

Now that you can see the format of data inputs and outputs, you can write code to represent a row of data, as the following example shows:

用来定义数据的输入和输出的格式,一个实体类的对象,就对于前面表格数据的一行数据。

package com.xsz.entity;
public class Person {

    private String lastName;
    private String firstName;

    public Person() {
    }

    public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return "firstName: " + firstName + ", lastName: " + lastName;
    }

}

Create an Intermediate Processor 创建中间处理类

A common paradigm in batch processing is to ingest data, transform it, and then pipe it out somewhere else. Here, you need to write a simple transformer that converts the names to uppercase. The following listing 

这个中间处理类,主要是把输入对象的姓名属性的值,转换成大写。

 

package com.xsz.processor;
        import com.xsz.entity.Person;
        import org.slf4j.Logger;
        import org.slf4j.LoggerFactory;

        import org.springframework.batch.item.ItemProcessor;

public class PersonItemProcessor implements ItemProcessor<Person, Person> {

    private static final Logger log = LoggerFactory.getLogger(PersonItemProcessor.class);

    @Override
    public Person process(final Person person) throws Exception {
        final String firstName = person.getFirstName().toUpperCase();
        final String lastName = person.getLastName().toUpperCase();

        final Person transformedPerson = new Person(firstName, lastName);

        log.info("Converting (" + person + ") into (" + transformedPerson + ")");

        return transformedPerson;
    }

}

 

上一篇:Java springboot整合springbatch实现读取csv,并写入数据库


下一篇:史上最全的SpringBatch学习教程