SpringBoot最新版 入门(发红包)

springMVC与SpringBoot的关系就是:
springboot是springmvc的升级版!

一、SpringBoot的特点

  1. 化繁为简,简化配置
  2. 备受关注,是下一代框架
  3. 微服务的入门级微框架

注意:
学习Springboot需要注意以下几点:

  1. 具备必要的前置知识:
    1. 利用maven构建项目
    2. Spring注解
    3. RESTful API
  2. 不需要去学习JavaMVC
  3. Java、Maven等版本保持一致

二、第一个SpringBoot程序

在这里插入图片描述
application.properties

server.port=8081
server.servlet.context-path=/lucky

application.yml

server:
  port: 8081
  servlet:
    context-path: /lucky

以上两个都是配置文件,但是一般用yml格式的,比较简洁
注意:
yml文件的属性与值之间必须有一个空格,要不然会报错!!

HelloController

package com.yunli.lucky;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Elias
 */
@RestController
public class HelloController {

    @GetMapping("/hello")
    public String say(){
        return "昀离君好帅!!";
    }
}

在浏览器输入http://localhost:8081/lucky/hello回车,然后就可以跳转到页面
在这里插入图片描述

三、自定义属性配置

设置最小金额:
application.yml中加上

minMoney: 1

HelloController.java

package com.yunli.lucky;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;

/**
 * @author 小离
 */
@RestController
public class HelloController {

    @Value("${minMoney}")
    private BigDecimal minMoney;

    @GetMapping("/hello")
    public String say(){
        return "minMoney" + minMoney;
    }
}

这样配置就导入进来了!
在这里插入图片描述
对最少金额配置做一个说明!
application.yml

description: 最少要发1元

HelloController.java打印输出

package com.yunli.lucky;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;

/**
 * @author Elias
 */
@RestController
public class HelloController {

    @Value("${minMoney}")
    private BigDecimal minMoney;

    @Value("${description}")
    private  String description;

    @GetMapping("/hello")
    public String say(){
        return "minMoney" + minMoney + ", 说明:" + description;
    }
}

结果:
在这里插入图片描述
配置也可以这样写:

minMoney: 1
description: 最少要发${minMoney}

为了简化书写,一般使用以下方式配置及调用!
在这里插入图片描述
properties.yml

limit:
  minMoney: 1
  maxMoney: 9999
  description: 最少要发${limit.minMoney}元,最多${limit.maxMoney}

LimitConfig.java

package com.yunli.lucky;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;

/**
 * @Author 小离
 */
@Component
@ConfigurationProperties(prefix = "limit")
public class LimitConfig {
    private BigDecimal minMoney;

    private BigDecimal maxMoney;

    private  String description;

    public BigDecimal getMinMoney() {
        return minMoney;
    }

    public void setMinMoney(BigDecimal minMoney) {
        this.minMoney = minMoney;
    }

    public BigDecimal getMaxMoney() {
        return maxMoney;
    }

