基于苍穹外卖写的springboot学习笔记
一.关于md5加密的了解与使用
1.分析
MD5加密是一种不可逆的加密算法。也就是说我们只能正向加密,无法反向解密。
于是乎,当我们用它作为密码加密方式时,我们只能加密码从数据库拿来与前端传来的数据加密后进行比较。
2.使用方法
他是由springboot框架提供
二.关于swagger的了解与使用
1.导包
Knife4j是为Java MVC 框架集成Swagger 生成Api文档的增强解决方案。
2.在配置类中配置相关信息
3.设置静态资源映射,否者接口文档无法访问
注意:前端的访问端口号为80,后端为8080。nginx负责将前端进行部署
但这里swagger访问端口号是8080,说明我们是没有将swagger部署在前端。
4.swagger常用注解
@Api(tags=“”) 用在类上,对类进行描述,例如Controller层
@ApiModel(description=“”) 用在类上,一般的在实例类上使用,如果controller层的参数的类被他修饰则在接口文档页面会看到它的修饰
@ApiModelProperty(“ ”) 用在属性上,描述属性的信息
@ApiOperation(“ ”) 用在方法上,例如:Controller层的方法上
三.关于BaseContext的了解与使用
1.理解
BaseContext是基于ThreadLocal类封装的工具类,用于在同一线程中的封装数据和获取数据。
要注意的是ThreadLocal并不是一个Thread,而是Thread的局部变量。相当于线程变量,而每一次http请求后端服务器都会创建一个新的线程。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。我们把这个叫做线程隔离。
下面三个线程独立,线程变量相当于他们的副本,可以在本次线程内操作这些变量
2.使用
一般的我们在拦截器的类中获取jwt令牌并解析出id,之后通过存入当前线程变量中,也就是ThreadLocal中,后续使用通过
获取id。
四.关于分页查询
两种方法实现:
1.直接用数据库查询语句:select * from table limit start,pageSize;
2.用PageHelper工具,他是由springboot框架提供的工具。
他帮我们自动的计算出开始查询位置,查询数。
五.地址栏参数和路径参数有什么区别?
看了网上那些人说的,没什么太大的区别,并没有明确的指明什么时候用什么。
要注意的是,当使用路径参数的时候,需要在controller的参数总添加注解:@PathVariable,而地址栏传参一般不用注解@Requestparam,一般是封装一个对象。
例如:
六.四种请求方式都有什么区别?(2024.3.5)
GET,POST,DELETE,PUT这四种请求在日常使用中没有什么太大区别,其实我们可以拿post去替代delete,也是可以实现的,但这违背了Http协议规范。不提倡。
遵守Http协议规范有哪些好处:
见名知意,一般的GET请求是查看请求,POST请求是新增请求,DELETE请求是删除请求,PUT请求是修改请求。
七.一次登录请求的过程是如何实现的?
首先,我们发起一次登录请求,后端这边会最先经过拦截器,拦截器判断到请求是登录请求,选择放行,这时来到Controller层方法,方法中调用srvice层方法,这里会将password进行加密处理,同时会根据用户名在mapper进行条件查询。返回查询数据,对数据进行合法判断,判断是否为null,并抛出异常,如果数据存在,则与前端传来的已被加密的数据进行比对。正确返回员工数据,反之抛出异常。这里返回到了Controller层,Controller层将返回数据加入到jwt令牌的创建中,最后返回Result.success();
对于拦截器,这里使用的Interceptor拦截器。在请求到达Controller前回先经过拦截器的preHandle方法,在执行完请求后再经过逻辑器的postHandle和afterCompletion方法。
八.关于面向切面编程的了解与使用
面向切面编程的优点:
官方的话就是为了实现横切关注点的模块化,使得关注点可以被集中管理和使用。这跟static又有一点点类似,但又有不同。
区别:
1.动态需求
aop可以获取到当前的类的或方法的属性,这便可以动态的完成一些配置操作。
2.代码复用性
如果一段代码是重复的,不变的且还是通用的,我们使用static。
3.横切关注点的性质
如果您的横切关注点涉及到横跨多个模块或组件的通用功能,比如日志记录、性能监控、事务管理等,那么AOP更适合。
更改:什么是AOP?
AOP称为面向切面编程,是将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,我们将这段代码抽取出来封装为一个可重用的模块,这个模块叫“切面”,这样降低了模块与模块之间的耦合度。
九.关于使用aop是可能会用到的技术的了解与使用
1.自定义注解
定义注解类
添加两大注解
2.枚举
用于定义一些常量或常量方法
3.aop的使用
需要添加@Aspect注解来确定是一个注解类,这样才会识别注解中的方法,
需要添加@Component注解,aop是运行时生效,所以要把他交给spring容器来管理,这样来实现动态拼接。
切入点的使用:
@Printcut("execution(* con.sky.mapper.*.*.(..) && @annotation(com.sky.annotation.AutoFill)")
execution(任意返回值 路径下的所有类下的所有方法可以是任意参数)
十.关于@Component、@Bean、@Controller、@Service、@Mapper这几种注解的区别
@Bean:一般用在方法上,用来实例化一些对象并被容器管理
@Component: 他是spring框架最通用的注解之一,用于标识一个类作为Spring管理的组件。@Component
是一个顶层的泛型注解,还有其他一些专门用于特定场景的子注解,比如 @Service
用于标识服务层组件、@Repository
用于标识数据访问对象等。这些子注解都是 @Component
的特化,用于更明确地表示被注解类的用途。
@Controller、@Service、@Mapper:这三种注解都是用在不同业务层,分别是控制层,业务逻辑层,数据访问层。实质上与Component注解并无差别,只是代表了一层含义而已
十一.关于阿里云oss对象存储的使用方法
1.明确思路
①在springboot项目中,首先在.yml文件中配置需要的属性,域名 节点 id字段 密钥
②准备属性类,准备utils工具类
③在Config包中准备配置类,用于完成将属性类中的数据绑定给utils类。(注意:这里需要给配置类中的方法添加@Bean注解,@Bean一般用在方法上,将方法返回值交给springboot容器管理,存储的一般是实体类)
④在Controller层接收文件信息,其中需要解决文件名可能会重复的问题,这里我们用到UUID工具类,随机生成一串不重复的字符串。之后通过字符串方法 String.lastIndexof( );(获取最后一次出现该字符串的地方的索引值) 再用String.substring();获取后缀名。 最后拼接。调用工具类方法即可。
String str = "hello world";
String substr1 = str.substring(6); // 返回 "world"
String substr2 = str.substring(0, 5); // 返回 "hello"
十二.关于mappper层的一些使用技巧
一般用于插入操作
像那些需要执行完数据库操作返回本次id主键值的可以在对应的.xml文件的对应语句中加入 useGeneratedKeys=“true”,代表返回之间值,keyProperty="id"代表返回的值赋值给id。
对于那些需要批量插入的数据,无需再service层多次调用mapper层,可以只用<foreach>进行循环操作。
一般用于查询操作
多表查询
一般的删除操作
删除操作流程首先:
①判断被删除数据是否可以被删除,例如:起售中的菜品不允许被删除,被套餐关联的菜品不允许被删除
②删除数据
③删除被关联到的数据,例如:菜品关联到的口味数据