首页 > 其他分享 >Spring-Boot学习

Spring-Boot学习

时间:2024-03-01 21:00:57浏览次数:28  
标签:return String Spring boot 学习 static Boot public subject

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

标签:return,String,Spring,boot,学习,static,Boot,public,subject
From: https://www.cnblogs.com/LIang2003/p/18047924

相关文章

  • SpringCloud Alibaba-4-Feign远程调用
    远程调用:在分布式系统中,我们使用springboot创建了各种各样服务,那么这些服务之间如何进行远程调用呢。如:订单微服务怎么去调用商品微服务?Ribbon:是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon支持的负载均衡策略:BestAvailableRuleAvai......
  • 在 Spring Boot 3.x 中使用 SpringDoc 2 / Swagger V3
    SpringDocV1只支持到SpringBoot2.xspringdoc-openapiv1.7.0isthelatestOpenSourcereleasesupportingSpringBoot2.xand1.x.SpringBoot3.x要用SpringDoc2/SwaggerV3,并且包名也改成了springdoc-openapi-starter-webmvc-uiSpringDocV2https://spr......
  • 动手学强化学习(二):BAM代码
    一、greedyimportnumpyasnpimportmatplotlib.pyplotaspltclassBernoulliBandit:"""伯努利多臂老胡机,输入K表示拉杆个数"""def__init__(self,K):self.probs=np.random.uniform(size=K)#随机生成K个0~1的数,作为拉动每根拉杆的获奖......
  • 动手学强化学习(三):马尔可夫决策过程
    转载自:https://hrl.boyuai.com/chapter/1/马尔可夫决策过程3.1简介马尔可夫决策过程(Markovdecisionprocess,MDP)是强化学习的重要概念。要学好强化学习,我们首先要掌握马尔可夫决策过程的基础知识。前两章所说的强化学习中的环境一般就是一个马尔可夫决策过程。与多臂老胡机问题......
  • 学习unigui【22】unistringGrid的标题栏双击事件
    第一步:在TuniStringGrid的ClientEvents.ExtEvents中定义Ext.grid.Panel的reconfigure事件:functionreconfigure(sender,store,columns,oldStore,oldColumns,eOpts){columns.forEach(function(col){if(col.titleEl){col.titleEl.on('dblcli......
  • 浮木云学习日志(9)---模块统计设计
    ​在SaaS系统中,统计模块是非常重要的一个功能。对于C端产品,可能会展示用户个人使用数据,比如Keep中的锻炼时长统计。虽然这些数据只是供用户了解自己的使用情况,并非必需。然而,在B端的SaaS系统中,由于用户众多且业务复杂,公司管理层需要查看全公司数据和员工绩效情况。因此,SaaS系统必......
  • Lua学习笔记3
    Lua学习笔记3IO读写Lua中读写使用自带的I/O库处理文件。分为简单模式和完全模式。简单模式(simplemodel)拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。完全模式(completemodel)使用外部的文件句柄来实现。它以一种面对对象的形式,将所有的文件......
  • Vue学习笔记31--自定义指令--函数式
    Vue学习笔记-自定义指令<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>自定义指令</title&......
  • Vue学习笔记30--v-pre
    v-pre指令:1.跳过其所在节点的编译过程2.可利用v-pre跳过:没有使用指令语法、没有使用插值语法点节点,会加快编译。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-s......
  • 简单dp 学习笔记
    1.背包1.1背包模型的概述有\(n\)种物品,每种物品有若干个。拿一件物品付出\(w_i\)代价获得\(v_i\)价值,问最多花费\(V\)的代价能获得的最大价值。1.20/1背包考虑每种物品只有一个的情况。我们设\(f_{i,j}\)表示前\(i\)个物品,花费了\(j\)的最大价值。于是得出......