spring boot(学习笔记第十九课)
spring boot(学习笔记第十九课)
- Spring boot的batch框架,以及Swagger3(
OpenAPI
)整合
学习内容:
- Spring boot的batch框架
- Spring boot的Swagger3(
OpenAPI
)整合
1. Spring boot batch框架
Spring Batch
是什么Spring Batch
是一个轻量级的、完善的批处理框架,旨在帮助企业建立健壮、高效的批处理应用。Spring Batch
的执行流程主要包括以下几个步骤:- 配置JobLaunch
- 配置Job
- 配置Step
- 配置ItemReader来读取数据
- 配置ItemProcessor来处理数据
- 配置ItemWriter来写数据
- 配置JobRepository来管理作业状态
- 创建并运行作业
- 练习使用
Spring Batch
Spring Batch Guide(可以参照最新的官方guide)
- 加入必要的依赖(这里使用
jdbc
连接mysql
数据库)<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-batch</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency>
Spring Batch
会创建出自己管理的表,所以要执行sql
进行创建。sql
都已经准备在导入的依赖中准备好了。spring.batch.jdbc.schema=classpath:/org/springframework/batch/core/schema-mysql.sql
将上面的sql
拷贝出来,在msql
数据库中执行。
- 配置
application.properties
进行数据库设置。
本来spring.batch.jdbc.initialize-schema=always
能够进行自动创建Spring Batch
需要的table
,但是没有成功,手动创建了。spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springboot spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.username=finlay spring.datasource.password=123456 spring.batch.jdbc.initialize-schema=always spring.batch.jdbc.table-prefix=BATCH_ spring.batch.jdbc.schema=classpath:/org/springframework/batch/core/schema-mysql.sql spring.batch.job.enabled=false
- 准备数据文件
data.csv
。
注意,接下来要在后面的代码中,load csv文件的时候,(new ClassPathResource("data.csv"))
从ClassPath
中取得,所以事先放在/resources
这个ClassPath
的直下。
- 准备
User
的entity
类。@Data public class User {private Integer id;private String name;private String address;private String gender; }
- 准备
CsvBatchJobConfig
类,配置Spring Batch
的Job
。@Configuration public class CsvBatchJobConfig {@BeanFlatFileItemReader<User> itemReader() {FlatFileItemReader<User> reader =new FlatFileItemReader<User>();reader.setLinesToSkip(1);reader.setResource(new ClassPathResource("data.csv"));reader.setLineMapper(new DefaultLineMapper<>() {{setLineTokenizer(new DelimitedLineTokenizer() {{setNames("id", "name", "address", "gender");setDelimiter("\t");}});setFieldSetMapper(new BeanWrapperFieldSetMapper<>() {{setTargetType(User.class);}});}});return reader;}@Beanpublic JdbcBatchItemWriter<User> jdbcBatchItemWriter(DataSource dataSource) {return new JdbcBatchItemWriterBuilder<User>().sql("insert into user(id,name,address,gender)" +"values(:id,:name,:address,:gender)").dataSource(dataSource).beanMapped().build();}@Beanpublic Step csvStep(JobRepository jobRepository,DataSourceTransactionManager transactionManager,FlatFileItemReader<User> flatFileItemReader,JdbcBatchItemWriter<User> jdbcBatchItemWriter) {SimpleStepBuilder<User, User> stepBuilder =new StepBuilder("csvStep", jobRepository).<User, User>chunk(10, transactionManager).reader(flatFileItemReader).writer(jdbcBatchItemWriter);return stepBuilder.build();}@Beanpublic Job csvJob(JobRepository jobRepository,Step csvStep) {return new JobBuilder("csvJob", jobRepository).start(csvStep).build();} }
- 在
Spring Boot
的主类中@EnableBatchProcessing(databaseType = "mysql")
@SpringBootApplication @EnableBatchProcessing(databaseType = "mysql") public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}@BeanQueue queue(){return new ActiveMQQueue("amq");} }
- 定义
BatchController
,进行调用JobLauncher
。@Controller public class BatchController {@Autowiredpublic JobLauncher jobLauncher;@AutowiredJob csvJob;@GetMapping("csv_import")@ResponseBodypublic String csvImport() {String result;try {jobLauncher.run(csvJob,new JobParametersBuilder().toJobParameters());result = "csv job ok";} catch (Exception e) {e.printStackTrace();result = "csv job ng";}return result;} }
- 定义
User
目标表在mysql
。CREATE TABLE `USER` (`id` int(11) NOT NULL,`name` varchar(255) NOT NULL,`address` varchar(255) NOT NULL,`gender` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 启动
Spring Boot
应用程序,访问BatchController
。
- 检查
mysql
数据库的User
表。
可以看到数据都已经导入进去了。
2. Spring boot的Swagger3整合
前后端分离,一般采用Swagger3
,将RESTful API
文档和代码结合在一起。这样在维护代码的时候,自然生成最新的RESTful API
文档。
这里最新的Spring Boot
不支持Swagger2
,可以使用Swagger3 OpenAPI
- 在项目中导入
Swagger3
。- 导入需要的依赖。
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.6.0</version></dependency>
- 配置
springdoc-openapi Swagger3
@Configuration public class Swagger3Config {@BeanOpenAPI openAPI() {return new OpenAPI().info(new Info().title("项目接口API文档").description("项目接口API文档").version("v0.1").license(new License().name("Apache2.0").url("http://springdoc.org"))).externalDocs(new ExternalDocumentation().description("SpringShop Wiki Documentation").url("https://springshop.wiki.github.org/docs"));} }
- 在
application.properties
中限定生成springdoc
的package
springdoc.packagesToScan=com.example.demo.controller.swagger
- 定义自己项目的
controller
@RestController public class Swagger3Controller {@Operation(summary = "查询用户", description = "根据Id查询用户")@Parameter(in = ParameterIn.PATH, name = "id", description= "用户Id", required = true)@GetMapping("/user/{id}")public String getUserById(@PathVariable Integer id) {return "/user/" + id;}@ApiResponses({@ApiResponse(responseCode= "200", description= "删除成功"),@ApiResponse(responseCode= "500", description= "删除失败")})@Operation(summary= "删除用户", description= "通过Id删除用户")@DeleteMapping("/user/{id}")public Integer deleteUserById(@PathVariable Integer id) {return id;}@Operation(summary = "添加用户", description = "添加一个用户,传入用户名和地址")@Parameters({@Parameter(in = ParameterIn.QUERY,name = "username",description = "用户名",required = true),@Parameter(in = ParameterIn.QUERY,name = "address",description= "地址",required = true)})@PostMapping("/user")public String addUser(@RequestParam String username,@RequestParam String address) {return username + address;}@Operation(summary = "修改用户", description = "修改用户,传入用户信息")@PutMapping("/user")public String updateUser(@RequestBody User user) {return user.toString();}@Hidden@GetMapping("/ignore")public String ignoreMethod() {return "ignored method";} }
http://localhost:8080/swagger-ui/index.html
- 导入需要的依赖。
相关文章:

spring boot(学习笔记第十九课)
spring boot(学习笔记第十九课) Spring boot的batch框架,以及Swagger3(OpenAPI)整合 学习内容: Spring boot的batch框架Spring boot的Swagger3(OpenAPI)整合 1. Spring boot batch框架 Spring Batch是什么 Spring Batch 是一个…...
docker安装 redis 并且加密开启SSL/TLS通道
拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/redis:latest docker tag registry.cn-hangzhou.aliyuncs.com/qiluo-images/redis:latest redis:latest要在 Docker 容器中启动 Redis 并开启 SSL/TLS 加密,需按照以下步骤修改启动命令和配置…...

什么是ARM架构?什么是X86架构?两者的区别是什么?
一、什么是ARM架构 (一)起源于发展 ARM 架构由英国剑桥的 Acorn 计算机公司开发。因市场无合适产品,Acorn 自行设计出第一款微处理器,命名为 ARM。此后 ARM 架构不断发展,1990 年为与苹果合作成立 ARM 公司࿰…...

【vscode】vscode paste image插件设置
本文首发于 ❄️慕雪的寒舍 vscode编辑md文件的时候,如果想插入图片,自带的粘贴只会粘贴到当前目录下,也没有文件重命名,很不友好。 在扩展商店里面有mushan的Paste Image插件,相比自带的,更加友好一点。但…...

自定义string类
#include <iostream> #include <string> int main() { std::string str "Hello, World!"; // 使用 c_str() 将 std::string 转换为 C 风格字符串,并传递给 printf printf("The string is: %s\n", str.c_str()); // 尝试修改…...

Python | Leetcode Python题解之第387题字符串中的第一个唯一字符
题目: 题解: class Solution:def firstUniqChar(self, s: str) -> int:position dict()q collections.deque()n len(s)for i, ch in enumerate(s):if ch not in position:position[ch] iq.append((s[i], i))else:position[ch] -1while q and po…...
RocketMQ 消费时序列化报错问题分析及解决
问题背景 在2024年3月7日,系统消费 RocketMQ 消息时出现了序列化报错,错误信息显示为: java.io.InvalidClassException: com.xxx.xxx.bean.mg.GoodsChangeLogMessage; local class incompatible: stream classdesc serialVersionUID... 这是…...

全能与专精:探索未来AI模型的发展趋势与市场潜力
文章目录 每日一句正能量前言AI模型的全面评估和比较AI模型的专精化和可扩展性AI模型的合理使用和道德规范后记 每日一句正能量 一个人,如果没有经受过投资失败的痛楚,又怎么会看到绝望之后的海阔天空。很多时候,经历了人生中最艰难的事&…...
Python深度学习:【开源数据集系列】ImageNet数据集
ImageNet 是一个大规模的视觉数据集,是计算机视觉领域最重要的基准数据集之一。该数据集由普林斯顿大学和斯坦福大学的研究人员发起,于 2009 年推出。ImageNet 是用于物体分类、目标检测、图像分割、姿势估计等多种任务的通用数据集,尤其在深度学习和计算机视觉的突破性研究…...

微信小程序手写签名
微信小程序手写签名组件 该组件基于signature_pad封装,signature_pad本身是web端的插件,此处将插件代码修改为小程序端可用。 signature_pad.js /*!* Signature Pad v5.0.3 | https://github.com/szimek/signature_pad* (c) 2024 Szymon Nowak | Releas…...

Javascript 使用中点查找矩形的角(Find Corners of Rectangle using mid points)
考虑一个矩形 ABCD,我们给出了边 AD 和 BC 中点(分别为 p 和 q)的坐标以及它们的长度 L(AD BC L)。现在给定参数,我们需要打印 4 个点 A、B、C 和 D 的坐标。 例子: 输入:p (1,…...

【困难】 猿人学web第一届 第18题 jsvmp 洞察先机
文章目录 数据接口分析还原加密参数插桩调试分析日志插桩补充 python 代码 数据接口分析 数据接口 https://match.yuanrenxue.cn/match/18data 请求参数 {page: 页码, t: 时间戳, v: 加密值} 请求第一页不需要携带 t, v 参数 cookie 只需要携带 sessionid 只要 还原加密字段…...

IDEA Maven 源修改为国内阿里云镜像的正确方式
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…...

OpenCV 旋转矩形边界
边界矩形是用最小面积绘制的,所以它也考虑了旋转。使用的函数是**cv.minAreaRect**()。 import cv2 import numpy as npimgcv2.imread(rD:\PythonProject\thunder.jpg) img1cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) print(img.dtype) ret,threshcv2.threshold(img1,1…...

人车防撞系统安全生产方案
根据《市场监管总局关于2021~2023年全国特种设备安全状况的通告》数据显示:2023年:全国共发生特种设备事故和相关事故71起,其中死亡69人。包含叉车在内的场(厂)内专用机动车辆事故29起、死亡28人,占事故总数的40.85%、死亡人数的4…...

开放式耳机哪个牌子好?长文传授6招秘籍,彻底远离坑货!
大家好,作为一位专注于评测各类数码产品的博主,今天我特别推荐开放式耳机作为我们日常的首选。这种耳机以其独特的设计,避免了传统耳机长时间佩戴可能带来的不适和感染风险。开放式耳机佩戴简便且稳固,尤其适合热爱跑步和运动的…...
vue2和vue3双向绑定的原理
Vue.js 的双向绑定是 Vue 框架的核心特性之一,它允许数据和视图之间保持同步。虽然 Vue 2 和 Vue 3 都实现了双向绑定,但它们在实现细节上有所不同。 Vue 2 双向绑定的原理 在 Vue 2 中,双向绑定主要依赖于 Object.defineProperty 和观察者…...

别为大文件烦恼!mp4文件太大怎么变小?3个管用方法
你是否曾经遇到过mp4视频文件过大的困扰?每当想要分享或存储mp4文件时,巨大的文件就成了阻碍。明明感觉感觉没占用多少空间,但是设备却常常出现空间过满警告。 没多少空间的设备真是让人大为恼火,没人想多花一份钱买设备。那么只…...

cocotb的接收和发送逻辑,还是没有弄明白
发送有两种方式 1、定义这样的发 通过前缀连接DUT里面的信号 发送的时候,通过.去访问就可以 2、如果是AXI总线,可以直接调用cocotb的库文件 AXIS总线可以包含以下的信号 通过这个类,可以产生一个AXIS的一帧数据 类的实现大概如下 然后也…...

XXL-JOB调度中心与执行器
XXL-JOB是一个轻量级的分布式任务调度平台,主要由调度中心和执行器两部分组成。下面详细讲解调度中心与执行器的功能和作用。 调度中心 调度中心是XXL-JOB的核心组件,负责任务的调度管理。其主要功能包括: 任务管理:调度中心提供…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...

DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...

云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...