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

相关推荐
Charles Ray25 分钟前
C++学习笔记 —— 内存分配 new
c++·笔记·学习
重生之我在20年代敲代码25 分钟前
strncpy函数的使用和模拟实现
c语言·开发语言·c++·经验分享·笔记
爱上语文27 分钟前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
荆州克莱29 分钟前
springcloud整合nacos、sentinal、springcloud-gateway,springboot security、oauth2总结
spring boot·spring·spring cloud·css3·技术
serve the people31 分钟前
springboot 单独新建一个文件实时写数据,当文件大于100M时按照日期时间做文件名进行归档
java·spring boot·后端
我要吐泡泡了哦1 小时前
GAMES104:15 游戏引擎的玩法系统基础-学习笔记
笔记·学习·游戏引擎
骑鱼过海的猫1231 小时前
【tomcat】tomcat学习笔记
笔记·学习·tomcat
贾saisai3 小时前
Xilinx系FPGA学习笔记(九)DDR3学习
笔记·学习·fpga开发
北岛寒沫4 小时前
JavaScript(JS)学习笔记 1(简单介绍 注释和输入输出语句 变量 数据类型 运算符 流程控制 数组)
javascript·笔记·学习
烟雨666_java4 小时前
JDBC笔记
笔记