spring boot(学习笔记第十九课)

spring boot(学习笔记第十九课)

  • Spring boot的batch框架,以及Swagger3(OpenAPI)整合

学习内容:

  • Spring boot的batch框架
  • Spring boot的Swagger3(OpenAPI)整合

1. Spring boot batch框架

  1. Spring Batch是什么
    • Spring Batch 是一个轻量级的、完善的批处理框架,旨在帮助企业建立健壮、高效的批处理应用。
      • Spring Batch的执行流程主要包括以下几个步骤:
        • 配置JobLaunch
        • 配置Job
        • 配置Step
        • 配置ItemReader来读取数据
        • 配置ItemProcessor来处理数据
        • 配置ItemWriter来写数据
        • 配置JobRepository来管理作业状态
        • 创建并运行作业
  2. 练习使用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的直下。
      在这里插入图片描述
    • 准备Userentity类。
      @Data
      public class User {
          private Integer id;
          private String name;
          private String address;
          private String gender;
      }
      
    • 准备CsvBatchJobConfig类,配置Spring BatchJob
      @Configuration
      public class CsvBatchJobConfig {
      
          @Bean
          FlatFileItemReader<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;
          }
      
          @Bean
          public 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();
          }
      
          @Bean
          public 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();
          }
      
          @Bean
          public 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);
      	}
      
      	@Bean
      	Queue queue(){
      		return new ActiveMQQueue("amq");
      	}
      }
      
    • 定义BatchController,进行调用JobLauncher
      @Controller
      public class BatchController {
          @Autowired
          public JobLauncher jobLauncher;
      
          @Autowired
          Job csvJob;
      
          @GetMapping("csv_import")
          @ResponseBody
          public 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

  1. 在项目中导入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 {
          @Bean
          OpenAPI 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中限定生成springdocpackage
      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";
          }
      }
      
      
    访问swagger ui的链接 http://localhost:8080/swagger-ui/index.html在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/872457.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

dp练习【4】

最长数对链 646. 最长数对链 给你一个由 n 个数对组成的数对数组 pairs &#xff0c;其中 pairs[i] [lefti, righti] 且 lefti < righti 。 现在&#xff0c;我们定义一种 跟随 关系&#xff0c;当且仅当 b < c 时&#xff0c;数对 p2 [c, d] 才可以跟在 p1 [a, b…

Ubuntu环境的MySql下载安装

下载压缩包 此文章下载的mysql版本位5.7.29 sudo wget https://downloads.mysql.com/archives/get/p/23/file/mysql-server_5.7.29-1ubuntu18.04_amd64.deb-bundle.tar解压缩 sudo tar -xvf mysql-server_5.7.29-1ubuntu18.04_amd64.deb-bundle.tar命令解释 -x&#xff1a;…

鸿蒙MPChart图表自定义(四)短刻度线

对于图表中的x轴效果&#xff0c;我们有时想要实现如图所示的特定刻度线。若需绘制x轴的短刻度线&#xff0c;我们可以利用现有资源&#xff0c;将原本的网格线稍作修改&#xff0c;只需绘制一条简洁的短线即可达到目的。 具体的方法就是写一个类MyXAxisRender继承自XAxisRend…

【补-网络安全】日常运维(二)终端端口占用排查

文章目录 一、利用ipconfig、netstat 命令行统计二 、策略封禁IP 引言:检查频繁,第一步我们梳理完资产,第二步应该对资产终端进行一个排查,诊断把脉,了解清楚系统的端口占用及开放情况 一、利用ipconfig、netstat 命令行统计 1.先用ipconfig定位该终端的IP地址 2.明确IP地址后…

汇编语言在虚拟机中输出“Hello World!”

1.软件 Nasmide64.exe(李忠老师编写) Fixvhdw64.exe(李忠老师编写) VirtualBox虚拟机(免费 开源) 2.过程 01.Fixvhdw64.exe输入以下代码: mov ax,0xb800 mov ds,ax mov byte [0x00],H mov byte [0x02],e mov byte [0x04],l mov byte [0x06],l mov byte [0x08],o mov byte…

x-cmd pkg | tig - 基于 nucurses 的 git 文本模式界面

目录 简介首次用户快速实验指南功能特点类似工具与竞品进一步探索 简介 tig 由 Jonas Fonseca 于 2006 年使用 C 语言创建的 git 交互式文本命令行工具。旨在开启交互模式快速浏览 git 存储库的信息以及 git 命令的运行。 首次用户快速实验指南 本文的 demo 展现了如何通过 …

2024年高教杯国赛(D题)数学建模竞赛解题思路|完整代码论文集合

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

2024国赛数学建模ABC题思路模型

完整的思路模型请查看文末名片 完整的思路模型请查看文末名片 完整的思路模型请查看文末名片

精通Transformer,从零开始构建最先进的NLP模型(附PDF)

