day01-项目基础搭建相关

1 dependencies 和 dependencymanagement

  • dependencies
    • 需要自己指定版本
  • dependencymanagement
    • 可以通过maven的依赖传递 在子模块中不指定项目版本 通过父模块指定使用父模块指定的版本

2 utf8 和 utf8mb4

utf8可以满足中文编码的要求,但是由于移动端需要存储表情之类的字符,所以需要使用utf8mb4

3 加微服务模块步骤

  1. 建module

    1. 设置父模块
    2. 设置包名
  2. 改pom

    1. 在建立的子模块中引入需要的依赖
  3. 写yml

  4. 主启动

    1. 修改Main类名为Main8001

    2. 加注解

      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      import tk.mybatis.spring.annotation.MapperScan;
      
      @SpringBootApplication
      @MapperScan("com.atguigu.cloud.mapper") // 启动包扫描 就不再需要重复编写@Mapper注解了
      public class Main8001 {
          public static void main(String[] args) {
              SpringApplication.run(Main8001.class, args);
          }
      }
      
  5. 业务类

4 mybatis-generator

  • 在一个工具模块中建立mybatis-generator
  • 首先引入依赖
<!-- Mybatis Generator 自己独有+自带版本号-->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.4.2</version>
        </dependency>

			<plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.4.2</version>
                <configuration>
                    <configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>8.0.33</version>
                    </dependency>
                    <dependency>
                        <groupId>tk.mybatis</groupId>
                        <artifactId>mapper</artifactId>
                        <version>4.2.3</version>
                    </dependency>
                </dependencies>
            </plugin>
  • 同时添加数据库以及generator的相关配置

    #t_pay表包名
    package.name=com.atguigu.cloud
    
    # mysql8.0
    jdbc.driverClass = com.mysql.cj.jdbc.Driver
    jdbc.url= jdbc:mysql://localhost:3306/cloud2024?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
    jdbc.user = root
    jdbc.password =123456
    
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration
            PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
            "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    
    <generatorConfiguration>
        <properties resource="config.properties"/>
    
        <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
            <property name="beginningDelimiter" value="`"/>
            <property name="endingDelimiter" value="`"/>
    
            <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
                <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
                <property name="caseSensitive" value="true"/>
            </plugin>
    
            <jdbcConnection driverClass="${jdbc.driverClass}"
                            connectionURL="${jdbc.url}"
                            userId="${jdbc.user}"
                            password="${jdbc.password}">
            </jdbcConnection>
    
            <javaModelGenerator targetPackage="${package.name}.entities" targetProject="src/main/java"/>
    
            <sqlMapGenerator targetPackage="${package.name}.mapper" targetProject="src/main/java"/>
    
            <javaClientGenerator targetPackage="${package.name}.mapper" targetProject="src/main/java" type="XMLMAPPER"/>
    
            <table tableName="t_pay" domainObjectName="Pay">
                <generatedKey column="id" sqlStatement="JDBC"/>
            </table>
        </context>
    </generatorConfiguration>
    
  • 通过插件中的mybatis-generator:generate一键生成实体类和mapper

  • 生成之后手动将相关代码拷贝至正式的模块中,然后将生成的地方的文件删除以免引发歧义

5 Controller和RestController

1. Controller, RestController的共同点

​ 都是用来表示Spring某个类的是否可以接收HTTP请求。

2. Controller, RestController的不同点

  • @Controller:标识一个Spring类是Spring MVC controller处理器,@RestController:@RestController是@Controller
  • @ResponseBody的结合体,两个标注合并起来的作用。@Controller类中的方法可以直接通过返回String跳转到jsp、ftl、html等模版页面。在方法上加@ResponseBody注解,也可以返回实体对象。@RestController类中的所有方法只能返回String、Object、Json等实体对象,不能跳转到模版页面。

前后端分离的模式中后端处理请求基本都是返回数据,所以跳转模板页面一般用不上,使用@RestController使用起来就更加方便了

6 swagger注解

  • 针对controller类使用注解@Tag(name="", description=""),针对具体的接口使用注解@Operation(summary="", description="")
  • 针对实体类以及它的每一个字段使用注解@Schema(title="")

同时还要添加配置类SwaggerConfig.class,例子如下

package com.atguigu.cloud.config;

import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Swagger3Config
{
    /**
     * 将接口根据模块进行分组
     */
    
    @Bean
    public GroupedOpenApi PayApi()
    {
        return GroupedOpenApi.builder().group("支付微服务模块").pathsToMatch("/pay/**").build();
    }
    @Bean
    public GroupedOpenApi OtherApi()
    {
        return GroupedOpenApi.builder().group("其它微服务模块").pathsToMatch("/other/**", "/others").build();
    }
    /*@Bean
    public GroupedOpenApi CustomerApi()
    {
        return GroupedOpenApi.builder().group("客户微服务模块").pathsToMatch("/customer/**", "/customers").build();
    }*/

    /**总的项目说明*/
    @Bean
    public OpenAPI docsOpenApi()
    {
        return new OpenAPI()
                .info(new Info().title("cloud2024")
                        .description("通用设计rest")
                        .version("v1.0"))
                .externalDocs(new ExternalDocumentation()
                        .description("www.atguigu.com")
                        .url("https://yiyan.baidu.com/"));
    }
}

