avatar

目录
springboot快速入门

SpringBoot介绍

  • SpringBoot特性

    • 创建独立的Spring应用程序
    • 嵌入的Tomcat,无需部署war文件
    • 简化maven配置
    • 自动配置Spring
    • 提供生产就绪型功能,如指标、健康、检查和外部配置
    • 开箱即用没有代码生成,也无需配置XML文件
  • 开发准备

    • 环境Windows10 - JDK1.8
    • 开发工具IDEA
    • 项目管理工具maven(3.6.0)
  • 开发准备

    • 环境JDK1.8
    • 开发工具IDEA
    • 项目管理工具maven(3.6.0)

HelloWorld创建

  1. 通过 file –> new –> project 打开new project窗口
  2. 创建 Spring Initializr,next,next,选择 web –> web组件,完成项目创建
  3. 等待 项目从 maven 库更新
  4. 新建 Controller 类,写入如下代码
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.jpaexample;

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

/**
* Created by admin
* HelloWorld创建
*/
@RestController
public class Controller {
@GetMapping("/hello")
public String test(){
return "hello world";
}
}
  1. 启动 主程序

出现形如下面图片则启动成功

访问 http://127.0.0.1:8080/hello

  1. 步骤总结
  • a. 新建Controller
  • b. 编写springboot启动类(IDEA)自动创建
  • c. 访问

说明: 下面两种写法等价

java
1
@RestController
java
1
2
@Controller
@ResponseBody

启动springboot项目

启动springboot项目的方式

  1. 直接在IDEA中启动
  2. 在cmd中输入如下命令启动
    bash
    1
    mvn spring-boot:run
  3. 在cmd中输入如下命令启动
    • win下运行方法(阻塞)
      bash
      1
      2
      3
      mvn install
      cd target
      java -jar package-name.jar
    • linux下dev/test运行方法(阻塞)
      bash
      1
      java -jar package-name.jar
    • linux下prod(生产环境)运行方法
      bash
      1
      nohup java -jar package-name.jar &

RESTful API规范

方法 路由 说明
GET /girls 获取列表
POST /girls 创建女生
GET /girls/{id} 通过id查询
GET /girls/age/{age} 通过年龄查询
PUT /girls/{id} 通过id更新
DELETE /girls/{id} 通过id删除

spring-boot-starter-data-jpa

  1. 添加依赖(这里用MySQL数据库演示)、查看pom.xml版本
xml
pom.xml
1
2
3
4
5
6
7
8
9
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
  • 对于pom.xml,设置其版本,我的版本1.5.7
xml
pom.xml
1
<version>1.5.7.RELEASE</version>
  • (不超过2.0即可,2.0以后版本jpa语法略有不同)
  1. 配置 application.properties / application.yml
  • application.properties
properties
application.properties
1
2
3
4
5
6
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/studyjpa?charset=utf8mb4&serverTimezone=PRC
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
  • application.yml(建议使用YML,比较简洁)
yml
application.yml
1
2
3
4
5
6
7
8
9
10
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/studyjpa?charset=utf8mb4&serverTimezone=PRC
username: root
password: root
jpa:
hibernate:
ddl-auto: update
show-sql: true
  1. 创建 Girl 类,映射到MySQL数据库的实体
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.jpaexample;

import javax.persistence.*;

/**
* Created by admin
*/

@Entity
@Table(name = "Girl")
public class Girl {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

private String cupSize;

private Integer age;

public Integer getId() {
return id;
}

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

public String getCupSize() {
return cupSize;
}

public void setCupSize(String cupSize) {
this.cupSize = cupSize;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

}
  • 说明:
    • javax.persistence.*:必须引入的包
    • @Entity:表示该类实体与MySQL数据表对应
    • @Table(name = "Girl"):指定表名,不指定则使用类名作为表名
    • @GeneratedValue@GeneratedValue(strategy = GenerationType.IDENTITY): 该类型(通常指Integer)为自增型
  1. 启动项目,在数据库中会新建出一个表,则运行成功

JPA对数据库增删改查

创建接口

新建 GirlRespository 类 继承 JpaRepository

java
1
2
3
4
5
6
7
8
9
10
11
12
package com.jpaexample;

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

import java.util.List;

/**
* Created by admin
*/
public interface GirlRespository extends JpaRepository{

}

新建 GirlController类 引入 GirlRespository 实体

java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.jpaexample;

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

import java.util.List;

/**
* Created by admin
*/
@RestController
public class GirlController {

@Autowired
private GirlRespository girlRespository;

}

符合 RESTful API规范 的增删改查(GirlController类)

获取列表

