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

news2024/9/20 8:06:29

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在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

个人网站免费上线

声明一下&#xff0c;小科用的是natapp&#xff0c;进行的 1.起步-下载安装 去浏览器搜索" natapp "&#xff0c;在官网下载&#xff0c;或者直接 点击下列网站 NATAPP-内网穿透 基于ngrok的国内高速内网映射工具https://natapp.cn/ 打开后下滑找到下载&#xff…

JMeter Plugins之内网插件问题解决

JMeter Plugins之内网插件问题解决 背景 在我司内部进行JMeter工具进行性能脚本开发时&#xff0c;为了提高测试效率&#xff0c;我们会用到部分JMeter提供的插件&#xff0c;但是在我司内网的情况下&#xff0c;我们如果直接点击JMeter界面右上角的插件按钮 弹出来的JMeter…

洛谷刷题(4)

P1089 [NOIP2004 提高组] 津津的储蓄计划 题目描述 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300 元钱&#xff0c;津津会预算这个月的花销&#xff0c;并且总能做到实际花销和预算的相同。 为了让津津学习如何储蓄&#xff0c;妈妈提出&#xff0c;津津可以随…

零基础5分钟上手亚马逊云科技 - AI模型内容安全过滤

在上一篇文章中&#xff0c;小李哥带大家深入调研亚马逊云科技AI模型平台Amazon Bedrock热门开发功能&#xff0c;了解了模型平台的文字/图片生成、模型表现评估和模型内容安全审核的实践操作。这次我们将继续介绍如何利用API的形式&#xff0c;利用Python代码的形式对AI模型内…

OpenSearch的快照还原

本次测试选择把索引快照备份到Amazon S3&#xff0c;所以需要使用S3 repository plugin&#xff0c;这个插件添加了对使用 Amazon S3 作为快照/恢复存储库的支持。 OpenSearch集群自带了这个插件&#xff0c;所以无需额外安装。 由于需要和Amazon Web Services打交道&#xf…

工厂数字化转型中工业一体机起到什么作用?

近年来工厂数字化转型成为企业提升竞争力的关键路径。而在这场转型浪潮中&#xff0c;工业一体机扮演着至关重要的角色&#xff0c;它不仅是推动工厂数字化转型的关键工具&#xff0c;更是赋能企业实现更高效、智能、灵活生产的关键要素。 一、工业一体机&#xff1a;连接物理与…

CAN通信之波特率相关配置

由于 CAN 属于异步通讯&#xff0c;没有时钟信号线&#xff0c;连接在同一个总线网络中的各个节点会像串口异步通讯那样&#xff0c;节点间使用约定好的波特率进行通讯。 首先我们要明确几个概念&#xff1a; 波特率&#xff1a;can 1s传输的位数&#xff0c;其单位为bps。 T…

Vue3学习笔记之插槽

目录 前言 一、基础 (一) 默认插槽 (二) 具名插槽 (三) 作用域插槽 (四) 动态插槽 二、实战案例 前言 插槽&#xff08;Slots&#xff09;&#xff1f; 插槽可以实现父组件自定义内容传递给子组件展示&#xff0c;相当于一块画板&#xff0c;画板就是我们的子组件&…

速速报名|数据治理与数据建模workshop报名开启

由Datamodeling社区出品的「数据治理与数据建模workshop 」将在9月份正式启动上海站和深圳站。 本课程由社区特邀讲师王琤老师、黄峰老师授课&#xff0c;两位老师基于丰富的数据管理经验提炼出知识体系&#xff0c;以面对面带练的方式&#xff0c;帮助学习者快速掌握数据建模…

dp+差分数组

前言&#xff1a;怎么也没想到要用dp来做&#xff0c;并且这个题目中如果列为1的话还要特殊考虑 题目地址 #include<bits/stdc.h> using namespace std;//#define int long long const int N (int)5e3 10; int dp[N][N][2]; // 0 表示上端点&#xff0c;1表示下端点 in…

正确枚举 Winlogon 桌面窗口层次

目录 前言 原理解释 原理实现 Winlogon 桌面窗口层次 本文出处链接&#xff1a;https://blog.csdn.net/qq_59075481/article/details/141608316。 前言 众所周知&#xff0c;从 Windows 7 开始&#xff0c;Winlogon 桌面不再使用 SASWindow 作为背景窗口&#xff0c;而是采…

翻斗雨量监测站

翻斗雨量监测站通常用于测量和记录降雨量&#xff0c;其主要功能包括&#xff1a; 测量降雨量&#xff1a;翻斗雨量监测站使用翻斗式测量原理&#xff0c;通过记录翻斗倒转的次数或翻斗中积累的水量来测量降雨量。可以准确地记录降雨量的变化。 记录降雨时间&#xff1a;翻斗雨…

PowerDesigner生成数据字典文档

PowerDesigner生成数据字典文档 目录 1. 设置报告 2. 导出报告 3. 查看报告 设置报告 删除多余的选项&#xff0c;只保留【LIst of Table Columns -表%PARENT%的栏的清单】选项。 只显示Name、Code、Data Type、Length、Is Key等列 导出报告 查看报告

如何用Java SpringBoot+Vue构建房产信息管理系统?详解开发流程

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

互联网应用主流框架整合之Spring缓存机制和Redis结合

Redis和数据库的结合 在实际的商用软件使用中&#xff0c;通常都是Redis和关系型数据配置使用&#xff0c;单纯使用Redis来存数据成本太高&#xff0c;并且其持久化和计算能力偏差&#xff0c;这两块无法和关系型数据相比较&#xff0c;而Redis和关系型数据库共存的场景就会带…

C++必修:set与map的模拟实现

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. set与map的结构 我们知道STL中的set与map底层就是一颗红黑树&#xff0c;接下…

如何在Spring中为`@Value`注解设置默认值

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

如何处理在学校Linux连接不上服务器

一、问题描述 当我们在周末在图书馆背着室友偷偷学习时&#xff0c;准备好好学习Linux&#xff0c;争取在日后大展拳脚时&#xff0c;却突然尴尬的发现&#xff0c;连接不上服务器&#xff0c;总是出现以下画面&#xff1a; 那么&#xff0c;我们该如何解决问题呢&#xff1f; …

螺杆支撑座与滚珠丝杆的精准适配!

螺杆支撑座与滚珠丝杆的适配是确保机械系统的稳定性、精度和耐用性的关键&#xff0c;其适配方法主要包括螺纹连接、联轴器连接、锁紧连接。 螺杆支撑座种类多样&#xff0c;每种类型都有其特定的适用范围和性能特点。因此&#xff0c;根据滚珠丝杆的规格和应用需求&#xff0c…

Python接口测试之如何使用requests发起请求例子解析

在Python中&#xff0c;使用requests库发起HTTP请求是一种常见的接口测试方法。以下是一些使用requests库的基本示例&#xff0c;涵盖了GET、POST、PUT、DELETE等HTTP方法。 安装requests库 首先&#xff0c;确保你已经安装了requests库。如果未安装&#xff0c;可以通过以下…