一、基础篇
😄身为小白的我😄
需要掌握springboot程序的开发流程,可以基于springboot实现基础SSM框架整合❀😊💪
!咱就开始了!
学习前需要掌握的知识:
Java基础知识、spring和springMVC、mysql、服务器、maven、web技术
1. 快速上手SpringBoot
1.1 SpringBoot入门程序开发
- springboot的设计目的是为了简化Spring应用的初始搭建以及开发过程
- 创建新的工程,步骤如下
- 最基本的springboot入门案例【springmvc】
package com.wxy.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//Rest模式
@RestController
@RequestMapping("/books")
public class BookController {
@GetMapping
public String getById(){
System.out.println("springboot is running....");
return "springboot is running...";
}
}
这里添加一个简单的注解:就是上面的注解@RestController的使用
@RestController的作用等同于@Controller + @ResponseBody。
1. @Controller注解
在一个类上添加@Controller注解,表明了这个类是一个控制器类。但想要让这个类成为一个处理请求的处理器光有@Controller注解是不够的,他还需要进一步修炼才能成为一个处理器。
2. @RequestMappring注解
将@Controller注解的类注入Spring容器中,只是该类成为处理器的第一步,想要修炼大成,还需要在该类中添加注解@RequestMapping。
@RequestMapping注解是用来映射请求的,即指明处理器可以处理哪些URL请求,该注解既可以用在类上,也可以用在方法上。
3. @ResponseBody注解
@ResponseBody表示方法的返回值直接以指定的格式写入Http response body中,而不是解析为跳转路径。
格式的转换是通过HttpMessageConverter中的方法实现的,因为它是一个接口,因此由其实现类完成转换。
如果要求方法返回的是json格式数据,而不是跳转页面,可以直接在类上标注@RestController,而不用在每个方法中标注@ResponseBody,简化了开发过程。
❓小感想❓
使用了上面的开发之后,真的发现开发简化了不少哇!😂(ಥ _ ಥ),以前使用springmvc的开发的时候需要添加配置文件,配置pom.xml还需要写业务层和实现层,但是这里就简单的一个开发就解决了,这就是springboot的厉害之处吗?
1.2 idea没有联网的时候我们的boot项目怎么创建?
我们都知道,我们的springboot项目的创建是基于idea联网的前提的!那么如果我们现在idea无法联网或者访问的网站无法访问了,boot项目就创建不了了吗?(・∀・(・∀・(・∀・*)cuo
🙅不是的🙅,我们可以使用官网的页面进行创建然后再导入idea【注意我们上面说了是idea连不了网欧!】
然后导入idea就可以了!
1.3 有没有其他的网站可以给我们提供?
👏当然有!阿里云👏
❗地址为:http://start.aliyun.com❗
⭐使用阿里云的时候在勾选模块的时候相比于spring的网站的差距在于多了一些中文的模块【就是将英文改为了中文!】
1.4 在idea中不联网的创建【只是创建的过程不联网罢了,但是你的坐标还是需要下载下来!
1.在pom.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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springboot</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.wxy</groupId>
<artifactId>springboot_01_04_quickstart</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2. 配置运行文件Application【也就是自主创建的 Springboot0103QuickstartApplication】
package com.wxy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3. 然后配置springmvc文件就行
package com.wxy.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//Rest模式
@RestController
@RequestMapping("/books")
public class BookController {
@GetMapping
public String getById(){
System.out.println("springboot is running....3");
return "springboot is running...3";
}
}
❗注意❗
在导入pom.xml的时候,这个一定要导入
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
1.5 隐匿文件或者文件夹
1.6 Springboot 简介
1. spring程序的缺点😥:①依赖设置繁琐 ②配置繁琐
2. springboot的优点😊:①起步依赖(简化依赖配置) ②自动配置(简化常用工程相关配置) ③辅助功能(内置服务器)
3. 入门案例分析🤔
①parent ---- 解决配置问题👍
定义了若干个坐标版本号(依赖管理,而不是依赖),来减少依赖配置
②starter ------ 解决配置问题 👍
- 定义了当前项目使用的所有依赖坐标,以达到减少依赖配置的目的
实际开发:使用任意坐标的时候,只用书写GAV中的G和A,V由springboot提供,除非springboot没有提供对应版本V;如果发生坐标错误,再指定version(要小心版本冲突)
③引导类 ----- 启动项目😄
引导类是Boot工程的执行入口,运行main方法就可以启动项目
SpringBoot工程运行后初始化Spring容器,扫描引导类所在包加载bean
🖊@Configuration注解的使用 🖊
1.表明当前类是一个配置类,是方法bean的源
2.将@Configuration配置的AppConfig的beanDefinitioin属性赋值为full类型的,保证AppConfig类型 可以转变为cglib类型3.将@Configuration配置的AppConfig由普通类型转变为cglib代理类型,后会生成cglib代理对象,通 过代理对象的方法拦截器,可以解决AppConfig内部方法bean之间发生依赖调用的时候从容器中去获取,避免了多例的出现
4.用@Configuration注释类表明其主要目的是作为bean定义的源
5.@Configuration类允许通过调用同一类中的其他@Bean方法来定义bean之间的依赖关系
④内嵌tomcat ---- 启动web服务器 😄
pom.xml中排除依赖的语句:
<exclusions>
<groupId> *** </groupId>
<artifactId> *** </artifactId>
</exclusions>
😉内置服务器 --- tomcat(默认)【应用面广,负载了若干比较重的组件】、jetty【更轻量级,但是负载性能远远不如tomcat】、undertow【负载性能勉强可以跑赢tomcat】😎
2. 知识加油站
2.1 REST开发
1. REST简介
REST----表现形式状态转换
优点:
①隐藏资源的访问行为,无法通过地址得知对资源是何种操作
②书写简化
上述的行为是约定方式,而不是规范,所以打破REST风格,而不是REST规范。
❗根据REST风格进行资源访问叫做RESTful❗
2. RESTful入门案例
3. REST快速开发
4. 案例:基于RESTful页面数据交互
3. 基础配置
复制工程
原则:保留工程基础结构、抹掉原始工程痕迹
3.1 属性配置
1. 修改服务器端口
2. 修改banner
【在这个页面使用ctrl+F就可以进行搜索🔍】
3.2 配置文件分类
使用属性配置的时候我们会发现存在一个痛点就是配置多了看起来也很累
1. 配置文件格式有三种:
application.properties
application.yaml
application.yml
2. 配置文件的优先级
application.properties>application.yml>application.yaml
3. 解决yaml文件没有提示的问题
是因为springboot提供的功能失效了,idea不认为他是配置文件
❓如果出现问题😮
在添加为spring boot专有文件的时候没办法添加,就需要将对应文件名进行挂起,如下所示:
3.3 yaml文件
1. yaml是一种数据序列化格式
2. 优点:①容易阅读 ②容易与脚本语言交互 ③以数据为核心,重数据轻格式
3. yaml的扩展名:①.yml ②.yaml
4. 语法规则:①大小写敏感 ②属性层级关系使用多行描述,每行结束使用冒号结束 ③使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab)④属性值前面添加空格 ⑤#表示注释
3.4 yaml数据读取
//读取yaml中的单一数据
@Value("${country}")
private String country1;
🙆可以的🙆
#使用${属性名}引用数据 tempDir: d:\ #使用引号包裹的字符串,其中的转义字符可以生效
3.5 yaml数据属性
可以使用environment将所有的数据全部封装进去
//定义完之后可以疯转全部的数据,使用自动装配将所有的数据封装到对象Enivronment中
@Autowired
private Environment env;
将一部分数据进行封装【比如将下面的数据封装起来】
package com.wxy;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
//1. 定义数据模型封装yaml文件中对应的数据
//2. 定义为Spring管控的bean
@Component
//3. 指定加载的数据
@ConfigurationProperties(prefix = "datasource")
public class MyDataSource {
private String driver;
private String url;
private String username;
private String password;
@Override
public String toString() {
return "MyDataSource{" +
"driver='" + driver + '\'' +
", url='" + url + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
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;
}
}
@Autowired
private MyDataSource myDataSource;
4. 整合第三方技术
4.1 整合JUnit
@SpringBootTest
class Springboot04JunitApplicationTests {
//1.注入你要测试的对象
@Autowired
private BookDao bookDao;
@Test
void contextLoads() {
//2.执行要测试的对象对应的方法
bookDao.save();
}
}
如果我们将Springboot04JunitApplicationTests移动位置,就会出现错误,那么怎么解决?除了可以将他移回来还可以在上面添加注释@SpringBootTest(classes = Springboot04JunitApplication.class)来指定引导类的位置
4.2 整合MyBatis
核心配置:数据库连接的相关信息
映射配置:SQL映射(XML/注解)
4.3整合MyBatis-Plus
Mybatis和Mybatis_plus的区别
导入坐标不同;数据层实现简化
我们会发现我们在创建新的模块的时候,不存在mybatis_plus的选项,那么怎么办嘞?
我们可以先直接创建模块,然后进入mvnrepository.com网站,找到mybatis plus,并复制对应的依赖,然后加入到模块的pom.xml文件中即可!
4.4 整合Druid
有一种通用的
#spring:
# datasource:
# driver-class-name: com.mysql.jdbc.Driver
# url: jdbc:mysql://localhost:3306/ssm
# username: root
# password:
# type: com.alibaba.druid.pool.DruidDataSource
还有一种整合的方式
spring:
datasource:
druid:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm
username: root
password:
4.5 基于SpringBoot的SSMP整合案例
SSMP整合案例
1. 基本功能
2. 模块创建
3. 实体类的开发
4. 数据层开发
技术实现方案:
MybatisPlus Druid
mybatisplus生成id使用的是雪花算法;我们需要使用数据库的自增的策略,可以使用下面的方法
①导入坐标
②技术的使用
③数据层的开发
④测试类的开发
4.1 设置mp的调试日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
4.2 分页
4.3 按条件查询
@Test
void testGetBy(){
QueryWrapper<Book> qw=new QueryWrapper<>();
qw.like("name","Spring");
bookDao.selectList(qw);
}
改进:如果你的name写错了怎么办?
@Test
void testGetBy2(){
LambdaQueryWrapper<Book> lqw=new LambdaQueryWrapper<>();
lqw.like(Book::getName,"Spring"); //可以帮你做语法级的校验
bookDao.selectList(lqw);
}
进一步改进:做一个判断,判断你的name存不存在
@Test
void testGetBy2(){
String name=null;
LambdaQueryWrapper<Book> lqw=new LambdaQueryWrapper<>();
// if(name!=null) lqw.like(Book::getName,name);
lqw.like(name!=null,Book::getName,name);
bookDao.selectList(lqw);
}
5. 业务层开发
Service层接口和数据层接口定义有比较大的区别,不要混用
6. 业务层的改进!我们可以发现我们这里的可以套用到很多的其他模块上,那么是不是可以有一种方法让我们简化开发,也就是调用已经存在的!
7. 表现层的开发
package com.wxy.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wxy.domain.Book;
import com.wxy.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.sql.Wrapper;
import java.util.List;
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private IBookService iBookService;
@GetMapping
public List<Book> getAll(){
return iBookService.list();
}
@PostMapping
public Boolean save(@RequestBody Book book){
return iBookService.save(book);
}
@PutMapping
public Boolean update(Book book){
return iBookService.update(book);
}
@DeleteMapping("{id}")
public Boolean delete(@PathVariable Integer id){ //@PathVariable 接收请求路径中占位符的值
return iBookService.delete(id);
}
@GetMapping("{currentPage}/{pageSize}")
public IPage<Book> getPage(@PathVariable int currentPage, int pageSize) {
return iBookService.getPage(currentPage, pageSize);
}
但是存在问题就是,我们在操作的时候会发现我们返回的数据有些的是json数组,有些的又是json,又存在布尔数值,不统一,看起来就很混乱。那么就需要我们统一起来!
8. 表现层的数据格式统一
package com.wxy.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.wxy.controller.utils.R;
import com.wxy.domain.Book;
import com.wxy.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/books")
public class BookController2 {
@Autowired
private IBookService iBookService;
@GetMapping
public R getAll(){
return new R(true,iBookService.list());
}
@PostMapping
public R save(@RequestBody Book book){
/* R r=new R();
boolean flag = iBookService.save(book);
r.setFlag(flag);*/
return new R(iBookService.save(book));
}
@PutMapping
public R update(Book book){
return new R(iBookService.update(book));
}
@DeleteMapping("{id}")
public R delete(@PathVariable Integer id){ //@PathVariable 接收请求路径中占位符的值
return new R(iBookService.delete(id));
}
@GetMapping("{currentPage}/{pageSize}")
public R getPage(@PathVariable int currentPage, int pageSize) {
return new R(true,iBookService.getPage(currentPage, pageSize));
}
}
9. 前后端协议调用
实现功能一:新建的功能
实现功能二:显示所有的数据
实现功能三:添加新建页面中的确认按钮【确认之后就会将数据提交到后台】
实现功能四:我们会发现在上面这些操作之后,我们每次打开都会留有上次操作留下来的数据,那么我们需要在打开的时候就自动清楚它们
实现功能五:取消按钮的实现
实现功能六:添加删除功能
实现功能七:添加修改功能
实现功能八:异常消息处理
实现功能九:实现分页
实现功能十:分页维护
将当前页码值变为总页数
二、实用篇
需要掌握的技术:
linux、使用开发技术
三、原理篇
需要掌握的技术:
spring的所有bean的各种方式