SpringBoot最新入门总结IDEA版
springMVC与SpringBoot的关系就是:
springboot是springmvc的升级版!
一、SpringBoot的特点
- 化繁为简,简化配置
- 备受关注,是下一代框架
- 微服务的入门级微框架
注意:
学习Springboot需要注意以下几点:
- 具备必要的前置知识:
- 利用maven构建项目
- Spring注解
- RESTful API
- 不需要去学习JavaMVC
- 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入门暂时到这里,剩下的我们待续,,,