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

ops/2024/10/21 14:21:28/

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 {@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

  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 {@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中限定生成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.ppmy.cn/ops/106462.html

相关文章

安卓逆向(之)真机root(红米手机)

概览&#xff1a; 1, 手机解锁 2, 下载官方系统包&#xff0c;推荐线刷包,取出镜像文件 3, magisk工具修补 官方系统包 4, adb&#xff1a;命令对手机刷 root 5, 完成 6, 小米手机解锁 点击 小米手机解锁OEM官方教程 记得数据线连接手机电脑 工具下载 点击 下载adb(电脑操作…

【Redis】Redis 主从复制原理与配置详解:解决单点故障与性能瓶颈的最佳方案

目录 主从复制配置建立复制断开复制安全性只读传输延迟 拓扑⼀主⼀从结构一主多从结构树形主从结构 原理复制过程数据同步 psync全量复制部分复制实时复制 小结 主从复制 这部分相关操作不需要记忆!!! 后续⼯作中如果⽤到了能查到即可. 重点理解流程和原理. 单点问题&#xff1…

ChatGPT付费创作系统V3.0.6独立版 WEB+H5+小程序端 (新增AI全网搜索+文档解析+豆包AI通道)安装部署教程

播播资源GPT付费体验系统最新版系统是一款基于ThinkPHP框架开发的AI问答小程序&#xff0c;是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。这是一种基于人工智能技术的问答系统&#xff0c;可以实现智能回答用户提出的问题。相比传统的问答系统&#xff0c;ChatGPT可以更…

Python知识点:如何使用Python实现自动驾驶模拟

在 Python 中实现自动驾驶模拟&#xff0c;通常需要使用特定的仿真环境和工具库&#xff0c;以帮助处理感知、决策和控制等方面。这里是一个基本的流程和所需工具的介绍。 1. 选择仿真环境 常见的自动驾驶仿真环境包括&#xff1a; CARLA&#xff1a;开源自动驾驶模拟器&…

如何用 Typed.js 制作炫酷的打字效果?

前言 在前端开发的世界中&#xff0c;动态和交互性是用户体验的关键。 Typed.js 是一个轻量级的 JavaScript 库&#xff0c;它能够以编程方式模拟打字效果&#xff0c;为网页增添动态的文本展示。 这篇文章将带你深入了解 Typed.js 的魔力&#xff0c;探索它如何为前端开发带…

【编程底层思考】如何检测和避免线程死锁

一、什么是线程死锁? 线程死锁发生在多个线程因为争夺资源而相互阻塞&#xff0c;导致程序无法正常结束的情况。例如&#xff0c;线程A持有资源2并等待资源1&#xff0c;线程B持有资源1并等待资源2&#xff0c;这样就形成了死锁。 二、如何检测死锁&#xff1f; 使用jmap、…

一键解锁企业数智化转型:JNPF低代码平台的实践与应用

随着信息技术的飞速发展&#xff0c;企业面临的市场竞争日益激烈&#xff0c;数智化转型已成为企业持续发展的必由之路。数智化转型不仅涉及技术层面的革新&#xff0c;还包括业务流程、管理模式以及企业文化等多方面的深刻变革。在这一过程中&#xff0c;低代码平台作为一种新…

Servlet-学习笔记-上

1. Servlet简介 1.1 动态资源和静态资源 静态资源 无需再程序运行时通过代码生成的资源&#xff0c;再程序运行之前就写好的资源&#xff0c;例如html css js img &#xff0c;音频文件和视频文件 动态资源 需要在程序运行时通过代码运行生成的资源&#xff0c;在程序运行之…