springboot学习笔记

yml配置信息书写与获]

在这里插入图片描述

SpringBoot整合Mybatis

1.导入依赖

 		<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
        </dependency>

2.配置yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/bobo?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
    username: root
    password: czj520hjh

Bean扫描

在这里插入图片描述在这里插入图片描述

Bean注册

在这里插入图片描述

例如:

在这里插入图片描述

这种方式不建议

在这里插入图片描述

这种注入的对象的对象名默认为方法的名字,也可以在@Bean(“名字”)这种方式来进行改名字

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

自动配置原理

在这里插入图片描述

自定义starter

在这里插入图片描述

案例:

在这里插入图片描述

Spring Validation

spring 提供的一个参数校验框架,使用预定义的注解完成参数校验

在这里插入图片描述

在这里插入图片描述

@JsonIgnore(用于不返回密码)

@JsonIgnore//让springmvc把当前对象转换成json字符串的时候,忽略password,最终的json字符串中就没有password这个属性了

针对实体类中是驼峰命名,数据库是下划线命名可用方式

mybatis:
  configuration:
    map-underscore-to-camel-case: true #开启驼峰命名和下划线命名的自动转换

ThreadLocal(用于用户登录后的信息存储)

在这里插入图片描述

使用案例

1.封装为一个工具类

package com.bigevent.utils;

import java.util.HashMap;
import java.util.Map;

/**
 * ThreadLocal 工具类
 */
@SuppressWarnings("all")
public class ThreadLocalUtil {
    //提供ThreadLocal对象,
    private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();

    //根据键获取值
    public static <T> T get(){
        return (T) THREAD_LOCAL.get();
    }
	
    //存储键值对
    public static void set(Object value){
        THREAD_LOCAL.set(value);
    }


    //清除ThreadLocal 防止内存泄漏
    public static void remove(){
        THREAD_LOCAL.remove();
    }
}

2.在登录时,拦截器验证token的时候将用户信息加入进ThreadLocal中

 @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        令牌验证
        String token = request.getHeader("Authorization");
//        验证token
        try {
            Map<String, Object> claims = JwtUtil.parseToken(token);
//            把业务数据存储在Threadlocal里面
            ThreadLocalUtil.set(claims);
//            放行
            return true;
        }catch (Exception e){
            response.setStatus(401);
//            不放行

            return false;
        }
    }

3.在使用的地方直接get

 @GetMapping("/userInfo")
        public Result<User> userInfo(){
            Map<String,Object> map = ThreadLocalUtil.get();
            String username = (String)map.get("username");
            User user = userService.findByUserName(username);
            return Result.success(user);
        }

4.在拦截器中还要配置,在使用完后要记得清除掉,以防内存泄漏

 @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        清空ThreadLocal中的数据
        ThreadLocalUtil.remove();
    }

对实体参数进行参数校验

在这里插入图片描述

对url进行校验

在这里插入图片描述

分组校验

在这里插入图片描述

注意:

1.如果说某个校验项没有指定分组,默认属于Default分组

2.分组之间可以继承,A extends B 那么A中拥有B中所有的校验项

例如

package com.bigevent.pojo;

import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.groups.Default;
import lombok.Data;

import java.time.LocalDateTime;

@Data
public class Category {
    @NotNull(groups = Update.class)
    private Integer id;//主键ID
    @NotEmpty
    private String categoryName;//分类名称
    @NotEmpty
    private String categoryAlias;//分类别名
    private Integer createUser;//创建人ID
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime createTime;//创建时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime updateTime;//更新时间

    public interface Add extends Default {

    }
    public interface Update extends Default{

    }
}

自定义校验

在这里插入图片描述

例子:

package com.bigevent.anno;

import com.bigevent.validation.StateValidation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;

import java.lang.annotation.*;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Documented//元注解
@Constraint(
        validatedBy = {StateValidation.class}//指定提供校验规则的类
)
@Target({FIELD})//元注解
@Retention(RUNTIME)
public @interface State {//这是自定义的注解
//    提供校验失败后的提示信息
    String message() default "state参数的值只能是已发布或者草稿";
//指定分组
    Class<?>[] groups() default {};
//负载 获取到State注解的附加信息
    Class<? extends Payload>[] payload() default {};
}

package com.bigevent.validation;

import com.bigevent.anno.State;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

//ConstraintValidator<给那个注解提供校验规则,校验的数据类型>
public class StateValidation  implements ConstraintValidator<State,String> {//这是实现注解的方法
    @Override
//    value 将来要校验的数据  context
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        if(value==null||value==""){
            System.out.println("这里是空");
            return false;
        }
        if(value.equals("已发布")||value.equals("草稿")){
            return true;
        }
        return false;
    }
}

package com.bigevent.pojo;


import com.bigevent.anno.State;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
import org.hibernate.validator.constraints.URL;

import java.time.LocalDateTime;

@Data
public class Article {
    private Integer id;//主键ID
    @NotEmpty
    @Pattern(regexp="^\\S{1,10}$")
    private String title;//文章标题
    @NotEmpty
    private String content;//文章内容
    @NotEmpty
    @URL
    private String coverImg;//封面图像
    @State
    private String state;//发布状态 已发布|草稿
    @NotNull
    private Integer categoryId;//文章分类id
    private Integer createUser;//创建人ID
    private LocalDateTime createTime;//创建时间
    private LocalDateTime updateTime;//更新时间
}

package com.bigevent.controller;

import com.bigevent.pojo.Article;
import com.bigevent.pojo.Result;
import com.bigevent.service.ArticleService;
import com.bigevent.utils.JwtUtil;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
@RequestMapping("/article")
public class ArticleController {

    @Autowired
    private ArticleService articleService;

    @PostMapping
    public Result add(@RequestBody @Validated Article article){
        articleService.add(article);
        return Result.success();
    }
}


文件上传-上传到本地

在这里插入图片描述
在这里插入图片描述

令牌主动失效实现思路

在这里插入图片描述

在这里插入图片描述

@Cross0rigin//支持跨域让接口

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值