Spring Boot学习(4)
REST风格
简介:
- 按照REST风格访问资源时使用行为动作区分对资源进行了何种操作
- http://localhost:0000/users 查询全部用户信息 GET(查询)
- http://localhost:0000/users/1 查询指定用户信息 GET(查询)
- http://localhost:0000/users 添加用户信息 POST(新增/保存)
- http://localhost:0000/users 修改用户信息 PUT(修改/更新)
- http://localhost:0000/users/1 删除用户信息 DELETE(删除)
- 根据REST风格对资源进行访问称为RESTful
- RESTful通常要使用四种访问的请求方法 如GET、POST、PUT、DELETE。
优点:
- 隐藏资源的访问行为,无法通过地址得知资源是何种操作
- 书写简化
注意:
- 上述行为是约定方式,约定方式不是规范,可以打破,所以称为REST风格,而不是REST规范 但是由于使用REST风格的公司越来越多,也就慢慢都认为它是一种规范(都去遵守它了)。
- 描述模块名称通常使用复数,也就是加s的格式描述,表示此类资源,而非单个资源,例如users、books….。
实例步骤:
- 设定http请求动作(动词)
- 设定请求参数(路径变量)
JAVA
@RestController
@RequestMapping("/users")
public class MyController {
//保存用户
@PostMapping
public String save(){
System.out.println("user save...");
return "{'module':user save}";
}
//删除用户
@DeleteMapping("/{id}")
public String delete(@PathVariable Integer id){
System.out.println("user delete..."+id);
return "{'module':user delete}";
}
//修改用户
@PutMapping
public String update(@RequestBody User user){
System.out.println("user update..."+user);
return "{'module':user update}";
}
//获取指定用户
@GetMapping("/{id}")
public String getById(Integer id){
System.out.println("user getById..."+id);
return "{'module':user getById}";
}
//获取全部用户
@GetMapping
public String getAll(){
System.out.println("user getAll...");
return "{'module':user getAll}";
}
}
配置文件
配置文件(application.properties)前面提到可以修改Springboot内置的端口号
PROPERTIES
server.port=8080
还可以修改banner、log等配置信息
更多的、详细的配置信息都在https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties中
注意:
- 配置文件中的内容要与你导入的依赖相关,如果你没有导入相关的依赖那么配置的内容是不会生效的,例如没有导入tomcat的依赖,那么配置文件中修改server.port是不会有高亮提示的也不生效。
配置文件的格式
- .properties(传统格式/默认格式)
- .yaml
- .yml(主流)
上述三种配置文件同时存在的执行的优先级(会加载覆盖)
是properties >> yml >> yaml
但上述情况一般不会出现
yaml
-
YAML(YAML Ain’t Markup Language),一种数据序列化格式
-
优点:
- 容易阅读
- 容易与脚本语言交互
- 以数据为核心,重数据格式
-
YAML文件扩展名
- .yaml
- .yml(主流)
-
语法规则
- 大小写敏感
- 属性层级关系使用多行描述,每行结尾使用冒号结束
- 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
- 属性值前面添加空格(属性名与属性之间使用冒号+空格作为分隔)
YAML country: china
-
#表示注释
-
更多语法YAML 入门教程 | 菜鸟教程 (runoob.com)
Java程序读取
-
使用Spring的IOC机制使用@Value注入
JAVA @Value("${country}")//读取键值对中的值 private String Country;
- 使用java类读取 (YAML类)
JAVA static { Yaml yaml = new Yaml(); try (InputStream in = YamlReader.class.getClassLoader().getResourceAsStream("application.yml");) { properties = yaml.loadAs(in, HashMap.class); } catch (Exception e) { log.error("Init yaml failed !", e); } }
- 使用环境变量对象来存储yaml配置文件中的键值对(使用@Autowire注入赋值)用来应对当yaml配置文件中对象过多的情况
JAVA @Autowired private Environment env; System.out.println(env.getProperty("server.port")); System.out.println(env.getProperty("Country"));
-
使用自定义类封装yaml配置文件中的数据
application.yaml
YML User: name: 丁杨维 age: 20
自定义User类
JAVA @Component//将对象的生命周期交给容器管理 也为了容器将配置文件中的信息赋值给该对象 @ConfigurationProperties(prefix = "user") public class User { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
Controller.java
JAVA @RestController @RequestMapping("/books") public class BookController { @Autowired private User user; @GetMapping public String getById(){ System.out.println(user); return null; } }
结果:
-
yaml文件中值的相互引用 直接使用${键名}即可
YAML
BaseDir: c\windows
TempDir: ${BaseDir}\temp
#如果有转义字符想要显示出来 就加上双引号 如这里\t就是一个转义字符
TempDir: "${BaseDir}\temp"
注意:
- 虽然配置文件格式多 单文件名可不是乱取的 名字一定是application.xxx才行
- 如果idea没有识别你的yaml文件或是yml文件为springboot配置文件(前提是文件名是applicaiton.xxx) 可以在Project Struct中设置
选择Facts 选择Configuration Files 在点击那个绿叶标志
点击+号找到你的文件
SpringBoot整合第三方技术
**注意:**如果使用的第三方技术无法在Spring Initializr中勾选到 则需要手动添加(maven中央仓库中查找)
SpringBoot整合Junit
使用Spring Initializr创建一个普通的SpringBoot程序(啥都不选) 会自动导入test依赖
这是因为maven创建的项目,生命周期中离不开test的原因,所以不用我们导入它会自动引入。
XML
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependenc
BookDao.java接口
JAVA
public interface BookDao {
void save();
}
BookImpl.java实现类
JAVA
@Repository
public class BookImpl implements BookDao {
@Override
public void save() {
System.out.println("book save");
}
}
Springboot05ApplicationTests.java
JAVA
@SpringBootTest
class Springboot05ApplicationTests {
@Autowired
private BookImpl book;
@Test
void contextLoads() {
book.save();
}
}
运行测试类获得结果
注意:
使用测试类时要将测试类放在与classes目录下引导类的路径呈同级或子级关系 否则测试类会找不到**@SpringBootConfiguration**而出现异常,而引导类的注解中包含@SpringBootConfiguration 所以引导类也是一个SpringBootConfiguration。
解决方案
- 将测试类放在classes目录下与引导类的路径呈同级或是子级关系的包下。
- 使用@ContextConfiguration(classes=…)注解指定引导类
- 使用@SpringBootTest(classes=…)注解指定引导类
SpringBoot整合Mybatis
创建
- 使用Spring Initializr创建,需要勾选SQL中的MySQL Driver和MyBatis Framework,根据需要勾选WEB。
Mybatis与SpringBoot整合的依赖以及JDBC的依赖
XML
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
- 配置数据库连接信息
application.yml
YML
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/my_db
username: root
password: devil
- 写实体类
Student.java
JAVA
package com.dyw.springboot06mybatis.Domain;
/**
* Devil
*
* @create 2022-01-20-23:36
*/
public class Student {
private int id;
private String name;
private int age;
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- 写StudentDao接口 写入相关操作
StudentDao.java
JAVA
@Mapper
public interface StudentDao {
@Select("select id,name,age from student order by id")
List<Student> selectStudents();
}
如果不适用配置文件那么则加入**@Mapper**注解 就类似于配置文件 自动代理 在里面使用@Select注解(查找)配置操作 @Update(修改/更新)….
执行测试类
注意:
如果出现了serverTimezone异常 需要在配置文件URL后加入?serverTimezone=UTC(时区任意)
SpringBoot整合Mybatis-Plus
直接导入相应的依赖mybatis-plus-boot-starter即可
并且在配置文件中写上数据库相关配置即可
SpringBoot整合Mybatis+Druid
需要导入druid的依赖
XML
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
application.yml配置数据源类型
方式一: 在spring.datasource中配置type为DruidDataSource
YML
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/my_db?serverTimezone=UTC
username: root
password: devil
type: com.alibaba.druid.pool.DruidDataSource
方式二: 直接在spring.datasource.druid中配置数据源信息
YML
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/my_db?serverTimezone=UTC
username: root
password: devil
YML
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/my_db?serverTimezone=UTC
username: root
password: devil
type: com.alibaba.druid.pool.DruidDataSource
方式二: 直接在spring.datasource.druid中配置数据源信息
YML
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/my_db?serverTimezone=UTC
username: root
password: devil
推荐第二种