国内第1本Transformer——变形金刚红书 如果一定要说未来谁能引领人工智能世界&#xff0c;是Transformer而非chatGPT&#xff01; 编辑推荐★★★★★ ChatGPT红得发紫&#xff0c;强得让人类心悸。 但在它的背后&#xff0c;还隐藏着一位真正的大佬。 它的名字叫做——T…

科研绘图系列:R语言PCoA图(PCoA plot)

文章目录 介绍PCoA图的作用:说明的问题:加载R包导入数据数据预处理画图参考介绍 PCoA(主坐标分析,Principal Coordinate Analysis)是一种多维数据的降维技术,它用于探索高维空间中样本之间的关系。PCoA通常用于生态学、遗传学和其他领域的数据分析,以揭示样本或个体之间…

基于.NET6的WPF基础总结(上)

目录 一.常用属性介绍 二、 程序退出方式 三、布局样式 3.1 Panel的附加属性ZIndex 3.2 Grid(网格)布局 3.3 UniformGrid&#xff08;均分布局&#xff09; 3.4 StackPanel&#xff08;堆积面板&#xff09; 3.5 WrapPanel&#xff08;换行面板&#xff09; 3.6 Doc…

在模板中使用 Django 会话

在 Django 中使用会话&#xff08;session&#xff09;可以让你在用户访问网站的过程中存储和访问临时数据。我们可以利用会话在速度计算器的例子中存储和显示上次计算的结果。 1、问题背景 在 Django 中&#xff0c;可以使用会话来存储用户数据。在某些情况下&#xff0c;我们…

俄罗斯版微信遭遇大规模数据泄露,安全问题再引关注

据报道&#xff0c;俄罗斯最大的社交媒体和网络服务VK&#xff08;VKontakte&#xff09;遭遇了大规模的数据泄露事件&#xff0c;该事件对大量用户造成了影响。据非法市场BreachForums上一位名为Hikki-Chan的威胁行为者声称&#xff0c;2024年9月&#xff0c;VK的数据在论坛上…

Stream 流式编程

优质博文&#xff1a;IT-BLOG-CN 大家都知道可以将Collection类转化成流Stream进行操作&#xff08;Map并不能创建流&#xff09;&#xff0c;代码变得简约流畅。我们先看下流的几个特点&#xff1a; 1、流并不存储元素。这些元素可能存储在底层的集合中&#xff0c;或者是按需…

VMwareWorkstation安装Kali系统教程

Kali系统&#xff0c;全名为Kali Linux&#xff0c;为渗透测试和网络安全领域提供一个全面的工具集合。Kali系统预装了各种用于渗透测试和漏洞利用的工具&#xff0c;包括端口扫描、密码破解、网络嗅探、漏洞分析等。这些工具可以帮助安全专业人员评估和测试网络的安全性&#…

实例讲解Simulink应用层开发CAN报文解包及CAN信号设置方法

在VCU应用层开发中&#xff0c;在输入信号中主要包括开关信号、模拟信号、CAN信号、PWM信号等&#xff0c;其中CAN通讯由于通讯质量高&#xff0c;传输数据量大&#xff0c;采用总线通讯方式节省大量线束&#xff0c;在汽车上尤其是电动汽车上大量应用&#xff0c;当然&#xf…

数图亮相第三届中国区域零售创新峰会:共绘零售新蓝图,携手迈向新征程

8月31日&#xff0c;备受瞩目的第三届中国区域零售创新峰会在历史悠久的湖北襄阳圆满落下帷幕。在这场零售行业的盛会上&#xff0c;数图信息科技作为重要参会企业&#xff0c;积极参与其中&#xff0c;与众多行业精英共聚一堂&#xff0c;共同擘画零售业的宏伟蓝图。以下是本次…

C/C++ 中的算术运算及其陷阱(详解,举例分析)

在C/C编程中&#xff0c;算术运算是非常基础且常用的操作。然而&#xff0c;这些看似简单的运算背后却隐藏着一些潜在的陷阱&#xff0c;如果不加以注意&#xff0c;可能会导致程序出现难以预料的错误。本文将探讨C/C中常见的算术运算及其潜在的陷阱&#xff0c;并通过实例进行…

告别格式不兼容烦恼!ape转换mp3,分享3个简单方法

各位读者们&#xff0c;你们是否有过这种体验&#xff1a;满怀期待地在网上下载一首好听的歌曲&#xff0c;结果怎么点击手机都播放不了&#xff0c;定睛一看&#xff0c;弹窗显示“无法播放该音频文件”。这是为什么呢&#xff1f;原来那首歌的音频格式是ape&#xff0c;不被手…

iOS——关联对象学习补充

分类 在分类中添加属性会生成对应的成员变量&#xff0c;会生成对应的setter和getter方法的声明&#xff0c;但是不会生成setter和getter方法的实现。分类中的可以写property&#xff0c;会编译通过&#xff0c;但是引用变量会报错。分类中可以/只能访问原有类中.h中的属性。如…