Spring-Boot学习

Spring-boot学习笔记

从零开始创建项目

  1. 先创建一个空的Maven项目,然后在pom.xml引入Spring-boot-starter的父依赖
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.0</version>
    </parent>
  1. 在下面导入web依赖
 <dependencies>
        <!--Spring-boot-web开发依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

每次导完依赖记得刷新一下

application配置文件

在Resource目录下创建application.yml文件,用于项目的一些基本配置

Spring-boot整合Mybatis

  1. 导入Mybatis依赖和数据库驱动
        <!-- Mybatis依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.2</version>
        </dependency>
        <!--数据库驱动-->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
  1. 在application文件中配置数据库相关信息
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

数据库url一直到3306,后面test是我自定义的一个数据库,后面是定义字符集,没有定义的话后台数据传输涉及中文可能乱码

  1. 记得配置一下驼峰命名法
mybatis:
   configurations:
      map-underscore-to-camel-case: true

Mybatis-plus 遇到类型转化报错

可能的原因

Validation 参数校验

  1. 引入起步依赖

      <!--validation参数校验 依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
    
  2. 在参数前面加@Pattern注解

  3. 在controller类上加@validated

  4. 在全局异常处理器中处理 参数校验失败异常 在处理类上加 @RestControllerAdvice

JWT 登录认证

  1. 导入jwt依赖
   <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt</artifactId>
      <version>0.9.1</version>
   </dependency>
  1. 写个jwt工具类
public class JwtUtil {

    //有效期为
    public static final Long JWT_TTL = 24*60 * 60 *1000L;// 保存一天
    //设置秘钥明文
    public static final String JWT_KEY = "LiangLjt";//这个密文随便设,八位就好,别多别少

    public static String getUUID(){
        String token = UUID.randomUUID().toString().replaceAll("-", "");
        return token;
    }
    
    /**
     * 生成jtw
     * @param subject token中要存放的数据(json格式)
     * @return
     */
    public static String createJWT(String subject) {
        JwtBuilder builder = getJwtBuilder(subject, null, getUUID());// 设置过期时间
        return builder.compact();
    }

    /**
     * 生成jtw
     * @param subject token中要存放的数据(json格式)
     * @param ttlMillis token超时时间
     * @return
     */
    public static String createJWT(String subject, Long ttlMillis) {
        JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID());// 设置过期时间
        return builder.compact();
    }

    private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        SecretKey secretKey = generalKey();
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        if(ttlMillis==null){
            ttlMillis=JwtUtil.JWT_TTL;
        }
        long expMillis = nowMillis + ttlMillis;
        Date expDate = new Date(expMillis);
        return Jwts.builder()
                .setId(uuid)              //唯一的ID
                .setSubject(subject)   // 主题  可以是JSON数据
                .setIssuer("sg")     // 签发者
                .setIssuedAt(now)      // 签发时间
                .signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥
                .setExpiration(expDate);
    }

    /**
     * 创建token
     * @param id
     * @param subject
     * @param ttlMillis
     * @return
     */
    public static String createJWT(String id, String subject, Long ttlMillis) {
        JwtBuilder builder = getJwtBuilder(subject, ttlMillis, id);// 设置过期时间
        return builder.compact();
    }


   public static void main(String[] args) throws Exception {

      String token = createJWT("LBWNB",(1000*60*60L));

      Claims result = parseJWT(token);

      System.out.println(result);


   }

    /**
     * 生成加密后的秘钥 secretKey
     * @return
     */
    public static SecretKey generalKey() {
        byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
        return key;
    }
    
    /**
     * 解析
     *
     * @param jwt
     * @return
     * @throws Exception
     */
    public static Claims parseJWT(String jwt) throws Exception {
        SecretKey secretKey = generalKey();
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody();
    }


}
  1. 生成jwt报错,可以看看这篇文章 ,导入下面依赖解决
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
  1. 建议深入学习一下 jwt

自定义注解 例子:参数校验

现在Article实体类的status字段只允许 是"已发布" 或者"草稿",通过自定义注解来进行参数校验

  1. 创建注解类State
@Documented
@Target({ElementType.FIELD}) //指定用于 值 
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {StateValidation.class}) //指定提供校验规则的类

public @interface State {

   String message() default "state的参数只能是 发布 | 草稿";

   Class<?>[] groups() default {};

   Class<? extends Payload>[] payload() default {};

}

  1. 创建自定义参数校验类StateValidation
public class StateValidation implements ConstraintValidator<State,String> {

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        //检验Article中的status值是否 是 "已发布" 或者 "草稿"

        if(s==null) return false;

        return s.equals("已发布") || s.equals("草稿");

    }
}
  1. 之后在哪需要用到就在哪添加@State
  2. 进一步学习的话可以自己点进某个注解里面了解

Spring-boot集成 Redis

  1. 导入 Redis 依赖
     <!--Redis依赖-->
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-redis</artifactId>
     </dependency>
  1. 在application.yml文件中配置Redis相关信息,下面是没设密码的redis,如果有还要加密码
spring:
  data:
    redis:
      host: localhost
      port: 6379
  1. 写个测试类 ,测试是否能成功连上redis
@SpringBootTest
public class RedisTest {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    public void testSet()
    {
        //在redis中存储一个键值对
        ValueOperations<String,String> operations = stringRedisTemplate.opsForValue();

        operations.set("Lnn","123");//自己设一个键值对
    }
}
  1. 开启Redis服务,然后运行test,然后在Redis客户端中 输入"Lnn"(你设置的value),看能不能获取到"123"(对应key)。

Spring-boot 项目打包

  1. 在pom.xml加入打包插件,然后刷新一下,之后在maven项目的生命周期那一栏下面 点击package
    <build>
        <plugins>
            <!-- 打包插件 版本最好是跟Spring-boot项目版本保持一致-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>3.2.0</version>
            </plugin>
        </plugins>
    </build>
  1. 之后就可以看到target目录下有个jar包了,可以在准备工作做好后(数据库服务,redis服务等),在jar包的目录下通过命令行运行(注意你在IDEA的jdk版本可能和本机的jdk版本不同,最好是同一个大版本)
java -jar 包名.jar
posted @ 2024-03-01 20:52  Liang2003  阅读(3)  评论(0编辑  收藏  举报