spring batch简单使用(基于springboot)从数据库读取控制台打印
先上效果图
db脚本,直接数据库执行就好
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | /* 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文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | <?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> |
代码部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #开发配置 #数据库连接参数的配置 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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | 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; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | 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
以上就是关于从数据库读取数据,然后就将处理后的数据写入控制台的介绍
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异