SpringBoot入门 整合mybatis,Redis,Junit
文章引用
同篇文章引自亮哥博客 SpringBoot2.X快速上手 : https://haoyongliang.gitee.io
Spring Boot - 01
1. SpringBoot 概述
SpringBoot提供了一种快速使用Spring的方式,基于约定优于配置的思想,可以让开发人员不必在配置与逻 辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度 上缩短了项目周期。2014 年 4 月,Spring Boot 1.0.0 发布。Spring的顶级项目之一(https://spring.io)。
1.1 Spring 缺点
1.1.1 配置繁琐
虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多 XML配置。Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。 Spring 3.0引入了基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML。
所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要进行思维切换,所 以编写配置挤占了编写应用程序逻辑的时间。和所有框架一样,Spring实用,但它要求的回报也不少。
1.1.1 依赖繁琐
项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导 入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发 进度。
1.2 SpringBoot 功能
1.2.1 自动配置
Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定 Spring配置应该用哪个,不该用哪个。该过程是SpringBoot自动完成的。
1.2.2 起步依赖
起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖 ,这些东西加在一起即支持某项功能。 简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
1.2.3 辅助功能
提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等。
1.3 小结
Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速使用 Spring 的方式
2. SpringBoot 快速入门
2.1 案例:需求
搭建SpringBoot工程,定义HelloController.hello()方法,返回”Hello SpringBoot!”。
2.2 案例:实现步骤
创建Maven项目
导入SpringBoot起步依赖
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
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itheima</groupId>
<artifactId>springboot-helloworld</artifactId>
<version>1.0-SNAPSHOT</version>
<!--springboot工程需要继承的父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
</parent>
<dependencies>
<!--web开发的起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>定义Controller
1
2
3
4
5
6
7
8
9
10
11
12
13
14package com.itheima.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
public class HelloController {
public String hello(){
return " hello Spring Boot !";
}
}编写引导类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16package com.itheima;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 引导类。 SpringBoot项目的入口
*/
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class,args);
}
}启动测试
2.3 小结
SpringBoot在创建项目时,使用jar的打包方式。
SpringBoot的引导类,是项目入口,运行main方法就可以启动项目。
使用SpringBoot和Spring构建的项目,业务代码编写方式完全一样。
3. SpringBoot 起步依赖原理分析
- spring-boot-starter-parent
- spring-boot-starter-web
3.1 小结
- 在spring-boot-starter-parent中定义了各种技术的版本信息,组合了一套最优搭配的技术版本。
- 在各种starter中,定义了完成该功能需要的坐标合集,其中大部分版本信息来自于父工程。
- 我们的工程继承parent,引入starter后,通过依赖传递,就可以简单方便获得需要的jar包,并且不会存在 版本冲突等问题。
4. SpringBoot 配置
4.1 配置文件分类
SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用 application.properties或者application.yml(application.yaml)进行配置。
- properties:
1 | server.port=8080 |
yml:
1
2server:
port: 8080
4.1.1 小结
SpringBoot提供了2种配置文件类型:properteis和yml/yaml
默认配置文件名称:application
在同一级目录下优先级为:properties > yml > yaml
4.2 yaml
YAML全称是 YAML Ain’t Markup Language 。YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅 读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP 等。YML文件是以数据为核心的,比传统的xml方式更加简洁。 YAML文件的扩展名可以使用.yml或者.yaml。
properties:
1
2server.port=8080
server.address=127.0.0.1xml:
1
2
3
4<server>
<port>8080</port>
<address>127.0.0.1</address>
</server>yml:
1
2
3
4server:
port: 8080
address: 127.0.0.1简洁,以数据为核心
4.2.1 YAML:基本语法
- 大小写敏感
- 数据值前边必须有空格,作为分隔符
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格(各个系统 Tab对应的 空格数目可能不同,导致层次混乱)。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- # 表示注释,从这个字符一直到行尾,都会被解析器忽略。
1 | server: |
4.2.2 YAML:数据格式
对象(map):键值对的集合。
1
2
3
4person:
name: zhangsan
# 行内写法
person: {name: zhangsan}数组:一组按次序排列的值
1
2
3
4
5address:
- beijing
- shanghai
# 行内写法
address: [beijing,shanghai]纯量:单个的、不可再分的值
1
2msg1: 'hello \n world' # 单引忽略转义字符
msg2: "hello \n world" # 双引识别转义字符
4.2.3 YAML:参数引用
1 | name: lisi |
4.2.4 小结
配置文件类型
1. properties:和以前一样
2. yml/yaml:注意空格
yaml:简洁,以数据为核心
- 基本语法
- • 大小写敏感
- • 数据值前边必须有空格,作为分隔符
- • 使用空格缩进表示层级关系,相同缩进表示同一级
- 数据格式
- • 对象
- • 数组: 使用 “- ”表示数组每个元素
- • 纯量
- 参数引用
- • ${key}
4.3 读取配置文件内容
4.3.1 读取配置内容
@Value
Environment
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
32package com.example.springbootday01fast;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
public class HelloController {
private String name;
private String name2;
private int age;
private String beijing;
private Environment env;
public String hello(){
System.out.println(name2);
System.out.println(age);
System.out.println(beijing);
System.out.println(env.getProperty("address[0]"));
return "hello spring boot+"+name;
}
}@ConfigurationProperties
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
39package com.example.springbootday01fast;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
public class Person {
private String name;
private int age;
private String[] address;
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;
}
public String[] getAddress() {
return address;
}
public void setAddress(String[] address) {
this.address = address;
}
}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
37package com.example.springbootday01fast;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
public class HelloController {
private String name;
private String name2;
private int age;
private String beijing;
private Environment env;
private Person person;
public String hello(){
System.out.println(name2);
System.out.println(age);
System.out.println(beijing);
System.out.println(env.getProperty("address[0]"));
System.out.println(person.getAge());
System.out.println(person.getAddress()[0]);
return "hello spring boot+"+name;
}
}
4.4 profile
我们在开发Spring Boot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址、服务 器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的。
1 |
|
1 | spring.profiles.active=dev |
- profile配置方式
- 多profile文件方式
- yml多文档方式
- profile激活方式
- 配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server:
port: 8085
spring:
profiles: dev
server:
port: 8086
spring:
profiles: test
server:
port: 8087
spring:
profiles: pro
spring:
profiles:
active: dev - 虚拟机参数
1
-Dspring.profiles.active=pro
- 命令行参数
1
java -jar .\springboot-day01-fast-0.0.1-SNAPSHOT.jar --spring.profiles.active=test
4.4.1 Profile-小结
profile是用来完成不同环境下,配置动态切换功能的。
profile配置方式
- 多profile文件方式:提供多个配置文件,每个代表一种环境
- application-dev.properties/yml 开发环境
- application-test.properties/yml 测试环境
- application-pro.properties/yml 生产环境
- yml多文档方式:
- 在yml中使用 — 分隔不同配置
- 多profile文件方式:提供多个配置文件,每个代表一种环境
profile激活方式
- 配置文件: 再配置文件中配置:spring.profiles.active=dev
- 虚拟机参数:在VM options 指定:-Dspring.profiles.active=dev
- 命令行参数:java –jar xxx.jar –spring.profiles.active=dev
4.5 内部配置加载顺序
Springboot程序启动时,会从以下位置加载配置文件:
- . file:./config/:当前项目下的/config目录下
- file:./ :当前项目的根目录
- classpath:/config/:classpath的/config目录
- classpath:/ :classpath的根目录
加载顺序为上文的排列顺序,高优先级配置的属性会生效
4.6 外部配置加载顺序
通过官网查看外部属性加载顺序:https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config
5. SpringBoot 整合其他框架
5.1 SpringBoot整合Junit。
需求:SpringBoot整合Junit。
案例:实现步骤
搭建SpringBoot工程
引入starter-test起步依赖
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
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.itheima</groupId>
<artifactId>springboot-junit</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-junit</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>编写测试类
1
2
3
4
5
6
7
8
9
10
11
12
13
14package com.itheima.springbootjunit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
public class SpringbootJunitApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootJunitApplication.class, args);
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24package com.itheima.test;
import com.itheima.springbootjunit.SpringbootJunitApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* 测试类
*/
public class UserServiceTest {
public void test(){
System.out.println(111);
}
}1
2
3
4
5
6
7
8
9
10
11
12
13package com.itheima.springbootjunit;
import org.springframework.stereotype.Service;
public class UserService {
public void show(){
System.out.println("show....");
}
}添加测试相关注解
1. @RunWith(SpringRunner.class) 2. @SpringBootTest(classes = 启动类.class)
编写测试方法
如果测试类和启动类在同一个包下,则加@SpringBootTest即可
5.2 SpringBoot整合Redis。
案例:实现步骤
搭建SpringBoot工程
引入redis起步依赖
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
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.itheima</groupId>
<artifactId>springboot-redis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-redis</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>1
2
3
4
5
6
7
8
9
10
11
12
13
14package com.itheima.springbootredis;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
public class SpringbootRedisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootRedisApplication.class, args);
}
}配置redis相关属性
1
2
3
4
5spring:
redis:
host: 127.0.0.1 # redis的主机ip
port: 6379注入RedisTemplate模板
编写测试方法,测试
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
32package com.itheima.springbootredis;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.BoundValueOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
public class SpringbootRedisApplicationTests {
private RedisTemplate redisTemplate;
public void testSet() {
//存入数据
redisTemplate.boundValueOps("name").set("zhangsan");
}
public void testGet() {
//获取数据
Object name = redisTemplate.boundValueOps("name").get();
System.out.println(name);
}
}
5.3 SpringBoot整合MyBatis。
案例:实现步骤
搭建SpringBoot工程
引入mybatis起步依赖,添加mysql驱动
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
46
47
48
49
50
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.itheima</groupId>
<artifactId>springboot-mybatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-mybatis</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--<scope>runtime</scope>-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>编写DataSource和MyBatis相关配置 application.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# datasource
spring:
datasource:
url: jdbc:mysql:///springboot?serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
# mybatis
mybatis:
mapper-locations: classpath:mapper/*.xml # mapper映射文件路径
type-aliases-package: com.example.springbootday01mybatis.domain
# config-location: # 指定mybatis的核心配置文件定义表和实体类
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
43package com.example.springbootday01mybatis.domain;
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}编写dao和mapper文件/纯注解开发
1
2
3
4
5
6
7
8
9
10
11
12
13
14package com.example.springbootday01mybatis.mapper;
import com.example.springbootday01mybatis.domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface UserMapper {
public List<User> findAll();
}1
2
3
4
5
6
7
8
9
10
11
12
13package com.example.springbootday01mybatis.mapper;
import com.example.springbootday01mybatis.domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface UserXmlMapper {
List<User> findAll();
}1
2
3
4
5
6
7
<mapper namespace="com.example.springbootday01mybatis.mapper.UserXmlMapper">
<select id="findAll" resultType="user">
select * from user
</select>
</mapper>
测试
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
33package com.example.springbootday01mybatis;
import com.example.springbootday01mybatis.domain.User;
import com.example.springbootday01mybatis.mapper.UserMapper;
import com.example.springbootday01mybatis.mapper.UserXmlMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
class SpringbootDay01MybatisApplicationTests {
void contextLoads() {
}
private UserMapper userMapper;
private UserXmlMapper userXmlMapper;
public void testFindAll(){
List<User> all = userMapper.findAll();
System.out.println(all);
List<User> all1 = userXmlMapper.findAll();
System.out.println(all1);
}
}