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的核心组件,负责任务的调度管理。其主要功能包括: 任务管理:调度中心提供…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...