这里写自定义目录标题
黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战
使用RestController代替Controller+ResponseBody
在Dao的实现类上加@Repository,@Repository就是写在数据层上的。
@Service将servive的实现类定义为 业务层对应的bean
表现层Contrller中, 带参数的,用异步提交发送的话,参数通过请求体传json数据过来, 用 请求体参数@RequestBody;删除和传单个 使用的是路径变量来传参,@PathVariable
业务层接口关注的是 业务名称
数据层接口关注的是 与数据库相关的操作
1. 入门案例解析
spring程序缺点:
- 依赖设置繁琐
- 配置繁琐
SpringBoot程序优点:
- 起步依赖(简化依赖配置)
- 自动配置(简化常用工程相关配置)
- 辅助功能(内置服务器,…)
1.1 parent-仅定义未使用
定义一系列坐标,属性和依赖管理
子工程继承了parent, parent又继承了dependencies, dependencies定义了几百了版本信息,以及对应的坐标引用信息。方便我们的配置
- 开发SpringBoot程序要继承spring-boot-starter-parent
- spring-boot-starter-parent中定义了若干个依赖管理
- 继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突
- 继承parent的形式也可以采用引入依赖的形式实现效果
1.2 starter
下面的依赖在使用
对应的start其实就是包含了若干个坐标定义的pom管理文件,一个start包含了若干个依赖管理信息。
-
项目中的pom.xml定义了使用SpringMVC技术,但是并没有写SpringMVC的坐标,而是添加了一个名字中包含starter的依赖
-
在spring-boot-starter-web中又定义了若干个具体依赖的坐标
总结
- 开发SpringBoot程序需要导入坐标时通常导入对应的starter
- 每个不同的starter根据功能不同,通常包含多个依赖坐标
- 使用starter可以实现快速配置的效果,达到简化配置的目的
starter与parent的区别
朦朦胧胧中感觉starter与parent好像都是帮助我们简化配置的,但是功能又不一样,梳理一下。
starter是一个坐标中定了若干个坐标,以前写多个的,现在写一个,是用来减少依赖配置的书写量的
parent是定义了几百个依赖版本号,以前写依赖需要自己手工控制版本,现在由SpringBoot统一管理,这样就不存在版本冲突了,是用来减少依赖冲突的
1.3 引导类
@SpringBootApplication
public class Springboot0101QuickstartApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot0101QuickstartApplication.class, args);
}
}
就是启动了一个spring容器
bean就是由spirng管理的组件
SpringBoot本身是为了加速Spring程序的开发的,而Spring程序运行的基础是需要创建自己的Spring容器对象(IoC容器)并将所有的对象交给Spring的容器管理,也就是一个一个的Bean。那还了SpringBoot加速开发Spring程序,这个容器还在吗?这个疑问不用说,一定在。当前这个类运行后就会产生一个Spring容器对象,并且可以将这个对象保存起来,通过容器对象直接操作Bean。
SpringBoot程序启动还是创建了一个Spring容器对象。这个类在SpringBoot程序中是所有功能的入口,称这个类为引导类。
作为一个引导类最典型的特征就是当前类上方声明了一个注解@SpringBootApplication
总结
- SpringBoot工程提供引导类用来启动程序
- SpringBoot工程启动后创建并初始化Spring容器
1.4 内嵌tomcat-辅助功能
将tomcat容器的执行过程抽取出来,变成一个对象,交给spring容器去管理
总结
- 内嵌Tomcat服务器是SpringBoot辅助功能之一
- 内嵌Tomcat工作原理是将Tomcat服务器作为对象运行,并将该对象交给Spring容器管理
- 变更内嵌服务器思想是去除现有服务器,添加全新的服务器
2. Rest风格
2.1 Rest简介
REST:Representational State Transfer,表现层资源状态转移。
访问网络资源的格式
2.2 RESTful入门案例
- 设定http请求动作 get post put delete
- 设定请求参数(路径变量)
@RequestMapping("/save")
改为
@RequestMapping(value = "/users", method = RequestMethod.POST)
添加路径参数 @PathVariable
2.3 REST快速开发
- 可以把路径提出来
- 可以把ResponseBody提出来
- 使用RestController代替Controller+ResponseBody
@RequestMapping( method = RequestMethod.POST)
改为
@PostMapping
@RequestMapping( value = "/{id}", method = RequestMethod.POST)
改为
@DeleteMapping("/{id}")
2.4 接收参数的三种方式
3. springBoot基础配置
3.1 属性配置
SpringBoot通过配置文件application.properties就可以修改默认的配置,通过键值对修改
修改服务器端口: 将8080端口,改为80默认端口
server.port=80
关闭运行日志图表(banner)
spring.main.banner-mode=off
设置运行日志的显示级别
debug -》error -》 info
logging.level.root=debug
3.2 配置文件分类
三种配置文件格式
- application.properties(properties格式)
server.port=80
- application.yml(yml格式)(主流格式)
server:
port: 81
- application.yaml(yaml格式)
server:
port: 82
3个文件的加载优先顺序是什么
application.properties > application.yml > application.yaml
3.3 yaml文件
yaml语法规则:
- 大小写敏感
- 属性层级关系使用多行描述,每行结尾使用冒号结束
- 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
- 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
- #号 表示注释
subject: #数组
- Java
- 前端
- 大数据
enterprise:
name: itcast
age: 16
subject:
- Java
- 前端
- 大数据
likes: [王者荣耀,刺激战场] #数组书写缩略格式
users: #对象数组格式一
- name: Tom
age: 4
- name: Jerry
age: 5
users: #对象数组格式二
-
name: Tom
age: 4
-
name: Jerry
age: 5
users2: [ {
name:Tom , age:4 } , {
name:Jerry , age:5 } ] #对象数组缩略格式
数据前面要加空格与冒号隔开
3.4 yaml数据读取
3.4.1 读取单一数据
yaml中保存的单个数据,可以使用Spring中的注解直接读取,使用@Value可以读取单个数据,属性名引用方式:${一级属性名.二级属性名……}
总结
- 使用@Value配合SpEL读取单个数据
- 如果数据存在多层级,依次书写层级名称即可
3.4.2 读取全部数据
pringBoot提供了一个对象,能够把所有的数据都封装到这一个对象中,这个对象叫做Environment,使用自动装配注解可以将所有的yaml数据封装到这个对象中
总结
- 使用Environment对象封装全部配置信息
- 使用@Autowired自动装配数据到Environment对象中
3.4.3 读取对象数据
创建类用于封装下面的对象
由spring帮我们去加载数据到对象中, 一定要告诉spring加载这组信息
使用时候从spring中直接获取信息使用
对象类:
- 定义数据模型封装yaml文件中对应的数据
- 定义为Spring管控的bean @Component
- 指定加载的数据
@ConfigurationProperties(prefix="enterprise")
总结
- 使用@ConfigurationProperties注解绑定配置信息到封装类中
- 封装类需要定义为Spring管理的bean,否则无法进行属性注入
3.4.4 yaml文件中的数据引用
如果你在书写yaml数据时,经常出现如下现象,比如很多个文件都具有相同的目录前缀
center:
dataDir: /usr/local/fire/data
tmpDir: /usr/local/fire/tmp
logDir: /usr/local/fire/log
msgDir: /usr/local/fire/msgDir
或者
center:
dataDir: D:/usr/local/fire/data
tmpDir: D:/usr/local/fire/tmp
logDir: D:/usr/local/fire/log
msgDir: D:/usr/local/fire/msgDir
这个时候你可以使用引用格式来定义数据,其实就是搞了个变量名,然后引用变量了,格式如下:
baseDir: /usr/local/fire
center:
dataDir: ${baseDir}/data
tmpDir: ${baseDir}/tmp
logDir: ${baseDir}/log
msgDir: ${baseDir}/msgDir
还有一个注意事项,在书写字符串时,如果需要使用转义字符,需要将数据字符串使用双引号包裹起来
lesson: "Spring\tboot\nlesson"
总结
- 在配置文件中可以使用${属性名}方式引用属性值
- 如果属性中出现特殊字符,可以使用双引号包裹起来作为字符解析
4. 整合第三方技术
- 导入对应的starter
- 配置相关信息
4.1 整合JUnit
如果当前测试类在引导类所在的包,或者子包下的话,可以成功测试,否则就需要加 引导类的类名@SpringBootTest(classes = Springboot04JunitApplication.class)
原因是因为测试类需要拿到容器里面的bean,容器由配置类里面的run方法创建,所以需要去找配置类。
@SpringBootTest
class Springboot04JunitApplicationTests {
//注入你要测试的对象
@Autowired
private BookDao bookDao;
@Test
void contextLoads() {
//执行要测试的对象对应的方法
bookDao.save();
System.out.println("two...");
}
}
总结
- 导入测试对应的starter
- 测试类使用@SpringBootTest修饰
- 使用自动装配的形式添加要测试的对象
- 测试类如果存在于引导类所在包或子包中无需指定引导类
- 测试类如果不存在于引导类所在的包或子包中需要通过classes属性指定引导类
4.2 整合MyBatis
MyBatis是干什么的?
SpringMVC框架负责处理浏览器发送的请求,来调用业务逻辑层来处理业务逻辑,根据需求调用持久层进行持久化操作,而这个任务就需要MyBatis来完成。
从连接数据库,到访问并且操作数据库中的数据,最终将结构返回给业务层,再由SpringMVC将结果 响应到浏览器渲染页面。 这个过程中,各个框架相互配合,共同实现一个完整的需求。
MyBatis工作时,需要哪些东西?
- 核心配置:数据库连接相关信息(连什么?连谁?什么权限)
- 映射配置:SQL映射(XML/注解)
步骤①:创建模块时勾选要使用的技术,MyBatis,由于要操作数据库,还要勾选对应数据库或者手工导入对应技术的starter,和对应数据库的坐标
<dependencies>
<!--1.导入对应的starter-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
步骤②:配置数据源相关信息,没有这个信息你连接哪个数据库都不知道
#2.配置相关信息
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_db
username: root
password: root
完了,就这么多,没了。有人就很纳闷,这就结束了?对,这就结束了,SpringBoot把配置中所有可能出现的通用配置都简化了。下面就可以写一下MyBatis程序运行需要的Dao(或者Mapper)就可以运行了
实体类
public class Book {
private Integer id;
private String type;
private String name;
private String description;
}
映射接口(Dao)
@Mapper
public interface BookDao {
@Select("select * from tbl_book where id = #{id}")
public Book getById(Integer id);
}
测试类
@SpringBootTest
class Springboot05MybatisApplicationTests {
@Autowired
private BookDao bookDao;
@Test
void contextLoads() {
System.out.println(bookDao.getById(1));
}
}
总结
-
整合操作需要勾选MyBatis技术,也就是导入MyBatis对应的starter
-
数据库连接相关信息转换成配置
-
数据库SQL映射需要添加@Mapper被容器识别到
-
MySQL 8.X驱动强制要求设置时区
- 修改url,添加serverTimezone设定
- 修改MySQL数据库配置
-
驱动类过时,提醒更换为com.mysql.cj.jdbc.Driver
4.3 整合MyBatis-Plus
- 手工添加MyBatis-Plus对应的starter
- 数据层接口使用BaseMapper简化开发
- 需要使用的第三方技术无法通过勾选确定时,需要手工添加坐标
4.4 整合Druid
- 整合Druid需要导入Druid对应的starter
- 根据Druid提供的配置方式进行配置
- 整合第三方技术通用方式
- 导入对应的starter
- 根据提供的配置格式,配置非默认值对应的配置项
5. SSMP整合综合案例
- 实体类开发————使用Lombok快速制作实体类
- Dao开发————整合MyBatisPlus,制作数据层测试
- Service开发————基于MyBatisPlus进行增量开发,制作业务层测试类
- Controller开发————基于Restful开发,使用PostMan测试接口功能
- Controller开发————前后端开发协议制作
- 页面开发————基于VUE+ElementUI制作,前后端联调,页面数据处理,页面消息处理
- 列表
- 新增
- 修改
- 删除
- 分页
- 查询
- 项目异常处理
- 按条件查询————页面功能调整、Controller修正功能、Service修正功能
0.模块创建
pom.xml
<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>
</dependency>
</dependencies>
application.yml
server:
port: 80
1.实体类开发
import lombok.Data;
@Data
public class Book {
private Integer id;
private String type;
private String name;
private String description;
}
- 实体类制作
- 使用lombok简化开发
- 导入lombok无需指定版本,由SpringBoot提供版本
- @Data注解
2.数据层开发——基础CRUD
步骤①:导入MyBatisPlus与Druid对应的starter,当然mysql的驱动不能少
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
步骤②:配置数据库连接相关的数据源配置
server:
port: 80
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
username: root
password: root
步骤③:使用MP的标准通用接口BaseMapper加速开发,别忘了@Mapper和泛型的指定
@Mapper
public interface BookDao