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 保存即可
四、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.常量的配置与使用
- 在 application.yml 文件中 填写常量
minMoney: 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 等方法(看个人需要)