Springboot最佳案例之完成一个抢红包操作

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

修改pom.xml同意springboot版本


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.neuedu</groupId>
    <artifactId>springboot_red_bag</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot_red_bag</name>
    <description>springboot_red_bag</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
        </dependency>

        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-mp</artifactId>
            <version>2.7.0</version>
        </dependency>

        <dependency>
            <groupId>cn.springboot</groupId>
            <artifactId>best-pay-sdk</artifactId>
            <version>1.1.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

常见配置文件的书写

  • yml格式配置
server:
  port: 8889
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/user_case?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
    username: root
    password: root
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
  jackson:
    default-property-inclusion: non_null
  mvc:
    static-path-pattern: /static/**

在这里插入图片描述

ddl-auto: 参数说明
  • create :每次运行时,都会重新创建表,所以数据会丢失
  • create -drop: 每次运行程序会创建表结构, 程序结束删除表
  • update :每次运行程序时,没有表会创建表,如果对象发生改变会更新表结构,原来数据不会清空,只会更新(推荐使用)
  • validate 校验程序与数据库中字段是否相同, 不同会报错
  • none 禁止使用DDL
实体类创建

Lombok常用的几个注解:

  • @Data : 注在类上,提供类的get、set、equals、hashCode、canEqual、toString方法
  • @AllArgsConstructor : 注在类上,提供类的全参构造
  • @NoArgsConstructor : 注在类上,提供类的无参构造
  • @Setter : 注在属性上,提供 set 方法
  • @Getter : 注在属性上,提供 get 方法
  • @EqualsAndHashCode : 注在类上,提供对应的 equals 和 hashCode 方法
  • @Log4j/@Slf4j : 注在类上,提供对应的 Logger 对象,变量名为 log
package com.neuedu.springboot_red_bag.domain;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.math.BigDecimal;

/**
 * @ Author     :Eric Lee
 * @ Date       :Created in 14:30 2021/9/1
 * @ Description:
 * @ Modified By:
 * @ Version    : 1.
 * // @Data lombok插件的一个注解,标识此注解的实体类不用自己写get和set方法了
 * // @Entity 指定该类是实体类、
 */
@Entity
@Data
public class LuckyMoney {
    //@Id 代表主键 @GeneratedValue代表自增长
    @Id
    @GeneratedValue
    private Integer id;
    // 红包金额
    private BigDecimal money;
    // 发红包的人
    private String producer;
    // 收红包的人
    private String consumer;
    public LuckyMoney(){
    }
}

dao

package com.neuedu.springboot_red_bag.dao;

import com.neuedu.springboot_red_bag.domain.LuckyMoney;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * @ Author     :Eric Lee
 * @ Date       :Created in 14:34 2021/9/1
 * @ Description:
 * @ Modified By:
 * @ Version    : 1.0
 */
// JpaRepository<实体类, 主键类型>
public interface LuckyMoneyRepository extends JpaRepository<LuckyMoney, Integer> {
}

在这里插入图片描述

  • goto test 编写测试类
  • 在这里插入图片描述
package com.neuedu.springboot_red_bag.dao;

import com.neuedu.springboot_red_bag.domain.LuckyMoney;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class LuckyMoneyRepositoryTest {
    //注入Bean
    @Autowired
    private LuckyMoneyRepository repository;
    @Test
    public void listAll(){
        List<LuckyMoney> list = repository.findAll();
        for (LuckyMoney luckyMoney : list)
            System.out.println(luckyMoney);
    }
}

在这里插入图片描述
在这里插入图片描述
完整测试实体类


package com.neuedu.springboot_red_bag.dao;

import com.neuedu.springboot_red_bag.domain.LuckyMoney;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.math.BigDecimal;
import java.util.List;
import java.util.Optional;

@RunWith(SpringRunner.class)
@SpringBootTest
public class LuckyMoneyRepositoryTest {
    //注入Bean
    @Autowired
    private LuckyMoneyRepository repository;
    @Test
    public void listAll(){
        List<LuckyMoney> list = repository.findAll();
        for (LuckyMoney luckyMoney : list)
            System.out.println(luckyMoney);
    }

    @Test
    public void save(){
        LuckyMoney luckyMoney = new LuckyMoney();
        luckyMoney.setConsumer("李四");
        luckyMoney.setMoney(new BigDecimal(11));
        luckyMoney.setProducer("张三");
//        repository.save(luckyMoney);
        // save 正常的保存
        // saveAndFlush 是 在同一事物下提交前就保存
        repository.saveAndFlush(luckyMoney);
    }
    @Test
    public void save2(){
        LuckyMoney luckyMoney = new LuckyMoney();
        luckyMoney.setConsumer("李四");
        luckyMoney.setMoney(new BigDecimal(11));
        luckyMoney.setProducer("张三");
//        repository.save(luckyMoney);
        // save 正常的保存
        // saveAndFlush 是 在同一事物下提交前就保存
        repository.saveAndFlush(luckyMoney);
    }
    @Test
    public void update(){
        LuckyMoney luckyMoney = new LuckyMoney();
        luckyMoney.setConsumer("王五");
        luckyMoney.setMoney(new BigDecimal(21));
        luckyMoney.setProducer("赵六");
        luckyMoney.setId(2);
        repository.save(luckyMoney);
    }