    public void setMaxMoney(BigDecimal maxMoney) {
        this.maxMoney = maxMoney;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

HelloController.java

package com.yunli.lucky;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Elias
 */
@RestController
public class HelloController {

    @Autowired
    private LimitConfig limitConfig;

    @GetMapping("/hello")
    public String say(){
        return "说明:" + limitConfig.getDescription();
    }
}

结果:
在这里插入图片描述
为了配合实际运用,我们划分为两个开发环境,一个测试,一个应用,所以分为两个配置文件
在这里插入图片描述
application-dev.yml

server:
  port: 8081
  servlet:
    context-path: /lucky

limit:
  minMoney: 0.01
  maxMoney: 9999
  description: 最少要发${limit.minMoney}元,最多${limit.maxMoney}

application.yml

spring:
  profiles:
    active: dev

运行,结果:
在这里插入图片描述
application.yml里的值改为produ之后,结果为:
在这里插入图片描述
在这里插入图片描述

四、Controller的使用

在这里插入图片描述
在这里插入图片描述
我们把它改成@Controller,运行结果如下:
在这里插入图片描述
为什么不能返回了呢?因为没有加载和配置模板!!
首先在pom.xml中加入一条配置:

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

在templates下添加一个index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h1>欢迎来到小离的博客空间!!!</h1>

</body>
</html>

然后Controller层改一下:

package com.yunli.lucky;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Elias
 */
@Controller
public class HelloController {

    @Autowired
    private LimitConfig limitConfig;

    @GetMapping("/hello")
    public String say(){
//        return "说明:" + limitConfig.getDescription();
        return "index";
    }
}

在这里插入图片描述

结果:
在这里插入图片描述
这种模板用的比较少,现在大多数用的都是前后端分离的架构,所以只用了解一下就好!!!

另一种方法:
加上一个@ResponseBody注解:

package com.yunli.lucky;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Elias
 */
@Controller
@ResponseBody
public class HelloController {

    @Autowired
    private LimitConfig limitConfig;

    @GetMapping("/hello")
    public String say(){
        return "说明:" + limitConfig.getDescription();
//        return "index";
    }
}

结果:
在这里插入图片描述
所以 @Controller + @ResponseBody = @RestController

当然,@ResponseBody也可以放在方法上:
在这里插入图片描述
使用时机是,当有两个不同方法在同一个控制类时使用。

我们还可以用不同的地址名称访问同一个页面!
在这里插入图片描述
这里的地址名称变成数组的格式就行!
结果:
在这里插入图片描述
在这里插入图片描述
具体的访问路径方法:
在这里插入图片描述
这样就得输入到say方法才能访问到say方法!
在这里插入图片描述
在这里插入图片描述
请求方式有两种,@GetMapping@PostMapping
@RequestMapping 直接包含他们两种方法,所以一般写的是 @RequestMapping
在这里插入图片描述

在这里插入图片描述
在浏览器传值:
比如:直接在路径后面输入id的值,然后显示id的值
在这里插入图片描述
实现代码:
helloController.java

package com.yunli.lucky;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * @author Elias
 */
@RestController
@RequestMapping("/hello")
public class HelloController {

    @Autowired
    private LimitConfig limitConfig;

    @RequestMapping("/say/{id}")
    public String say(@PathVariable("id") Integer id){
//        return "说明:" + limitConfig.getDescription();
        return "id:" + id;
    }
}

如果换成这种方式输入:
localhost:8081/lucky/hello/say/?id=1000
实现代码:
helloController.java

package com.yunli.lucky;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * @author Elias
 */
@RestController
@RequestMapping("/hello")
public class HelloController {

    @Autowired
    private LimitConfig limitConfig;

    @RequestMapping("/say")
    public String say(@RequestParam("id") Integer id){
//        return "说明:" + limitConfig.getDescription();
        return "id:" + id;
    }
}

结果:
在这里插入图片描述
这样的话还是有一个问题,如果不传值,它会报错:
在这里插入图片描述
解决方法:
在这里插入图片描述
添加三个属性值:
value:值
required:需要,默认值是true,把它改成false
defaultValue:默认值,在我们不传id值时的id默认值

结果:
在这里插入图片描述
在这里插入图片描述

五、spring-data-jpa

在这里插入图片描述
使用链接到数据库!!

先了解一下JPA

JPA(Java Persistence API)定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate,TopLink等。
是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;

API
用来操作实体对象,执行CRUD操作,框架在后台替代我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。

查询语言
这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

简单来说就是不用写一行SQL语句就能对数据库进行操作!!!

在这里插入图片描述
接下来,我们会实现以上接口!

首先,导入两个包:

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

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

然后
在这里插入图片描述
application-dev.yml配置文件变成如下配置:

server:
  port: 8081
  servlet:
    context-path: /lucky

limit:
  minMoney: 0.01
  maxMoney: 9999
  description: 最少要发${limit.minMoney}元,最多${limit.maxMoney}spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/luckymoney
    username: root
    password: yxd1514
  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true

新建一个Luckymoney.java类,这个java文件可以直接写数据到数据库,直接代替SQL语句。

package com.yunli.lucky;

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

@Entity
public class Luckymoney {

    /**
     * 红包id
     */
    @Id
    @GeneratedValue             //自增的注解
    private Integer id;

    /**
     * 红包金额
     */
    private BigDecimal money;

    /**
     * 发送方
     */
    private String producer;

    /**
     * 接收方
     */
    private String consumer;

    public Luckymoney() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public BigDecimal getMoney() {
        return money;
    }

    public void setMoney(BigDecimal money) {
        this.money = money;
    }

    public String getProducer() {
        return producer;
    }

    public void setProducer(String producer) {
        this.producer = producer;
    }

    public String getConsumer() {
        return consumer;
    }

    public void setConsumer(String consumer) {
        this.consumer = consumer;
    }
}

运行,控制台会出现如下提示信息:

Hibernate: drop table if exists hibernate_sequence
Hibernate: drop table if exists luckymoney
Hibernate: create table hibernate_sequence (next_val bigint) engine=MyISAM
Hibernate: insert into hibernate_sequence values ( 1 )
Hibernate: create table luckymoney (id integer not null, consumer varchar(255), money decimal(19,2), producer varchar(255), primary key (id)) engine=MyISAM

就是说如果存在表,那么会将原来的表删除,重新创建新的表,如果不存在就直接创建表
在这里插入图片描述
打开数据库,可以看到新创建的表:
在这里插入图片描述
如果添加数据到表里,再次运行还是会删除原表,改变这种状态我们可以改变application-dev.yml中的一个参数
在这里插入图片描述
这样就不会新建表了!!!

接下来写查询所有红包的方法:
在这里插入图片描述
创建两个类:
LuckymoneyController.java

package com.yunli.lucky;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author 小离
 */
@RestController
public class LuckymoneyController {

    @Autowired
    private LuckymoneyRepository repository;

    /**
     * 获取红包列表
     */
    @GetMapping("/luckymoneys")
    public List<Luckymoney> list(){
        return repository.findAll();
    }

}

LuckymoneyRepository.java这事一个接口

package com.yunli.lucky;

import org.springframework.data.jpa.repository.JpaRepository;

/**
 * @author 小离
 */
public interface LuckymoneyRepository extends JpaRepository<Luckymoney, Integer> {
}

运行!!!
在浏览器输入http://localhost:8081/lucky/luckymoneys
在这里插入图片描述
在数据库中再保存一数据!
在这里插入图片描述
刷新网页!
在这里插入图片描述
接下来写发红包的功能!!
LuckymoneyController.java中添加如下代码!!

    /**
     * 创建红包(发红包)
     */
    @PostMapping("/luckymoneys1")
    public Luckymoney create(@RequestParam("producer") String producer,
                             @RequestParam("money")BigDecimal money){
        Luckymoney luckymoney = new Luckymoney();
        luckymoney.setProducer(producer);
        luckymoney.setMoney(money);
        return repository.save(luckymoney);
    }

打开Postman!!

postman是一款强大网页调试工具的客户端,postman为用户提供强大的 Web API & HTTP 请求调试功能。postman能够发送任何类型的HTTP 请求 (GET, HEAD, POST, PUT…),附带任何数量的参数+ headers,是一款非常实用的调试工具。

需要无绑定插件的小伙伴可以微信搜索或者扫描下方二维码关注【昀离君】公众号,回复Postman获取下载地址

在这里插入图片描述

在这里插入图片描述

在Postman中输入http://localhost:8081/lucky/luckymoneys1
在下方表格输入数据
在这里插入图片描述
如果直接运行会报一个500错误
在这里插入图片描述

原因是hibernate_sequence没有主键,id=1已经存在了,所以要运行成功得先把之前添加的数据删掉。

再运行。。。
在这里插入图片描述
运行成功!!

通过id查找红包:
LuckymoneyController.java加入以下代码!!

    /**
     * 通过id查询红包
     */
    @GetMapping("/luckymoneys/{id}")
    public Luckymoney findById(@PathVariable("id") Integer id){
        /**
         * return返回的是Optional对象,我们要找的是Luckymoney对象,所以这里查到了就返回Luckymoney对象,差不到返回null
         */
        return repository.findById(id).orElse(null);
    }

重新运行!!
在Postman输入http://localhost:8081/lucky/luckymoneys/2
把请求方式改为Get
结果:
在这里插入图片描述
领红包:
LuckymoneyController.java加入如下内容

    /**
     * 更新红包(领红包)
     */
    @PutMapping("/luckymoneys/{id}")
    public Luckymoney update(@PathVariable("id") Integer id,
                             @RequestParam("consumer") String consumer){

        //首先从数据库查询数据,不查询可能数据会导致producer和money为null
        Optional<Luckymoney> optional = this.repository.findById(id);
        //判断optional是否为null
        if (optional.isPresent()){
            //如果optional不是为null,则设置红包接收对象
            //如果数据库有内容,则直接获取数据库内容
            Luckymoney luckymoney = optional.get();
            luckymoney.setConsumer(consumer);
            return this.repository.save(luckymoney);
        }
        return null;
    }
}

数据库内容:
在这里插入图片描述

浏览器输入http://localhost:8081/lucky/luckymoneys/2?consumer=小雅
在这里插入图片描述
红包领取完成!!!

六、事务管理

数据库事务,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

现在写入两条数据发送红包,同时发,要么成功,要么失败!
在这里插入图片描述
首先,写一个service层
两个红包数据

package com.yunli.lucky;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;

/**
 * @author 小离
 */
@Service
public class LuckymoneyService {

