day01-项目基础搭建相关
1 dependencies 和 dependencymanagement
- dependencies
- 需要自己指定版本
- dependencymanagement
- 可以通过maven的依赖传递 在子模块中不指定项目版本 通过父模块指定使用父模块指定的版本
2 utf8 和 utf8mb4
utf8可以满足中文编码的要求,但是由于移动端需要存储表情之类的字符,所以需要使用utf8mb4
3 加微服务模块步骤
-
建module
- 设置父模块
- 设置包名
-
改pom
- 在建立的子模块中引入需要的依赖
-
写yml
-
主启动
-
修改Main类名为Main8001
-
加注解
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); } }
-
-
业务类
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)
- 与上面的区别在于初值不需要手动指定,而是赋值为第一个值
- .reduce(T identity, BinaryOperator<T> accumulator)
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());
}
}