  • GET
  • 127.0.0.1:8080/girls
  • return List
java
1
2
3
4
5
6
7
8
/**
* 查询所有列表
* @return
*/
@GetMapping(value = "/girls")
public List<Girl> girlList(){
return girlRespository.findAll();
}

新增一条记录

  • POST
  • 127.0.0.1:8080/girls
  • return Girl
java
1
2
3
4
5
6
7
8
9
10
/**
* 新增一个女生
*/
@PostMapping(value = "/girls")
public Girl girlAdd(@RequestParam("cupSize") String cupSize,@RequestParam("age") Integer age){
Girl girl = new Girl();
girl.setCupSize(cupSize);
girl.setAge(age);
return girlRespository.save(girl);
}

通过 id 查询一条记录

  • GET
  • 127.0.0.1:8080/girls/{id}
  • return Girl
java
1
2
3
4
5
6
7
/**
* 通过 id查询一个女生
*/
@GetMapping(value = "/girls/{id}")
public Girl girlFindOne(@PathVariable("id") Integer id){
return girlRespository.findOne(id);
}

通过 id 更新一条记录

  • PUT
  • 127.0.0.1:8080/girls/{id}
  • return Girl
java
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 更新
*/
@PutMapping(value = "/girls/{id}")
public Girl girlUpdate(@PathVariable("id") Integer id,
@RequestParam("cupSize") String cupSize,
@RequestParam("age") Integer age){
Girl girl = new Girl();
girl.setId(id);
girl.setCupSize(cupSize);
girl.setAge(age);
return girlRespository.save(girl);
}

通过 id 删除一条记录

  • DELETE
  • 127.0.0.1:8080/girls/{id}
  • no return
java
1
2
3
4
5
6
7
8
9
/**
* 删除
*/
@DeleteMapping(value = "/girls/{id}")
public void girlDelete(@PathVariable("id") Integer id){
Girl girl = new Girl();
girl.setId(id);
girlRespository.delete(id);
}

通过指定字段(age)查询列表

  • GET
  • 127.0.0.1:8080/girls/age/{age}
  • return List

在 GirlRespository 类中增加如下

java
1
2
// 通过年龄查询
List findByAge(Integer age);

在 GirlController 中编写如下

java
1
2
3
4
5
6
7
/**
* 通过年龄查询
*/
@GetMapping(value = "/girls/age/{age}")
public List girlFindByAge(@PathVariable("age") Integer age){
return girlRespository.findByAge(age);
}

JPA事务管理(数据回滚)

例如当简化用户购买一件商品时,需要减少库存和用户扣款两种操作,可能出现如下情况

减少库存 用户扣款 是否成功 应采取的操作
成功 失败 撤回减少库存操作
失败 成功 撤回用户扣款操作
失败 失败
成功 成功
  • 我们希望当操作失败时,对另外一个已经成功的操作进行撤回,即事物回滚操作
  • 首先需要查看数据库是否支持回滚操作,查看表引擎,若非InnoDB引擎,修改引擎为 InnoDB 即可

新建 GirlService 模拟 有两个相关联的数据库操作

java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.jpaexample;

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

/**
* Created by suxia on 2019/2/21/021.
*/
@Service
public class GirlService {

@Autowired
private GirlRespository girlRespository;

@Transactional
public void insertTwo(){
Girl girlA = new Girl();
girlA.setAge(18);
girlA.setCupSize("A");
girlRespository.save(girlA);

Girl girlB = new Girl();
girlB.setAge(19);
girlB.setCupSize("BBBB");
girlRespository.save(girlB);
}
}

@Transactional事务管理声明

编写 测试 控制器(GirlController类)

java
1
2
3
4
5
6
7
/**
* 同时插入两个数据,失败回滚
*/
@PostMapping(value = "/girls/two")
public void girlTwo(){
girlService.insertTwo();
}

访问测试

  • 测试原理:
    修改了 Girl 表中的 cupSize字段,令其长度为1,那么 girlB.setCupSize("BBBB"); 语句必定会引起数据库插入失败。 如果运行后数据库出现了1条记录,那么事务回滚失败,如果没有出现记录那么数据回滚成功。
文章作者: Bill
文章链接: http://blog.webpro.ltd/2019/02/21/springboot-fast-study/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Bill's blog

评论