    @Autowired
    private LuckymoneyRepository repository;

    public void createTwo(){
        Luckymoney luckymoney1 = new Luckymoney();
        luckymoney1.setProducer("小离");
        luckymoney1.setMoney(new BigDecimal("520"));
        repository.save(luckymoney1);

        Luckymoney luckymoney2 = new Luckymoney();
        luckymoney2.setProducer("小离");
        luckymoney2.setMoney(new BigDecimal("1314"));
        repository.save(luckymoney2);
    }
}

然后写Controller层:

package com.yunli.lucky;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

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

/**
 * @author 小离
 */
@RestController
public class LuckymoneyController {

    /**
     * @Autowired 自动装配到数据库
     */
    @Autowired
    private LuckymoneyRepository repository;

    /**
     * @Autowired 自动装配到Service
     */
    @Autowired
    private LuckymoneyService service;

    @PostMapping("/luckymoneys/two")
    public void creatTwo(){
        service.createTwo();
    }

}

执行!
在这里插入图片描述
数据库多了两条数据!
在这里插入图片描述
但是如果把money的长度限制为5的话,1314.00就不能发出去了,控制台会报错!!

所以要在createTwo方法上面加上@Transactional事务注解
在这里插入图片描述
运行!
在这里插入图片描述
发现控制台报错,但是520还是进去了!

原因是Mysql默认的是MyISAM引擎,而刚好MyISAM引擎不支持事务

这时,吧MyISAM引擎换成InnoDB引擎
在这里插入图片描述
运行
在这里插入图片描述
控制台报错
数据库也没有数据!

完美!!

OK,Springboot入门暂时到这里,剩下的我们待续,,,

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值