    @Test
    public void getById(){
        LuckyMoney luckyMoney = repository.findOne(2);
        System.out.println(luckyMoney);
    }

    @Test
    public void delete(){
        repository.delete(3);
    }

}

编写Controller

  • @RestController注解相当于 @Controller + @ResponseBody
  • @Controller 是将此类交给Spring进行管理
  • @ResponseBody返回给客户端响应,如果是字符串原样返回, 如果是对象会返回Json串
get 请求和post请求
  • GET后退按钮/刷新无害,POST数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
  • GET书签可收藏,POST为书签不可收藏。
  • GET能被缓存,POST不能缓存 。
  • GET编码类型application/x-www-form-url,POST编码类型encodedapplication/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
  • GET历史参数保留在浏览器历史中。POST参数不会保存在浏览器历史中。
  • GET对数据长度有限制,当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。POST无限制。
  • GET只允许 ASCII 字符。POST没有限制。也允许二进制数据。
  • 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。
    ** 在发送密码或其他敏感信息时绝不要使用 GET !**
  • POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。GET的数据在 URL 中对所有人都是可见的。POST的数据不会显示在 URL 中。、

请求路由注解

@RequestMapping ()指定方法的请求路径
@GetMapping() 表示只能发送get请求
@PostMapping() 表示只能发送post请求
在这里插入图片描述
编写获取红包列表接口

package com.neuedu.springboot_red_bag.controller;

import com.neuedu.springboot_red_bag.dao.LuckyMoneyRepository;
import com.neuedu.springboot_red_bag.domain.LuckyMoney;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @ Author     :Eric Lee
 * @ Date       :Created in 14:50 2021/9/1
 * @ Description:
 * @ Modified By:
 * @ Version    : 1.0
 */
@RestController
@RequestMapping("/bag")
public class LuckMoneyController {
    @Autowired
    private LuckyMoneyRepository repository;

    @GetMapping("/list")
    public List<LuckyMoney> listAll(){
        return repository.findAll();
    }
}

在这里插入图片描述

  • 发红包
@PostMapping("/post")
  public LuckyMoney postRedBag(@RequestParam(value = "producer", required = true) String producer,
                               @RequestParam(value = "money", required = true) BigDecimal money){
      LuckyMoney luckyMoney = new LuckyMoney();
      luckyMoney.setMoney(money);
      luckyMoney.setProducer(producer);
      return repository.save(luckyMoney);
  }


在这里插入图片描述

  • 根据id进行查询
@GetMapping("/find/{id}")
  public LuckyMoney findById(@PathVariable("id") Integer id){
      return repository.findOne(id);
  }

在这里插入图片描述

  • 收红包
@PutMapping("/put/{id}")
 public LuckyMoney put(@PathVariable("id")Integer id,
                       @RequestParam(value = "consumer", required = true)String consumer){
     LuckyMoney luckyMoney = repository.findOne(id);
     if (luckyMoney!=null){
         luckyMoney.setConsumer(consumer);
         return repository.save(luckyMoney);
     }
     return null;
 }

在这里插入图片描述

@RequestParam, @PathVariable注解区别

@RequestParam 和 @PathVariable 注解是用于从request中接收请求的,两个都可以接收参数,关键点不同的是@RequestParam 是从request里面拿取值,而 @PathVariable 是从一个URI模板里面来填充

@RequestParam

http://localhost:8080/springmvc/hello/101?param1=10&param2=20
根据上面的这个URL,你可以用这样的方式来进行获取

public String getDetails(
    @RequestParam(value="param1", required=true) String param1,
        @RequestParam(value="param2", required=false) String param2){
...
}

@RequestParam 支持下面四种参数

  • defaultValue 如果本次请求没有携带这个参数,或者参数为空,那么就会启用默认值
  • name 绑定本次参数的名称,要跟URL上面的一样
  • required 这个参数是不是必须的
  • value 跟name一样的作用,是name属性的一个别名
@PathVariable

这个注解能够识别URL里面的一个模板,我们看下面的一个URL
http://localhost:8080/springmvc/hello/101?param1=10&param2=20

@RequestMapping("/hello/{id}")
    public String getDetails(@PathVariable(value="id") String id,
    @RequestParam(value="param1", required=true) String param1,
    @RequestParam(value="param2", required=false) String param2){
.......
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值