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();
}
}
文件上传-上传到本地