SpringBoot 入门

一、环境搭建

1. 安装 JAVA SDK

2. 安装 Maven

二、SpringBoot 基本用法

pom.xml

项目基本配置信息,包括项目名称、版本号,依赖库等配置信息,结合 maven 会自动下载项目所需要的依赖

/src/main/java/项目名/***Application 文件

是整个 SpringBoot 的入口文件,可在此文件直接右键运行项目

三、项目的运行与部署

1.直接在 IDEA 软件

​ 1) 点击窗口右上角 run 按钮

​ 2) 在项目入口文件 ***Application 中右键运行

2.在终端运行

cd /项目目录/
mvn spring-boot:run

3.直接打包项目部署

// 打包命令
mvn clean package
// 如果想要跳过单元测试, 加参数
mvn clean package -Dmaven.test.skip=true
// 项目目录下会有一个 target 目录
cd target/
// 部署 java jar 包
java -jar targe/***.jar

备注

有时候,打开一个 JAVA 项目,发现运行不了,其实是因为没有配置运行启动, 选择 Edit Configurations, 在其中点击 + 号,选择 SpringBoot, 创建一个启动项目,选择 Main class 中选择项目启动文件:***Application 其实会有路径提示的。修改Name 保存即可

edit_configurations

四、SpringBoot 配置

1.application.properties

通常 SpringBoot 配置文件写在 /src/main/resources/application.properties 文件中

# 修改web服务端口
server.port=8081
# 为项目增加入口子路径
server.servlet.context-path=/luckymoney

application.yml

这种配置文件,更加简洁直观, yaml 的格式要求,key: [空格]value

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

3.常量的配置与使用

  1. 在 application.yml 文件中 填写常量
minMoney: 1
  1. 在 Conttroller 文件中引用
@RestController
public class HelloController {
    @Value("${minMoney}")
    private BigDecimal minMoney;
}

3)在配置文件 application 中引用配置常量

minMoney: 1
description: "最少要${minMoney}元"

4. 对象配置(类似类)

配置文件

limit:
  minMoney: 1
  maxMoney: 100
  description: "最少要${limit.minMoney}元, 最大要发${limit.maxMoney}元"

构造对应配置文件的类

// 注解很重要
@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;
    }
}

在 controller 中引用

@RestController
public class HelloController {

    @Autowired
    private LimitConfig limitConfig;

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

5.配置运行环境

在开发 SpringBoot 项目中往往需要,开发环境一份配置,生产环境一份配置,这就需要做好配置切换工作,需要生成三份配置信息表: application.yml 、 application-dev.yml 和 application-prod.yml

application.yml 配置文件入口: 切换配置文件

spring:
  profiles:
    active: prod
#    active: dev

application-dev.yml 开发环境配置信息

server:
  port: 8081
  servlet:
    context-path: /luckymoney
#  yaml 格式需要增加空格
limit:
  minMoney: 0.01
  maxMoney: 9999
  description: "最少要${limit.minMoney}元, 最大要发${limit.maxMoney}元"

application-prod.yml 生产环境配置信息

server:
  port: 8081
  servlet:
    context-path: /luckymoney
#  yaml 格式需要增加空格
limit:
  minMoney: 1
  maxMoney: 9999
  description: "最少要${limit.minMoney}元, 最大要发${limit.maxMoney}元"

值得注意的是,平时开发我们通常都是用 dev 配置环境,如果需要部署时候,其实可以直接打 jar 包,然后通过运行 jar 包的命令中+相关的配置即可部署含有生成环境配置的项目了。

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

6、调整 IDEA 运行时输出的日志内容

# 修改日志格式
logging:
  pattern:
    console: "[%thread] %-5level %logger{36} - %m%n"

输出的内容将不再还有日期事件

[main] INFO  com.imooc.mall.MallApplicationTests - No active profile set, falling back to default profiles: default

7、Mybatis 的一些配置

# Mybatis 的一些配置
mybatis:
  configuration:
    map-underscore-to-camel-case: true # 实现字段支持驼峰
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 控制台输入 SQL 语句,未来要写入数据库中
  mapper-locations: classpath:mappers/*.xml # 指定 Mybatis xml 文件路径

五、SpringBoot Controller 的使用

1. 常见注解

@Controller 处理 http 请求
@RestController Spring4之后加入的注解,「原来返回 json,需要 @ResponseBody 配合 @Controller」
@RequestMapping 配置 Url 映射
@GetMapping Get 请求
@PostMapping Post 请求
@PathVariable 获取 URL 中的数据
@RequestParam 获取请求参数的值

@Controller

注解在 Controller 上,默认 Controller 的方法返回 模板 html,这里需要增加 模板引擎 依赖

 <!-- 模板引擎 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
@Controller
public class HelloController {
    // 配置 html 模板返回内容:大多数都是前后端分离的项目
    @GetMapping("/hello2")
    public String say2() {
      	// index 对应 resource/templates/index.hmtl 中的内容
        return "index";
    }
}
// 目前主流的项目部署,都是前后端分离,JAVA 只做后端借口,这种直接用 JAVA 代码渲染 html 的方式越来越少了。

如果 @Controller 注解的 Controller 需要返回字符串,则需要在类前面或者方法前面增加 @ResponseBody 注解。效果等同于 @RestController;

@RestController = @Controller + @ResponseBody

@GetMapping

控制方法访问路径

// Get 方法请求,/hello 返回结果
@GetMapping("/hello")
public String say() {
  return "说明:" + limitConfig.getDescription();
}
// Get 方法请求 /hello 和 /hi 效果一致
@GetMapping({"/hello", "/hi"})
public String say() {
  return "说明:" + limitConfig.getDescription();
}

@PostMapping

处理 Post 请求的注解

@RequestMapping("/hello")

这个注解用来规划路径,如果某个 Controller 需要统一一个入口路径,则可以加入此注解

// 如果想请求 HelloController 中的方法,则路径需要统一加上 /hello
@RestController
@RequestMapping("/hello")
public class HelloController {...}

如果使用 @RequestMapping 注解方法,则此方法将不论 get 还是 post 都是可以请求的,不推荐。

@PathVariable 和 RequestParam

可以在请求 URL 中获取到参数值,

// 请求 URL 形式: /say/100 
// 注意:@GetMapping 中也有相关的对应
@GetMapping("/say/{id}")
public String say(@PathVariable("id") Integer id) {
  return "ID:" + id;
}
// 请求 URL 形式:/say?id=100
@GetMapping("/say")
public String say(@RequestParam("id") Integer id) {
  return "ID:" + id;
}
// 默认值请求
@GetMapping("/say")
public  String say(@RequestParam(value = "id", required = false, defaultValue = "0") Integer id) {
  return "ID:" + id;
}
// post 请求:不论是将参数放在 URL 上还是 post body 中,都可以被 @RequestParam 注解获取到
@PostMapping("/say")
public  String say(@RequestParam(value = "id", required = false, defaultValue = "0") Integer id) {
  return "ID:" + id;
}

六、 SpringBoot 数据库操作——Spring-Data-Jpa

JPA(JAVA Persistence API)

定义一些列对象持久化的标准,目前实现这一规范的产品有:Hibernate, TopLink 等

Restful API 规范

请求类型 请求路径 功能
GET /luckymoneys 获取红包列表
POST /luckymoneys 创建一个红包
GET /luckymoneys/id 通过 id 查询单个红包
PUT /luckymoneys/id 通过 id 更新红包

使用 Spring-Data-Jpa 需要的依赖

<!-- Spring-Data-Jpa -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- MySQL 链接 -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
</dependency>

在配置信息中增加数据库相关配置

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:8889/luckymoney
    username: root
    password: root
  jpa:
    hibernate:
      ddl-auto: update # create 则每次启动都会删表重新创建
    show-sql: true

构建实体类

实体类对应着表结构,可以通过下面得配置来让 构建得实体类生成 表结构,

要注意实体类注解 和 主键注解

jpa:
    hibernate:
      ddl-auto: create 
@Entity
public class Luckymoney {

    // 主键
    @Id
    @GeneratedValue
    private Integer id;
    // 金额
    private BigDecimal money;
    // 发送方
    private String producer;
    // 接收方
    private String consumer;
    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;
    }
}

构建 Repository 接口

构建这个接口之后,对于实体类得一些 增删改查操作都可以被 Spring-Data-Jpa 实现了

package com.imooc.luckymoney;

import org.springframework.data.jpa.repository.JpaRepository;
// 这里传入 实体类 和 主键的类型
public interface LuckymoneyRepository extends JpaRepository<Luckymoney, Integer> {

}

具体实现

@RestController
public class LuckymoneyController {

    @Autowired
    private  LuckymoneyRepository luckymoneyRepository;
  
    @GetMapping("/luckymoneys")
    public List<Luckymoney> list() {
        return luckymoneyRepository.findAll();
    }

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

    /**
     * 通过 id 查询红包
     */
    @GetMapping("/luckymoneys/{id}")
    public  Luckymoney findById(@PathVariable("id") Integer id) {
        return luckymoneyRepository.findById(id).orElse(null);
    }

    /**
     * 更新红包
     */
    @PutMapping("/luckymoneys/{id}")
    public  Luckymoney update(@PathVariable("id") Integer id, @RequestParam("consumer") String consumer) {
        Optional<Luckymoney> optionalLuckymoney = luckymoneyRepository.findById(id);
        if(!optionalLuckymoney.isPresent()) {
            return null;
        }
        // 获取 id 对应得数据
        Luckymoney luckymoney = optionalLuckymoney.get();
        luckymoney.setConsumer(consumer);
        return luckymoneyRepository.save(luckymoney);
    }
}

