Springboot 菜鸟日记 第一天

本文讲述了新手如何使用SpringBoot进行快速初始化,包括添加必要的依赖、配置数据库连接、MyBatis的整合、JWT的使用以及拦截器的设置,介绍了后端开发的基本流程和技术点。
摘要由CSDN通过智能技术生成

SpringBoot学习

新人第一篇博客,希望每天坚持学习,诸君共勉!

第一天

觉得自己手搓Springboot没什么必要,直接进行初始化Springboot项目觉得简单许多

傻瓜式创建,只要记得进入后修改一下maven配置即可,maven奇怪的一点就是每次创建新项目都要重新配置一下,不知道为什么

首先配置pom文件

  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
<!--    web依赖-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
<!--  mybatis 依赖-->
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>3.0.3</version>
    </dependency>
<!--    mysql-->
    <dependency>
      <groupId>com.mysql</groupId>
      <artifactId>mysql-connector-j</artifactId>
    </dependency>

mybatis的使用,以及启动时所需要的几个必须依赖

数据库依赖配置以后

首先配置数据库,写在yml文件中
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis
    username: root
    password: 888888888

然后写出然后在pojo包中创建实体类

在mapper包中写mapper接口,写出想要使用的mysql以及函数,mysql使用注解的方式来进行查找

@Mapper
public interface UserMapper {
  @Select("select * from user where id = #{id}")
  public User findById(Integer id);
​
}

在service包中写出使用的接口,再写出接口的实现类,写在impl包中

实现类中要写出使用的mapper,继承service接口,最后写出返回的结果

@Service
public class UserServiceImpl implements UserService {
​
  @Autowired
  private UserMapper userMapper;
  @Override
  public User findById(Integer id) {
    return userMapper.findById(id);
  }
}

再再controller包中写出对应的接口

@RestController
public class UserController {
​
  @Autowired
  private UserService userService;
​
  @RequestMapping("/findById")
  public User findById(Integer id){
    return userService.findById(id);
  }
​
}

后端正则的使用

public Result login(@Pattern(regexp = "^\\S{5,16}$")String username,@Pattern(regexp = "^\\S{5,16}$") String password){

在传入参数前面加入@Pattern即可进行参数校验,再使用全局异常处理器,即可做到许多if可以做的事情

@RestControllerAdvice
public class GlobalExceptionHandler {
​
  @ExceptionHandler(Exception.class)
  public Result handleException(Exception e){
    e.printStackTrace();
    return Result.error(StringUtils.hasLength(e.getMessage())? e.getMessage() : "操作失败");
  }
}

JWT的使用

首先导入pom文件的依赖(还有单元测试的依赖)

<!--java-jwt坐标-->
    <dependency>
      <groupId>com.auth0</groupId>
      <artifactId>java-jwt</artifactId>
      <version>4.3.0</version>
    </dependency>
<!--    单元测试的坐标-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
    </dependency>

导入后在test中可以进行单元测试,jwt类似于把用户信息以及传递的报文以及时间全部加密成一个字符串进行传输,保证时效性和安全性

@Test
void testGen(){
  Map<String,Object> claims=new HashMap<>();
  claims.put("id",1);
  claims.put("username","张三");
  String token=JWT.create()
      .withClaim("user",claims).//添加载荷
      withExpiresAt(new Date(System.currentTimeMillis()+1000*60*60*12))//添加过期时间
      .sign(Algorithm.HMAC256("qianqiu"));
  System.out.println(token);
}

这段代码主要为了生成JWT

@Test
void testParse(){
  String token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9."
      + "eyJleHAiOjE3MDg1NTc3NjQsInVzZXIiOnsiaWQiOjEsInVzZXJuYW1lIjoi5byg5LiJIn19."
      + "skJhKMobGVU3Z_LjO6x4XeXzlsAY9tDCRzXc4a0WlYw";
  JWTVerifier jwtVerifier= JWT.require(Algorithm.HMAC256("qianqiu")).build();
​
  DecodedJWT decodedJWT = jwtVerifier.verify(token);
  Map <String , Claim> claims = decodedJWT.getClaims();
  System.out.println(claims.get("user"));
}

这是为了通过jwt进行检验

验证token
try {
  Map<String, Object> claims = JwtUtil.parseToken(token);
  return  Result.success("所有的文章内容");
}catch (Exception e){
  response.setStatus(401);
  return  Result.error("未登录");
}

在接口编写时,使用这种方式即可进行jwt验证,如果验证失败返回401,验证成功继续发送

但是如果登陆以后,每个接口都需要使用jwt验证,这就比较繁琐,所以就直接使用拦截器,在每一个接口函数进行之前,先进行jwt验证,在继续函数

拦截器的写法

首先写出这个类(暂时没懂)

@Component
public class LoginInterceptor implements HandlerInterceptor {
​
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      throws Exception {
    //令牌验证
    String token = request.getHeader("Authorization");
    try {
      Map<String, Object> claims = JwtUtil.parseToken(token);
      return true;//放行
    }catch (Exception e){
      response.setStatus(401);
      return false;//不放行
    }
​
  }
}

再写出这个类,大概意思是出来登录注册,其余接口都需要拦截

@Configuration
public class WebConfig implements WebMvcConfigurer {
​
  @Autowired
  private LoginInterceptor loginInterceptor;
​
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    //登录接口和注册接口不拦截
    registry.addInterceptor(loginInterceptor).excludePathPatterns("/user/login","/user/register");
  }
}
小结

今天基本上了解了后端开发的流程,controller层主要负责接口函数,调用service层进行实际操作,记得使用service时要@autowried,目前不理解,然后service层中包括接口与实际的impl的接口实现类,然后service层又调用mapper层,mapper层主要负责与数据库进行交互,使用sql语句和函数,sql语句中的参数使用#{XXX}这种格式就可以,pojo是实体类,应该在数据库构建后就进行编写,写出属性可以自动生成剩下的,@Data还挺好用, 然后应该还有一个utils工具包,大概就这样,明天继续!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值