01-SpringBoot入门案例(Idea联网版)
-
SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。
- 创建新模块,选择Spring Initializr,并配置模块相关基础信息
- 选择当前模块需要使用的技术集
- 开发控制器类
less 复制代码 //Rest 模式 @RestController @RequestMapping("/books") public class BookController { @GetMapping public String getById() { System.out.println("springboot is running..."); return "springboot is running..."; } }- 运行自动生成的Application类
- 打开浏览器访问url地址为:http://localhost:8080/books
- 创建新模块,选择Spring Initializr,并配置模块相关基础信息
-
最简SpringBoot程序所包含的基础文件 (pom.xml文件 和 Application类 )
- pom.xml文件
xml 复制代码 <?xml version="1.0" encoding="UTF-8"?> <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 <parent> // starter <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.6</version> </parent> <groupId>com.example</groupId> <artifactId>springboot-01-quickstart</artifactId> <version>0.0.1-SNAPSHOT</version> // 依赖 <dependencies> // starter <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> // 测试库 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>- Application类
typescript 复制代码 @SpringBootApplication public class Springboot0101QuickstartApplication { public static void main(String[] args) { SpringApplication.run(Springboot0101QuickstartApplication.class, args); } } -
Spring程序与SpringBoot程序对比
注意: 基于idea开发SpringBoot程序需要确保联网且能够加载到程序框架结构
小结:
- 开发SpringBoot程序可以根据向导进行联网快速制作
- SpringBoot程序需要基于JDK8进行制作
- SpringBoot程序中需要使用何种功能通过勾选选择技术
- 运行SpringBoot程序通过运行Application程序入口进行
02-教你一招:隐藏文件或文件夹
- 可以隐藏的文件
- Idea中隐藏指定文件或指定类型文件
- Setting → File Types → Ignored Files and Folders
- 输入要隐藏的文件名,支持*号通配符
- 回车确认添加
03-入门案例解析:parent
porm.xml文件parent节点
xml
复制代码
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.6</version>
</parent>
- 按住
Ctrl点击pom.xml中的spring-boot-starter-parent,跳转到了2.5.6版本spring-boot-starter-parent的pom.xml
xml
复制代码
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.6</version>
</parent>
- 按住
Ctrl点击pom.xml中的spring-boot-starter-dependencies,跳转到了2.5.6版本spring-boot-starter-dependencies的pom.xml
xml
复制代码
<properties>
<activemq.version>5.15.3</activemq.version>
<antlr2.version>2.7.7</antlr2.version>
<appengine-sdk.version>1.9.63</appengine-sdk.version>
<artemis.version>2.4.0</artemis.version>
<aspectj.version>1.8.13</aspectj.version>
<assertj.version>3.9.1</assertj.version>
<atomikos.version>4.0.6</atomikos.version>
<bitronix.version>2.1.4</bitronix.version>
<build-helper-maven-plugin.version>3.0.0</build-helper-maven-plugin.version>
<byte-buddy.version>1.7.11</byte-buddy.version>
... ... ...
</properties>
从上面的spring-boot-starter-dependencies的pom.xml中我们可以发现,一部分坐标的版本、依赖管理、插件管理已经定义好,所以我们的SpringBoot工程继承spring-boot-starter-parent后已经具备版本锁定等配置了。所以起步依赖的作用就是进行依赖的传递。
-
小结:
- 开发SpringBoot程序要继承spring-boot-starter-parent
- spring-boot-starter-parent中定义了若干个依赖管理
- 继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突
- 继承parent的形式也可以采用引入依赖的形式实现效果
04-入门案例解析:starter
-
spring-boot-starter-web.pom
- 按住Ctrl点击
pom.xml中的spring-boot-starter-web,跳转到了spring-boot-starter-web的pom.xml,xml配置如下(只摘抄了部分重点配置):
- 按住Ctrl点击
xml
复制代码
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.5.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.5.RELEASE</version>
<scope>compile</scope>
</dependency>
从上面的spring-boot-starter-web的pom.xml中我们可以发现,spring-boot-starter-web就是将web开发要使用的spring-web、spring-webmvc等坐标进行了“打包”,这样我们的工程只要引入spring-boot-starter-web起步依赖的坐标就可以进行web开发了,同样体现了依赖传递的作用
-
starter
SpringBoot中常见项目名称,定义了当前项目使用的所有依赖坐标,以达到减少依赖配置的目的
-
parent
- 所有
SpringBoot项目要继承的项目,定义了若干个坐标版本号(依赖管理,而非依赖),以达到减少依赖冲突的目的。 spring-boot-starter-parent各版本间存在着诸多坐标版本不同
- 所有
-
实际开发
- 使用任意坐标时,仅书写
GAV(groupId, artifactId, version)中的G和A,V由SpringBoot提供,除非SpringBoot未提供对应版本V - 如发生坐标错误,再指定
Version(要小心版本冲突)
- 使用任意坐标时,仅书写
05-入门案例解析:引导类
arduino
复制代码
@SpringBootApplication
public class Springboot0101QuickstartApplication {
public static void main(String[] args) {
ConfigurableApplicationContext ctx = SpringApplication.run(Springboot0101QuickstartApplication.class, args);
//获取bean对象
BookController bean = ctx.getBean(BookController.class);
System.out.println("bean======>" + bean);
}
}
- SpringBoot的引导类是Boot工程的执行入口,运行main方法就可以启动项目
- SpringBoot工程运行后初始化Spring容器,扫描引导类所在包加载bean
06-入门案例:辅助功能
- 辅助功能 内嵌tomcat
- 使用maven依赖管理变更起步依赖项
xml
复制代码
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--web 起步依赖环境中,排除 Tomcat 起步依赖 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加 Jetty 起步依赖,版本由 SpringBoot 的 starter 控制 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
-
Jetty比Tomcat更轻量级,可扩展性更强(相较于Tomcat),谷歌应用引擎(GAE)已经全面切换为Jetty
-
内置服务器
tomcat(默认)apache出品,粉丝多,应用面广,负载了若干较重的组件jetty更轻量级,负载性能远不及tomcatundertow undertow,负载性能勉强跑赢tomcat
-
小结:
- 内嵌
Tomcat服务器是SpringBoot辅助功能之一 - 内嵌
Tomcat工作原理是将Tomcat服务器作为对象运行,并将该对象交给Spring容器管理 - 变更内嵌服务器思想是去除现有服务器,添加全新的服务器
- 内嵌
[补]知识加油站-01-REST风格简介
-
什么是
rest:REST(Representational State Transfer)表现形式状态转换
-
传统风格资源描述形式
- http://localhost/user/getById?id=1 (得到id为1的用户)
- http://localhost/user/saveUser (保存用户)
-
REST风格描述形式- http://localhost/user/1 (得到id为1的用户)
- http://localhost/user (保存用户)
-
优点:
- 隐藏资源的访问行为, 无法通过地址得知对资源是何种操作
- 书写简化
-
按照REST风格访问资源时使用行为动作区分对资源进行了何种操作
GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删除资源- http://localhost/users 查询全部用户信息
GET(查询) - http://localhost/users/1 查询指定用户信息
GET(查询) - http://localhost/users 添加用户信息
POST(新增/保存) - http://localhost/users 修改用户信息
PUT(修改/更新) - http://localhost/users/1 删除用户信息
DELETE(删除)
-
注意:
- 上述行为是约定方式,约定不是规范,可以打破,所以称
REST风格,而不是REST规范 - 描述模块的名称通常使用复数,也就是加s的格式描述,表示此类资源,而非单个资源,例如:
users、 books、 accounts…
- 上述行为是约定方式,约定不是规范,可以打破,所以称
[补]知识加油站-02-RESTful入门案例
-
设定
http请求动作(动词)- 使用
@RequestMapping注解的method属性声明请求的方式 - 使用
@RequestBody注解 获取请求体内容。直接使用得到是key=value&key=value…结构的数据。get请求方式不适用。 - 使用
@ResponseBody注解实现将controller方法返回对象转换为json响应给客户端。
- 使用
-
设定请求参数(路径变量)
- 使用
@PathVariable用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。
- 使用
-
@RequestMapping
-
@PathVariable
-
@RequestBody @RequestParam @PathVariable
[补]知识加油站-03-RESTful快速开发
-
使用
@RestController注解开发 RESTful 风格
-
使用
@GetMapping@PostMapping@PutMapping@DeleteMapping简化@RequestMapping注解开发
13-属性配置方式
- 修改服务器端口
SpringBoot默认配置文件application.properties,通过键值对配置对应属性
ini
复制代码
# 服务器端口配制
server.port=80
07-基础配置
ini
复制代码
# 修改banner
# spring.main.banner-mode=off
# spring.banner.image.location=logo.png
# 日志
logging.level.root=info
-
- 官方文档中参考文档第一项:
Application Propertie
- 官方文档中参考文档第一项:
15-3种配置文件类型
- SpringBoot提供了多种属性配置方式,yml是主流格式。
16-配置文件加载优先级
-
SpringBoot配置文件加载顺序
application.properties>application.yml>application.yaml
-
常用配置文件种类
application.yml
17-教你一招:属性提示消失解决方案
-
指定
SpringBoot配置文件Setting→Project Structure→Facets
-
选中对应项目/工程
Customize Spring Boot
-
选择配置文件
18-yaml数据格式
-
YAML(YAML Ain’t Markup Language),一种数据序列化格式 -
YAML文件扩展名.yml和.yaml -
基本语法
- key: value -> value 前面一定要有空格
- 大小写敏感
- 属性层级关系使用多行描述,每行结尾使用冒号结束
- 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
- 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
-
表示注释
- 核心规则:数据前面要加空格与冒号隔开
-
数据类型
-
数组表示方式:在属性名书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔
19-读取使用@Value读取单个数据,属性名引用方式:${一级属性名.二级属性名……}
- 使用
@Value配合SpEL读取单个数据 - 如果数据存在多层级,依次书写层级名称即可
20-yaml文件中的变量引用
- 在配置文件中可以使用属性名引用方式引用属性
21-读取yaml全部属性数据
- 封装全部数据到
Environment对象 - 需要标签
Autowired,表示自动装配
22-读取yaml引用类型属性数据
- 自定义对象封装指定数据
@component表示将MyDataSaource定义为spring管控的bean- 使用自动装配封装指定数据
kotlin
复制代码
@Autowired
private MyDataSource myDataSource;
System.out.println(myDataSource);
23-SpringBoot整合JUnit
- 添加Junit的起步依赖 Spring Initializr 创建时自带
xml
复制代码
<!--测试的起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
- SpringBoot整合JUnit
typescript
复制代码
@SpringBootTest //设置JUnit加载的SpringBoot启动类
class Springboot07JunitApplicationTests {
@Autowired //使用自动装配的形式添加要测试的对象
private BookService bookService;
@Test //需要自动测试的函数
public void testSave(){
bookService.save();
}
}
24-整合JUnit——classes属性
- 测试类如果不存在于引导类所在的包或子包中,需要通过
classes属性指定引导类。
java
复制代码
@SpringBootTest(classes = Springboot04JunitApplication.class)
//@ContextConfiguration(classes = Springboot04JunitApplication.class)
class Springboot04JunitApplicationTests {
@Autowired //1.注入你要测试的对象
private BookDao bookDao;
@Test
void contextLoads() {
//2.执行要测试的对象对应的方法
bookDao.save();
System.out.println("two...");
}
}
25-SpringBoot整合MyBatis
- 创建新模块,选择
Spring初始化,并配置模块相关基础信息 - 选择当前模块需要使用的技术集(
MyBatis、MySQL) - 设置数据源参数
yaml
复制代码
#DB Configuration:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot_db
username: root
password: 123456
- 在 springboot_db 数据库中创建 user 表
sql
复制代码
-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) DEFAULT NULL,
`password` varchar(50) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'zhangsan', '123', '张三');
INSERT INTO `user` VALUES ('2', 'lisi', '123', '李四');
- 创建实体Bean
arduino
复制代码
public class User {
// 主键
private Long id;
// 用户名
private String username;
// 密码
private String password;
// 姓名
private String name;
//此处省略getter,setter,toString方法 .. ..
}
- 定义数据层接口与映射配置
kotlin
复制代码
@Mapper // 如果在接口类上添加了@Mapper,在编译之后会生成相应的接口实现类。
public interface UserDao {
@Select("select * from user")
public List<User> getAll();
}
- 测试类中注入dao接口,测试功能
ruby
复制代码
@SpringBootTest
class Springboot05MybatisApplicationTests {
@Autowired
private UserDao userDao;
@Test
void contextLoads() {
List<User> userList = userDao.getAll();
System.out.println(userList);
// [User{id=1, username='zhangsan', password='123', name='张三'}, User{id=2, username='lisi', password='123', name='李四'}]
}
}
总结:
- 勾选MyBatis技术,也就是导入MyBatis对应的starter
- 数据库连接相关信息转换成配置
- 数据库SQL映射需要添加@Mapper被容器识别到
26-SpringBoot整合MyBatis常见问题处理
SpringBoot版本低于2.4.3(不含),Mysql驱动版本大于8.0时,需要在url连接串中配置时区
bash
复制代码
jdbc:mysql://localhost:3306/springboot_db?serverTimezone=UTC
-
或在
MySQL数据库端配置时区解决此问题-
MySQL 8.X驱动强制要求设置时区
- 修改url,添加
serverTimezone设定 - 修改
MySQL数据库配置(略)
- 修改url,添加
-
驱动类过时,提醒更换为
com.mysql.cj.jdbc.Drive
-
27-SpringBoot整合MyBatisPlus
- 手动添加
SpringBoot整合MyBatis-Plus的坐标,可以通过mvnrepository获取。由于SpringBoot中未收录MyBatis-Plus的坐标版本,需要指定对应的Version
xml
复制代码
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
- 数据层接口使用BaseMapper简化开发,定义数据层接口与映射配置,继承BaseMapper
java
复制代码
@Mapper
public interface UserDao extends BaseMapper<User> {
// 构建时,会自动生成对应user的增删查改函数
}
- 其他同SpringBoot整合MyBatis
- 测试类中注入dao接口,测试功能
ruby
复制代码
@SpringBootTest
class Springboot06MybatisPlusApplicationTests {
@Autowired
private UserDao userDao;
@Test
void contextLoads() {
List<User> users = userDao.selectList(null);
System.out.println(users);
// [User{id=1, username='zhangsan', password='123', name='张三'}, User{id=2, username='lisi', password='123', name='李四'}]
}
}
- 注意: 如果你的数据库表有前缀要在 application.yml 添加如下配制
yaml
复制代码
#设置Mp相关的配置
mybatis-plus:
global-config:
db-config:
table-prefix: tbl_
28-SpringBoot整合Druid
- Druid是阿里巴巴开源平台上一个数据库连接池实现,结合C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控。可以很好的监控DB池连接和SQL的执行情况,是针对监控而生的DB连接池,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。
- 导入Druid对应的starter
xml
复制代码
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
- 指定数据源类型 (这种方式只需导入一个 Druid 的坐标)
yaml
复制代码
#DB Configuration:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot_db?serverTimezone=UTC
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
- 或者 变更Druid的配置方式(推荐) 这种方式需要导入 Druid对应的starter
yaml
复制代码
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot_db?serverTimezone=UTC
username: root
password: 123456