运行项目之后访问

localhost:port/swagger-ui/index.html

可以查看生成的接口声明,也可以通过其进行接口测试 try-it-out --> execute

7 时间格式统一

两种方式解决

  • 相应的属性上添加注解@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")

  • 如果是springboot项目,可以通过配置解决

    spring:
    	jackson:
    		date-format: yyyy-MM-dd HH:mm:ss
    		timezone: GMT+8
    

8 请求响应状态规范

分类 区间 分类描述
1** 100-199 信息,服务器收到请求,需要请求者继续执行操作
2** 200-299 成功,操作被成功接收并处理
3** 300-399 重定向,需要进一步的操作以完成请求
4** 400-499 客户端错误,请求包含语法错误或无法完成请求
5** 500-599 服务器错误,服务器在处理请求的过程中发生了错误

9 stream流式计算

Java8中的新特性,使用函数式编程方式,对集合或数组进行链状流式的操作

原理:每一个集合的父类Collection都有一个stream方法,返回一个Stream流对象

作用:在进行大数据操作时通过异步操作提高处理数据的效率

中间操作:

  • filter
    • 对流中的元素进行条件过滤,符合的保留在流中
    • 通常通过λ表达式的方式编写条件
  • map
    • 对流中的元素进行计算或转换
    • 方法参数中传入一个function函数型接口,重写其中的apply方法,通过遍历拿到某个对象的某个属性
  • distinct
    • 去除流中重复的元素
    • 依赖对象的equals方法完成,自定义对象需要重写equals
  • sorted
    • 对流中的元素进行排序
    • 如果调用无参数的方法,被排序的对象需要实现Comparable以及实现compareTo方法;调用带参的方法就通过匿名内部类的方式重写compareTo方法
  • limit
    • 设置流的最大长度,超出的部分将被抛弃
  • skip
    • 跳过流中的前n个元素,返回剩下的元素
  • flatMap
    • map只能把一个对象转换成另一个对象来作为流中的元素,而flatMap可以把一个对象转换成多个对象作为流中的元素
    • 调用这个方法,可以将对象中的集合,再转换成Stream流,那么这个新的Stream流中的泛型类型就是原来对象中集合的元素类型
  • peek
    • 在Stream中提供调试的功能,他虽然传入了一个消费型接口,但是并不是真正的去消费数据,供开发人员调试用
    • 传入一个Consumer匿名内部类,对流中的元素进行调试操作

终结操作:

  • forEach
    • 对流中的元素进行遍历操作,我们通过传入的参数去指定对遍历到的元素进行什么具体的操作
  • count
    • 可以用来获取当前流中元素的个数
  • min | max
    • 获取最值
  • collect
    • 把当前的流转换成一个集合
    • 例如:
      • .collect(Collectors.toList())
      • .collect(Collectors.toSet())
      • .collect(Collectors.toMap(obj -> obj.getParam1(), obj -> obj.getParam2()))

查找与匹配

  • anyMatch
    • 可以用来判断是否有任意符合匹配条件的元素,结果为布尔类型
  • allMatch
    • 可以用来判断是否都符合匹配的条件,结果为布尔类型。如果都符合则为true,否则为false
  • noneMatch
    • 可以判断流中的元素是否都不符合匹配的条件。如果都不符合结果为true,否则则为false
  • findAny
    • 获取流中的任意一个元素,该方法没有办法保证获取的一定是流中的第一个元素
  • findFirst
    • 获取流中的第一个元素

reduce

  • 对流中的数据(多个)按照你指定的计算方式,计算出一个结果(缩减操作

  • 原理

    T result = identity;
    for(T element : this stream){
    	result = accumulator.apply(result,element);
    }
    return result;
    
  • 使用

    • .reduce(T identity, BinaryOperator<T> accumulator)
      • 第一个参数:初值
      • 第二个参数:计算方式
    • .reduce(BinaryOperator<T> binaryOperator)
      • 与上面的区别在于初值不需要手动指定,而是赋值为第一个值

10 全局异常处理器

使用注解@RestControllerAdvice定义一个全局异常处理的类GlobalExceptionHandler,作用是:

  • 通过@ControllerAdvice注解可以将对于控制器的全局配置放在同一个位置。

  • 注解了@RestControllerAdvice的类的方法可以使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上。

  • @RestControllerAdvice注解将作用在所有注解了@RequestMapping的控制器的方法上。

  • @ExceptionHandler:用于指定异常处理方法。当与@RestControllerAdvice配合使用时,用于全局处理控制器里的异常

  • @InitBinder:用来设置WebDataBinder,用于自动绑定前台请求参数到Model中。

  • @ModelAttribute:本来作用是绑定键值对到Model中,当与@ControllerAdvice配合使用时,可以让全局的@RequestMapping都能获得在此处设置的键值对

例子:

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(RuntimeException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ResultData<String> exception(Exception e){
        System.out.println("##########come in GlobalExceptionHandler");
        log.error("全局异常信息:{}",e.getMessage(),e);
        return ResultData.fail(ReturnCodeEnum.RC500.getCode(), e.getMessage());
    }
}

posted @ 2024-07-06 08:58  yuqiu2004  阅读(26)  评论(0编辑  收藏  举报