SpringBoot

397 阅读4分钟

简介

开始

环境

IDE下载

推荐使用 Ultimate 学生邮箱注册终身免费

新建项目

如果你是社区版本是找不到spring Initializr的,可以通过 tstart.spring.io 来创建项目,或者搜索安装插件后会出现spring Initializr

maven 仓库镜像地址使用阿里云(如果慢的话)

删除不需要的文件

目录结构

启动服务

有三种方式

方法一 : IDE启动

方法二: 命令行启动

切换到项目目录下 ,命令行maven命令启动服务

方法三 : 先打包部署在服务器上后的启动

  1. 如何打包

  1. jar包启动
 java -jar target/luckymony-0.0.1-SNAPSHOT.jar

写个响应

如图目录结构创建一个HelloController.java

重新启动服务后

localhost:8080/hello
默认8080

项目配置

方式一:修改application.properties文件

修改端口

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

方式二:修改application.yml文件(推荐)

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

推荐使用第二种yml,删除第一个properties

配置生效,重启服务后,访问之

代码使用配置文件属性

单个配置写法

  1. 编写配置文件

minMoney: 10
desc: 最少发${minMoney}
  1. 引用配置文件的值

package com.example.luckymony.controller;


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;

@RestController
public class HelloController {

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

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

访问结果

配置对象写法

  1. yml文件
limit:
  minMoney: 10
  maxMoney: 100
  desc: 最少发${limit.minMoney}元,最多发${limit.maxMoney}元,哈哈哈
  1. 新建一个java类,LimitConfig.java

package com.example.luckymony.controller;

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

import java.math.BigDecimal;

@Component
@ConfigurationProperties(prefix = "limit")
public class LimitConfig {
    private BigDecimal minMoney;
    private BigDecimal maxMoney;

    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 getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    private String desc;


}

  1. 使用配置

运行

两套配置文件

  1. 复制yml文件,后缀名-dev

2. 复制yml文件,后缀名-prod

  1. 原来的yml文件,修改为下图
    运行

配置两套文件,不需要手动切换不同配置文件,命令行启动设置配置

dev

java -jar -Dspring.profiles.active=dev target/luckymony-0.0.1-SNAPSHOT.jar

prdo

java -jar -Dspring.profiles.active=prod target/luckymony-0.0.1-SNAPSHOT.jar

配置小结

Controller使用

@Controller 使用模板

  1. 引入依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
  1. 建立模板

  1. 使用模板

访问

另外:想使用@Controller返回数据(不是h5页面),需要加上 @ResponseBody,也就是说@Controller+@ResponseBody=@RestController(下图用在类上)

下图用在方法上

同个地址指向同一个方法

get请求+ 我们想 hello/say 如何配置

post请求

同时支持POST GET

三种请求注解

获取请求参数

/连接符

?连接符

没有默认值 id必须传递

有默认值 id可以不传递

Post 传参

数据库

依赖

不加版本号

配置数据库

spring:
  profiles:
    active: prod
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&allowMultiQueries=true&useUnicode=true&useSSL=true&serverTimezone=GMT%2B8
    username: user
    password: user
  jpa:
    database: MYSQL
    show-sql: true
    hibernate:
      ddl-auto: update
      naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL5Dialect

编写javabean对应数据库的一个表

package com.example.luckymony.controller;


import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.math.BigDecimal;
@Entity
public class Luckmoney {

    @Id
    @GeneratedValue
    private Integer id;
    private BigDecimal money;
    private String producer;
    private String consumer;


    public Luckmoney() {
    }

    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;
    }
}

ok,运行一下,会发现数据库有这个Luckymoney表了

MAC数据库可视化工具

接口实现 LuckymoneyController

1.LuckymoneyRepository

package com.example.luckymony.dao;

import com.example.luckymony.bean.Luckmoney;
import org.springframework.data.jpa.repository.JpaRepository;

public interface LuckymoneyRepository  extends JpaRepository<Luckmoney,Integer> {//实体类+id类型


}

2. LuckymoneyController

package com.example.luckymony.controller;


import com.example.luckymony.bean.Luckmoney;
import com.example.luckymony.dao.LuckymoneyRepository;
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;

@RestController
public class LuckymoneyController {


    @Autowired
    private LuckymoneyRepository repository;


    /**
     * 获取红包列表
     */
    @GetMapping("/luckymoneys")

    public List<Luckmoney> list() {

        return repository.findAll();

    }

}

ok 看看

数据库随便填写几条数据

3. 创建红包

 /**®
     * 创建红包
     */

    @GetMapping("/create")

    public Luckmoney create(@RequestParam("producer") String producer,
                           @RequestParam("money") BigDecimal money) {
        Luckmoney luckmoney = new Luckmoney();
        luckmoney.setProducer(producer);
        luckmoney.setMoney(money);
        return repository.save(luckmoney);

    }

如果报错,把之前手动在数据库添加的数据删掉,因为这样会与系统维护的自增长id有冲突

通过id查询红包

 /**
     * 通过id查询红包
     */

    @GetMapping("/getbyid")
    public Luckmoney getById(@RequestParam("id") Integer id) {
        return repository.findById(id).orElse(null);
    }

注意 orElse(null)

更新数据

post方法

PathVariable在url里用/链接

RequestParam在参数里用?链接

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

        Luckmoney luckmoney = new Luckmoney();
        luckmoney.setId(id);
        luckmoney.setConsumer(consumer);
        return repository.save(luckmoney);
    }

上面是错的,因为repository.save 执行的是下面的SQL语句,没指定producer,就变成了null

update luckmoney set consumer=?, money=?, producer=? where id=?

修改

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

//        先查询数据,在去更新数据
        Optional<Luckmoney> optional = repository.findById(id);
        if (optional.isPresent()){
            Luckmoney luckmoney = optional.get();
            luckmoney.setConsumer(consumer);
            repository.save(luckmoney);
        }
        return null;
    }

正常了

事务

1. 数据库要先支持事物

2. 代码 Service

同事发出去两个红包,如果有错就都不发,(数据库设置了红包字符长度必须小于5,所以1314.00数据库不让写入,520.00是可以写入的,我们的目的是因为1314.00没写入,520.00也不能写入)

package com.example.luckymony.service;

import com.example.luckymony.bean.Luckmoney;
import com.example.luckymony.dao.LuckymoneyRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;

@Service
public class LuckmoneyService {
    @Autowired

    private LuckymoneyRepository repository;

    @Transactional
    public void createTwo() {
        Luckmoney luckmoney1 = new Luckmoney();
        luckmoney1.setProducer("张无忌");
        luckmoney1.setMoney(new BigDecimal("520"));
        repository.save(luckmoney1);

        Luckmoney luckmoney2 = new Luckmoney();
        luckmoney2.setProducer("赵敏");
        luckmoney2.setMoney(new BigDecimal("1314"));
        repository.save(luckmoney2);
    }
}

代码 Controller 使用Service逻辑

结果

红包都没发出去

总结