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数据库)

      xml 复制代码
        <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都已经准备在导入的依赖中准备好了。

        properties 复制代码
        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,但是没有成功,手动创建了。

      java 复制代码
      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类。

      java 复制代码
      @Data
      public class User {
          private Integer id;
          private String name;
          private String address;
          private String gender;
      }
    • 准备CsvBatchJobConfig类,配置Spring BatchJob

      java 复制代码
      @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")

      java 复制代码
      @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

      java 复制代码
      @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

      sql 复制代码
      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

    • 导入需要的依赖。

      xml 复制代码
              <dependency>
                  <groupId>org.springdoc</groupId>
                  <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
                  <version>2.6.0</version>
              </dependency>
    • 配置springdoc-openapi Swagger3

      java 复制代码
      @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

      properties 复制代码
      springdoc.packagesToScan=com.example.demo.controller.swagger
    • 定义自己项目的controller

      java 复制代码
      @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

相关推荐
齐 飞21 分钟前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
狂放不羁霸29 分钟前
idea | 搭建 SpringBoot 项目之配置 Maven
spring boot·maven·intellij-idea
lulu_gh_yu36 分钟前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
丫头,冲鸭!!!1 小时前
B树(B-Tree)和B+树(B+ Tree)
笔记·算法
计算机学长felix1 小时前
基于SpringBoot的“校园交友网站”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·毕业设计·交友
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
码农派大星。1 小时前
Spring Boot 配置文件
java·spring boot·后端
听忆.1 小时前
手机屏幕上进行OCR识别方案
笔记
江深竹静,一苇以航1 小时前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot
幼儿园老大*2 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go