七、事务

数据库事务,是指作为单个逻辑工作单元执行的一系列操作,要么完全执行,要么完全不执行。有错误就会回滚到未操作的状态

创建 Service 类

Service 层是用来处理复杂的业务逻辑,通过分层的概念来说,减缓 Controller 的操作内容,让专属层做专属的事情,才是正确的选择。

@Service
public class LuckymoneyService {
    @Autowired
    private LuckymoneyRepository luckymoneyRepository;
    /**
     * 事务 指的是数据库事务
     * 但是需要 数据库支持事务操作,Mysql的数据库引擎中 InnoDB 支持;MyISAM 这个是不支持的
     */
    @Transactional
    public void creatTwo() {
        Luckymoney luckymoney1 = new Luckymoney();
        luckymoney1.setProducer("刘伟");
        luckymoney1.setMoney(new BigDecimal(520));
        luckymoneyRepository.save(luckymoney1);

        Luckymoney luckymoney2 = new Luckymoney();
        luckymoney2.setProducer("刘伟");
        luckymoney2.setMoney(new BigDecimal(1314));
        luckymoneyRepository.save(luckymoney2);
    }
}

上面代码,是在 Service 类中增加了发两个红包的功能,通过 @Transactional 注解实现了,如果有一个红包发送失败,两个红包都不会被发送。

IDEA 使用技巧

1.快捷键

Ctrl + Enter: 快捷为类生成 构造函数,getter setter 方法

Commond + p:可以查看方法参数描述

Option + Enter: 快速创建接口定义的方法

2. 快速开发的三个配置

  • Maven 依赖自动刷新
  • 自动导入包
  • Lombok 为实体类自动构架 getter setter 等方法(看个人需要)
Last Updated: 4/19/2020, 10:36:29 PM