spring batch简单使用(基于springboot)从数据库读取控制台打印

发布时间 2023-05-06 08:23:57作者: 不忘初心2021

先上效果图

 

 db脚本,直接数据库执行就好

/*
SQLyog Ultimate v11.24 (32 bit)
MySQL - 5.6.51 : Database - spring_batch
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`spring_batch` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `spring_batch`;

/*Table structure for table `tutorials` */

DROP TABLE IF EXISTS `tutorials`;

CREATE TABLE `tutorials` (
  `tutorial_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `tutorial_author` varchar(20) CHARACTER SET latin1 DEFAULT NULL COMMENT '作者',
  `tutorial_title` varchar(20) CHARACTER SET latin1 DEFAULT NULL COMMENT '题目',
  `submission_date` varchar(20) CHARACTER SET latin1 DEFAULT NULL COMMENT '提交时间',
  PRIMARY KEY (`tutorial_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

/*Data for the table `tutorials` */

insert  into `tutorials`(`tutorial_id`,`tutorial_author`,`tutorial_title`,`submission_date`) values (1,'Sanjay','Learn Java','2023-04-30 15:14:26'),(2,'Abdul S','Learn MySQL','2023-04-30 15:14:26'),(3,'Krishna Kasyap','Learn JavaFX','2023-04-30 15:14:26');

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.java</groupId>
    <artifactId>springbatch-service</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <jdk.version>1.8</jdk.version>
    </properties>

    <dependencies>
        <!--移除tomcat容器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--加入undertow-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>
        <!--lombok依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.14</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-batch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.batch</groupId>
            <artifactId>spring-batch-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.25</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>spring-batch</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>false</downloadJavadocs>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>${jdk.version}</source>
                    <target>${jdk.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

代码部分

#开发配置
#数据库连接参数的配置
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3310/spring_batch?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=spring
spring.datasource.password=123456
#项目启动时的建表sql脚本,该脚本由Spring Batch提供
spring.datasource.schema=classpath:/org/springframework/batch/core/schema-mysql.sql
#在项目启动时进行执行建表sql
#是否生成执行状态记录的表结构
spring.batch.initialize-schema=always
#禁止Spring Batch自动执行,既需要用户触发才能执行
spring.batch.job.enabled=true


logging.level.com.java=debug
logging.level.web=debug
spring.devtools.add-properties=false

  

package com.java.tutorials.batch;


import lombok.Data;

/**
 * @Description:
 * @Author: qiuxie
 * @Create: 2023/4/30 15:25
 */
@Data
public class Tutorial {

    private int tutorialId;

    private String tutorialTitle;

    private String tutorialAuthor;

    private String submissionDate;

}

package com.java.tutorials.batch;

/**
 * @Description:
 * @Author: qiuxie
 * @Create: 2023/5/4 21:11
 */
public class TutorialBatchJobConstant {


    public static final String STEP = "step";

}

package com.java.tutorials.batch;

import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.item.ItemProcessor;

/**
 * @Description:
 * @Author: qiuxie
 * @Create: 2023/5/1 14:42
 */
@Slf4j
public class TutorialProcessor implements ItemProcessor<Tutorial,Tutorial> {


    @Override
    public Tutorial process(Tutorial tutorial) throws Exception {
        Tutorial tutorialData=new Tutorial();
        if (tutorial.getTutorialId()>2){
            return tutorial;
        }
        return tutorialData;
    }
}

package com.java.tutorials.batch;

import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.core.RowMapper;

import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @Description:
 * @Author: qiuxie
 * @Create: 2023/5/4 21:23
 */
@Slf4j
public class TutorialRowMapper  implements RowMapper<Tutorial> {
    @Override
    public Tutorial mapRow(ResultSet rs, int rowNum) throws SQLException {
        Tutorial tutorial=new Tutorial();
        tutorial.setTutorialId(rs.getInt("tutorial_id"));
        tutorial.setTutorialTitle(rs.getString("tutorial_title"));
        tutorial.setTutorialAuthor(rs.getString("tutorial_author"));
        tutorial.setSubmissionDate(rs.getString("submission_date"));
        return tutorial;
    }
}

  

package com.java.tutorials.batch;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepScope;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.database.JdbcCursorItemReader;
import org.springframework.batch.item.database.builder.JdbcCursorItemReaderBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.util.List;

/**
 * @Description:
 * @Author: qiuxie
 * @Create: 2023/5/1 12:34
 */
@Configuration
public class TutorialBatchJob {

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

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Autowired
    private DataSource dataSource;

    private String JOB = "job";

    /**
     * 配置一个Job
     *
     * @return
     */
    @Bean
    public Job job() {
        long timeMillis = System.currentTimeMillis();
        String name=JOB+timeMillis;
        return jobBuilderFactory.get(name)
                .start(step())
                .build();
    }

    /**
     * 配置一个Step
     *
     * @return
     */
    @Bean(name = TutorialBatchJobConstant.STEP)
    public Step step() {
        return stepBuilderFactory.get(TutorialBatchJobConstant.STEP)
                //表示一次读取多少的数据
                .<Tutorial, Tutorial>chunk(2)
                .reader(itemReader())
                .processor(processor())
                .writer(itemWriter())
                .build();
    }

    @Bean
    public TutorialRowMapper tutorialRowMapper() {
        return new TutorialRowMapper();
    }


    /**
     * 配置itemReader
     *
     * @return
     */
    @Bean("itemReader")
    @StepScope
    public JdbcCursorItemReader<Tutorial> itemReader() {
        log.info("开始查询数据库");
        JdbcCursorItemReaderBuilder<Tutorial> readerBuilder = new JdbcCursorItemReaderBuilder<>();
        JdbcCursorItemReader<Tutorial> build = readerBuilder
                .name("qwe")
                .dataSource(dataSource)
                .sql("SELECT  tutorial_id,tutorial_author,tutorial_title,submission_date  FROM  tutorials")
                .rowMapper(tutorialRowMapper())
                .build();
        return build;
    }

    @Bean
    public ItemProcessor<Tutorial, Tutorial> processor() {
        return new TutorialProcessor();
    }

    @Bean
    public ItemWriter<Tutorial> itemWriter(){
        ItemWriter<Tutorial> itemWriter = new ItemWriter<Tutorial>() {
            @Override
            public void write(List<? extends Tutorial> list) throws Exception {
                  list.stream().forEach(a->{
                      if (null!=a.getTutorialTitle()){
                          log.info("数据写出:{}",a);
                      }
                  });
            }
        };
        return itemWriter;
    }

}

  以上环境基于jdk1.8,mysql 5.6,maven 3.5.4,springboot 2.7

 

 

 

 以上就是关于从数据库读取数据,然后就将处理后的数据写入控制台的介绍