SpringBoot框架详细教学保姆级说明

news2024/11/17 13:23:20

目录

文章目录

    • 1.1 简介
    • 1.2 特性
    • 1.3 四大核心
  • 2 springboot入门案例
    • 2.1 SpringBoot 项目开发步骤
    • 2.2 创建一个 Spring MVC 的 Spring BootController
    • 2.3 分析
    • 2.4 核心配置文件格式
    • 2.5 Spring Boot 前端使用 JSP
  • 3 SpringBoot框架Web开发
    • 3.1 Spring Boot 集成 MyBatis
    • 3.2 DAO 的其它开发方式
    • 3.3 Spring Boot 事务支持
    • 3.4 Spring Boot 下的 Spring MVC(注解)
    • 3.5 SpringBoot实现RESTFUL
    • 3.6 Spring Boot 集成 Redis

1.1 简介

springboot是spring家族中的一个全新框架,用来简化spring程序的创建和开发过程。在以往我们通过SpringMVC+Spring+Mybatis框架进行开发的时候,我们需要配置web.xml,spring配置,mybatis配置,然后整合在一起,而springboot抛弃了繁琐的xml配置过程,采用大量默认的配置来简化我们的spring开发过程。

SpringBoot化繁为简,使开发变得更加的简单迅速。

1.2 特性

  • 能够快速创建基于spring的程序
  • 能够直接使用Java main方法启动内嵌的Tomcat服务器运行springboot程序,不需要部署war包
  • 提供约定的starter POM来简化Maven配置,让Maven的配置变得简单
  • 自动化配置,根据项目的Maven依赖配置,springboot自动配置spring、springmvc等
  • 提供了程序的健康检查功能
  • 基本可以完全不使用xml配合文件,采用注解配置

1.3 四大核心

自动配置、起步依赖、Actuator、命令行界面

2 springboot入门案例

2.1 SpringBoot 项目开发步骤

​ (1)创建一个 Module,选择类型为Spring Initializr 快速构建

img

​ (2)设置 GAV 坐标及 pom 配置信息

img

​ (3)选择 Spring Boot 版本及依赖

img

​ (4)设置模块名称、Content Root 路径及模块文件的目录,然后点击finish即可

img

​ (5)项目结构如下:

img

static:存放静态资源。如图片、CSS、JavaScript 等
templates:存放 Web 页面的模板文件
application.properties/application.yml 用于存放程序的各种依赖模块的配置信息,比如 服务端口,数据库连接配置等
.gitignore:使用版本控制工具 git 的时候,设置一些忽略提交的内容
Application.java:SpringBoot 程序执行的入口,执行该程序中的 main 方法,启动当前SpringBoot项目。

​ (6)对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"> 



 <modelVersion>4.0.0</modelVersion> 



 <!--继承 SpringBoot 框架的一个父项目,所有自己开发的 Spring Boot 都必须的继承--> 



 <parent> 



     <groupId>org.springframework.boot</groupId> 



     <artifactId>spring-boot-starter-parent</artifactId> 



     <version>2.2.1.RELEASE</version> 



     <relativePath/> <!-- lookup parent from repository --> 



 </parent> 



 



 <!--当前项目的 GAV 坐标--> 



 <groupId>com.bjpowernode.springboot</groupId> 



 <artifactId>002-springboot-springmvc</artifactId> 



 <version>1.0.0</version> 



 



 <!--maven 项目名称,可以删除--> 



 <name>002-springboot-springmvc</name> 



 <!--maven 项目描述,可以删除--> 



 <description>Demo project for Spring Boot</description> 



 



 <!--maven 属性配置,可以在其它地方通过${}方式进行引用--> 



 <properties> 



     <java.version>1.8</java.version> 



 </properties> 



 



 



 <dependencies> 



 <!--SpringBoot 框架 web 项目起步依赖,通过该依赖自动关联其它依赖,不需要我们一个一个去添加



--> 



     <dependency> 



         <groupId>org.springframework.boot</groupId> 



         <artifactId>spring-boot-starter-web</artifactId> 



     </dependency> 



 



 <!--SpringBoot 框架的测试起步依赖,例如:junit 测试,如果不需要的话可以删除--> 



     <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> 



 



 <build> 



     <plugins> 



         <!--SpringBoot提供的打包编译等插件--> 



         <plugin> 



             <groupId>org.springframework.boot</groupId> 



             <artifactId>spring-boot-maven-plugin</artifactId> 



         </plugin> 



     </plugins> 



 </build> 



</project> 

2.2 创建一个 Spring MVC 的 Spring BootController

(1)创建SpringBootController 类

注意:新创建的类一定要位于 Application 同级目录或者下级目录,否则 SpringBoot 加
载不到。

package com.bjpowernode.springboot.web; 



 



import org.springframework.stereotype.Controller; 



import org.springframework.web.bind.annotation.RequestMapping; 



import org.springframework.web.bind.annotation.ResponseBody; 



 



@Controller 



public class SpringBootController { 



 



 @RequestMapping(value = "/springBoot/say") 



 public @ResponseBody String say() { 



     return "Hello,springBoot!"; 



 } 



} 

​ (2)启动Application类中的main方法

​ 通过在控制台的输出,可以看到启动 SpringBoot 框架,会启动一个内嵌的 tomcat,端
口号为 8080,上下文根为空 。

img

​ (3)在浏览器中输入 http://localhost:8080/springBoot/say进行访问

img

2.3 分析

(1)spring-boot-starter-parent 是一个 Springboot 的父级依赖,开发 SpringBoot 程序都需

要继承该父级项目,它用来提供相关的 Maven 默认依赖,使用它之后,常用的 jar
包依赖可以省去 version 配置
(2)Spring Boot 提供了一些默认的jar 包的依赖,可查看该父级依赖的 pom 文件
(3)如果不想使用某个默认的依赖版本,可以通过 pom.xml 文件的属性配置覆盖各个
依赖项,比如覆盖 Spring 版本:

 <properties> 



     <spring-framework.version>5.0.0.RELEASE</ spring-framework.version > 



 </properties> 

​ (4) @SpringBootApplication 注解是 Spring Boot 项目的核心注解,主要作用是开启
Spring 自动配置
,如果在 Application 类上去掉该注解,那么不会启动 SpringBoot程序
​ (5)main 方法是一个标准的 Java 程序的 main 方法,是boot项目启动运行的入口
​ (6)@Controller 及 @ResponseBody 依然是我们之前的 Spring MVC,因为 Spring Boot
的里面依然是使用我们的 Spring MVC + Spring + MyBatis 等框架

2.4 核心配置文件格式

​ (1).properties 文件(默认采用该文件)

通过修改 application.properties 配置文件,修改默认 tomcat 端口号及项目上下文件根:

#设置内嵌 Tomcat 端口号 



server.port=9090 



 



#配置项目上下文根 



server.servlet.context-path=/003-springboot-port-context-path 

页面显示结果:

img

​ (2) .yml 文件 :

​ 项目名称:004-springboot-yml

​ yml 是一种 yaml 格式的配置文件,主要采用一定的空格、换行等格式排版进行配置。它能够直观的被计算机识别数据序列化格式,容易被人类阅读,yaml 类似于 xml,但是语法比 xml 简洁很多,值与前面的冒号配置项必须要有一个空格, yml 后缀也可以使用 yaml 后缀 。

img

注意:当两种格式配置文件同时存在时,使用的是.properties 配置文件。

​ (3)多环境配置(.properties方式

​ 在实际开发的过程中,我们的项目会经历很多的阶段(开发->测试->上线),每个阶段
的配置也会不同,例如:端口、上下文根、数据库等,那么这个时候为了方便在不同的环境
之间切换,SpringBoot 提供了多环境配置
,具体步骤如下 :

​ 项目名称:005-springboot-multi-environment

为每个环境创建一个配置文件,命名必须为 application-环境标识.properties|yml

img

application-dev.properties

#开发环境



 



#设置内嵌 Tomcat 默认端口号 



server.port=8080 



 



#设置项目的上下文根 



server.servlet.context-path=/005-springboot-multi-environment-dev 

*application-product.properties*

#生产环境 



 



#配置内嵌 Tomcat 默认端口号 



server.port=80 



 



#配置项目上下文根 



server.servlet.context-path=/005-springboot-multi-environment-product 

application-test.properties

#测试环境 



 



#配置内嵌 Tomcat 端口号 



server.port=8081 



 



#配置项目的上下文根 



server.servlet.context-path=/005-springboot-multi-environment-test 

在总配置文件 application.properties 进行环境的激活

#SpringBoot 的总配置文件 



 



#激活开发环境 



#spring.profiles.active=dev 



 



#激活测试环境 



#spring.profiles.active=test 



 



#激活生产环境 



spring.profiles.active=product 

​ (4)多环境配置(.yml方式

application-dev.yml

#设置开发环境配置 



 



server: 



 port: 8080 #设置 Tomcat 内嵌端口号 



 servlet: 



  context-path: /dev #设置上下文根 

*application-product.yml*

#设置生产环境配置 



 



server: 



 port: 80 



 servlet: 



  context-path: /product 

application-test.yml

#设置测试环境配置 



 



server: 



 port: 9090 



 servlet: 



  context-path: /test

在总配置文件 application.yml进行环境的激活

#springboot 总配置文件 



 



#激活开发环境 



#spring: 



# profiles: 



#  active: dev 



 



 



#激活测试环境 



#spring: 



# profiles: 



#  active: test 



 



#激活生产环境 



spring: 



 profiles: 



  active: product 

​ (5)Spring Boot 自定义配置

​ 在 SpringBoot 的核心配置文件中,除了使用内置的配置项之外,我们还可以在自定义配
置,然后采用如下注解去读取配置的属性值:

(A)@Value注解 用于逐个读取application.properties中的配置

案例演示:

(1) 在核心配置文件 applicatin.properties 中,添加两个自定义配置项 school.name 和
website。在 IDEA 中可以看到这两个属性不能被 SpringBoot 识别,背景是桔色的 :

.properties方式

img

.yml方式

#设置端口号及上下文根 



server: 



 port: 9090 



 servlet: 



  context-path: / 



 



school: 



 name: ssm 



websit: http://www.baidu.com 

​ (2)在 SpringBootController 中定义属性,并使用@Value 注解或者自定义配置值,并对其方法进行测试

@Controller 



public class SpringBootController { 



 



 @Value("${school.name}") 



 private String schoolName; 



 



 @Value("${websit}") 



 private String websit; 



 



 @RequestMapping(value = "/springBoot/config") 



 public @ResponseBody String say() { 



 return schoolName + "------" + websit; 



 } 



} 

​ (3)重新运行 Application,在浏览器中进行测试

img

(B)@ConfigurationProperties

​ **作用:**将整个文件映射成一个对象,用于自定义配置项比较多的情况 。

案例演示:

​ **(1)**在 com.abc.springboot.config 包下创建 ConfigInfo 类,并为该类加上 Component 和
ConfigurationProperties 注解,并在 ConfigurationProperties 注解中添加属性 prefix,可以区分同名配置 。

@Data



@Component 



@ConfigurationProperties(prefix = "school") 



public class ConfigInfo { 



 



 private String name; 



 



 private String websit; 



} 

(2)application.properties 配置文件

#设置内嵌 Tomcat 端口号 



server.port=9090 



 



#设置上下文根 



server.servlet.context-path=/config 



 



school.name=ssm 



school.websit=http://www.baidu.com 

​ (3)在 SpringBootController 中注入 ConfigInfo 配置类

@Autowired 



private ConfigInfo configInfo; 

​ (4)修改 SpringBootController 类中的测试方法

@RequestMapping(value = "/springBoot/config") 



public @ResponseBody String say() { 



 return configInfo.getName() + "=======" + configInfo.getWebsit(); 



} 

​ (5)重新运行 Application,在浏览器中进行测试
img

*(C)警告解决*

​ 在 ConfigInfo 类中使用了 ConfigurationProperties 注解后,IDEA 会出现一个警告,不影响程序的执行。

​ 点击 open documentnation 跳转到网页,在网页中提示需要加一个依赖,我们将这
个依赖拷贝,粘贴到 pom.xml 文件中 即可。

<!--解决使用@ConfigurationProperties 注解出现警告问题--> 



<dependency> 



  <groupId>org.springframework.boot</groupId> 



  <artifactId>spring-boot-configuration-processor</artifactId> 



  <optional>true</optional> 



</dependency> 

(D)中文乱码

如果在 SpringBoot 核心配置文件中有中文信息,会出现乱码:

  • 一般在配置文件中,不建议出现中文(注释除外)
  • 如果出现中文,可以先转化为 ASCII 码

img

2.5 Spring Boot 前端使用 JSP

​ (1)在 pom.xml 文件中配置以下依赖项

<!--引入 Spring Boot 内嵌的 Tomcat 对 JSP 的解析包,不加解析不了 jsp 页面--> 



<!--如果只是使用 JSP 页面,可以只添加该依赖--> 



<dependency> 



 <groupId>org.apache.tomcat.embed</groupId> 



 <artifactId>tomcat-embed-jasper</artifactId> 



</dependency> 



 



<!--如果要使用 servlet 必须添加该以下两个依赖--> 



<!-- servlet 依赖的 jar 包--> 



<dependency> 



 <groupId>javax.servlet</groupId> 



 <artifactId>javax.servlet-api</artifactId> 



</dependency> 



<dependency> 



 <groupId>javax.servlet.jsp</groupId> 



 <artifactId>javax.servlet.jsp-api</artifactId> 



 <version>2.3.1</version> 



</dependency> 



 



<!--如果使用 JSTL 必须添加该依赖--> 



<!--jstl 标签依赖的 jar 包 start--> 



<dependency> 



 <groupId>javax.servlet</groupId> 



 <artifactId>jstl</artifactId> 



</dependency> 

​ (2)在 pom.xml 的 build 标签中要配置以下信息
​ SpringBoot 要求 jsp 文件必须编译到指定的 META-INF/resources 目录下才能访问,否则
访问不到。其实官方已经更建议使用模板技术。

<!-- 



 SpringBoot 要求 jsp 文件必须编译到指定的 META-INF/resources 目录下才能访问,否则访问



不到。 



 其它官方已经建议使用模版技术



--> 



<resources> 



 <resource> 



     <!--源文件位置--> 



     <directory>src/main/webapp</directory> 



     <!--指定编译到 META-INF/resources,该目录不能随便写--> 



     <targetPath>META-INF/resources</targetPath> 



     <!--指定要把哪些文件编译进去,**表示 webapp 目录及子目录,*.*表示所有文件--> 



     <includes> 



         <include>**/*.*</include> 



     </includes> 



 </resource> 



</resources> 

​ (3)在 application.properties 文件配置 Spring MVC 的视图展示为jsp,这里相当于 Spring MVC 的配置。

#SpringBoot 核心配置文件 



#指定内嵌 Tomcat 端口号 



server.port=8090 



 



#配置 SpringMVC 视图解析器 



#其中:/ 表示目录为 src/main/webapp 



spring.mvc.view.prefix=/ 



spring.mvc.view.suffix=.jsp 

​ (4)在 com.abc.springboot.controller 包下创建 JspController 类

@Controller 



public class SpringBootController { 



 



 @RequestMapping(value = "/springBoot/jsp") 



 public String jsp(Model model) { 



 



     model.addAttribute("data","SpringBoot 前端使用 JSP 页面!"); 



 



 return "index"; 



 } 



} 

​ (5)在 src/main 下创建一个 webapp 目录,然后在该目录下新建index.jsp 页面

​ 注意: 如果在webapp目录下右键,没有创建jsp的选项,可以在Project Structure中指定webapp为 Web Resource Directory 。

img

​ (6)在 index.jsp 中获取 Controller 传递过来的数据

img

​ (7)重新运行 Application,通过浏览器访问测试

img

3 SpringBoot框架Web开发

通过实际代码案例进行梳理:

3.1 Spring Boot 集成 MyBatis

通过 SpringBoot +MyBatis 实现对数据库学生表的查询操作的实现步骤:

(1)创建新的数据库springboot并向表中插入数据

(2)创建一个新的 SpringBoot 的 Module

​ 创建项目的过程省略

(3)在 pom.xml 中添加相关 jar 依赖

<!--MyBatis 整合 SpringBoot 的起步依赖--> 



<dependency> 



 <groupId>org.mybatis.spring.boot</groupId> 



 <artifactId>mybatis-spring-boot-starter</artifactId> 



 <version>2.0.0</version> 



</dependency> 



 



<!--MySQL 的驱动依赖--> 



<dependency> 



 <groupId>mysql</groupId> 



 <artifactId>mysql-connector-java</artifactId> 



</dependency> 

(4)在 Springboot 的核心配置文件 application.properties 中配置数据源

#配置内嵌 Tomcat 端口号 



server.port=9090 



 



#配置项目上下文根 



server.servlet.context-path=/010-springboot-web-mybatis 



 



#配置数据库的连接信息 



#注意这里的驱动类有变化 



spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 



spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8 



 



spring.datasource.username=root 



spring.datasource.password=root

(5)开发代码(代码生成器)

使用 Mybatis 反向工程生成接口、映射文件以及实体 bean,具体步骤参见附录 1

​ (A)在 web 包下创建 StudentController 并编写代码

@Controller 



public class StudentController { 



 



 @Autowired 



 private StudentService studentService; 



 



 @RequestMapping(value = "/springBoot/student") 



 public @ResponseBody Object student() { 



 



 Student student = studentService.queryStudentById(1); 



 



 return student; 



 } 



} 

​ (B)在 service 包下创建 service 接口并编写代码

public interface StudentService { 



 



 /** 



 * 根据学生标识获取学生详情 



 * @param id 



 * @return 



 */ 



 Student queryStudentById(Integer id); 



}

​ (C)在 service.impl 包下创建 service 接口并编写代码

@Service 



public class StudentServiceImpl implements StudentService { 



 



 



 @Autowired 



 private StudentMapper studentMapper; 



 



 @Override 



 public Student queryStudentById(Integer id) { 



 return studentMapper.selectByPrimaryKey(id); 



 } 



} 

​ (D)如果在 web 中导入 service 存在报错,可以尝试进行如下配置解决
img

​ (E) 在 Mybatis 反向工程生成的 StudentMapper 接口上加一个 Mapper 注解
@Mapper 作用:mybatis 自动扫描数据持久层的映射文件及 DAO 接口的关系

@Mapper 



public interface StudentMapper { 



}

​ (F)默认情况下,Mybatis 的 xml 映射文件不会编译到 target 的 class 目录下,所
以我们需要在 pom.xml 文件中配置 resource 。

<resources> 



 <resource> 



 <directory>src/main/java</directory> 



 <includes> 



     <include>**/*.xml</include> 



 </includes> 



 </resource> 



</resources>

​ (G)启动 Application 应用,浏览器访问测试运行

img

3.2 DAO 的其它开发方式

方式一:

(A)注释掉 StudentMapper 接口上的@Mapper 注解

img

(B)在运行的主类上添加注解包扫描MapperScan(“com.abc.springboot.mapper”)

@SpringBootApplication 



@MapperScan("com.abc.springboot.mapper") 



public class Application { 

@SpringBootApplication 



//Mybatis 提供的注解:扫描数据持久层的 mapper 映谢配置文件,DAO 接口上就不用加@Mapper 



//basePackages 通常指定到数据持久层包即可 



@MapperScan(basePackages = "com.abc.springboot.mapper") 



public class Application { 

方式二:

​ 因为 SpringBoot 不能自动编译接口映射的 xml 文件,还需要手动在 pom 文件中指定,
所以有的公司直接将映射文件直接放到 resources 目录下 ,在 resources 目录下新建目录 mapper 存放映射文件,将 StudentMapper.xml 文件移到resources/mapper 目录下:

img

​ 在 application.properties 配置文件中指定映射文件的位置,这个配置只有接口和映
射文件不在同一个包的情况下,才需要指定:

# 指定 Mybatis 映射文件的路径 



mybatis.mapper-locations=classpath:mapper/*.xml 

3.3 Spring Boot 事务支持

springboot事务底层依然采用的是 Spring 本身提供的事务管理。

  • 在入口类中使用注解@EnableTransactionManagement开启事务支持
  • 在访问数据库的service方法上添加注解@Transactional即可

​ 在上述案例的基础上,通过 SpringBoot +MyBatis 实现对数据库学生表的更新操作,在 service 层的方法中构建异常,查看事务是否生效:

​ (1)在 StudentController 中添加更新学生的方法

@RequestMapping(value = "/springboot/modify") 



public @ResponseBody Object modifyStudent() { 



 



 int count = 0; 



 try { 



 Student student = new Student(); 



 student.setId(1); 



 student.setName("Jack"); 



 student.setAge(33); 



 count = studentService.modifyStudentById(student); 



 } catch (Exception e) { 



 e.printStackTrace(); 



 return "fail"; 



 } 



 



 return count; 



} 

​ (2)在 StudentService 接口中添加更新学生方法

int modifyStudentById(Student student); 

​ (3)在 StudentServiceImpl 接口实现类中对更新学生方法进行实现,并构建一个异常,同时在该方法上加@Transactional 注解。

@Override 



@Transactional //添加此注解说明该方法添加的事务管理 



public int update(Student student) { 



 



 int updateCount = studentMapper.updateByPrimaryKeySelective(student); 



 



 System.out.println("更新结果:" + updateCount); 



 



 //在此构造一个除数为 0 的异常,测试事务是否起作用 



 int a = 10/0; 



 



 return updateCount; 



} 

​ (4)在Application类上加@EnableTransactionManagement开启事务支持。

@EnableTransactionManagement 可选,但是业务方法上必须添加@Transactional 事务才生效

@SpringBootApplication 



@MapperScan(basePackages = "com.abc.springboot.mapper") 



@EnableTransactionManagement //开启事务支持(可选项,但@Transactional 必须添加) 



public class Application { 

3.4 Spring Boot 下的 Spring MVC(注解)

springboot下的springMVC主要有以下注解:

​ (1)@Controller:Spring MVC 的注解,处理 http 请求

​ (2)@RestController :@Controller 与@ResponseBody 的组合注解

​ 如果一个 Controller 类添加了@RestController,那么该 Controller 类下的所有方法都相当
于添加了@ResponseBody 注解 ,用于返回字符串或json数据。

*创建 MyRestController 类,演示@RestController 替代@Controller + @ResponseBody*

@RestController 



public class MyRestController { 



 @Autowired 



 private StudentService studentService; 



 



 @RequestMapping("/boot/stu") 



 public Object stu(){ 



 return studentService.getStudentById(1); 



 } 



} 

​ (3)@RequestMapping:支持 Get 请求,也支持 Post 请求 。
​ (4)@GetMapping :只支持 Get 请求,主要用于查询操作。

​ (5)@PostMapping:只支持Post请求,主要用于新增数据。

​ (6)@PutMapping:只支持put请求,主要用于修改数据

​ (7)@DeleteMapping:只支持delete请求,通常用与删除数据

(8)综合案例:

(A)创建一个 MVCController,里面使用上面介绍的各种注解接收不同的请求

//RestController 注解相当于加了给方法加了@ResponseBody 注解,所以是不能跳转页面的,只能返回字符串或者 json 数据 



@RestController 



public class MVCController { 



 



 @GetMapping(value = "/query") 



 public String get() { 



 return "@GetMapping 注解,通常查询时使用"; 



 } 



 



 



 @PostMapping(value = "/add") 



 public String add() { 



 return "@PostMapping 注解,通常新增时使用"; 



 } 



 



 @PutMapping(value = "/modify") 



 public String modify() { 



 return "@PutMapping 注解,通常更新数据时使用"; 



 } 



 



 @DeleteMapping(value = "/remove") 



 public String remove() { 



 return "@DeleteMapping 注解,通常删除数据时使用"; 



 } 



} 

(B)启动应用,在浏览器中输入不同的请求进行测试

img

(C)结合POSTMan工具测试其他请求类型

img

3.5 SpringBoot实现RESTFUL

(1)简介

​ 它是一种互联网软件设计的风格,它只是提出了一组客户端和服务器交互时的架构理念和设计原则,基于这种理念和原则设计的接口可以更简洁,更有层次。

比如我们要访问一个 http 接口:http://localhost:8080/boot/order?id=1021&status=1
采用 RESTFul 风格则 http 地址为:http://localhost:8080/boot/order/1021/1

(2)开发RESTFUL,主要用到以下注解:

  • **@PathVariable :获取 url 中的数据,*该注*解是实现 RESTFul 最主要的一个注解

  • @PostMapping :接收和处理post方式的请求

  • @DeleteMapping:接收delete方式的请求,可以用GetMapping代替

  • @PutMapping :接收put方式的请求,可以用 PostMapping 代替

  • @GetMapping :接收get方式请求

    (3)案例:使用 RESTful 风格模拟实现对学生的增删改查操作

该项目集成了 MyBatis、spring、SpringMVC,通过模拟实现对学生的增删改查操作

pom.xml文件

<dependencies> 



 <!--SpringBoot 框架 web 项目起步依赖--> 



 <dependency> 



     <groupId>org.springframework.boot</groupId> 



     <artifactId>spring-boot-starter-web</artifactId> 



 </dependency> 



 



 <!--MyBatis 集成 SpringBoot 框架起步依赖--> 



 <dependency> 



     <groupId>org.mybatis.spring.boot</groupId> 



     <artifactId>mybatis-spring-boot-starter</artifactId> 



     <version>2.0.1</version> 



 </dependency> 



 <!--MySQL 驱动--> 



 <dependency> 



     <groupId>mysql</groupId> 



     <artifactId>mysql-connector-java</artifactId> 



 </dependency> 



</dependencies> 



 



<build> 



 <!--指定配置资源的位置--> 



 <resources> 



     <resource> 



         <directory>src/main/java</directory> 



         <includes> 



             <include>**/*.xml</include> 



         </includes> 



     </resource> 



 </resources> 



 



 <plugins> 



     <!--mybatis 代码自动生成插件--> 



     <plugin> 



         <groupId>org.mybatis.generator</groupId> 



         <artifactId>mybatis-generator-maven-plugin</artifactId> 



         <version>1.3.6</version> 



         <configuration> 



             <!--配置文件的位置--> 



             <configurationFile>GeneratorMapper.xml</configurationFile> 



             <verbose>true</verbose> 



             <overwrite>true</overwrite> 



         </configuration> 



     </plugin> 



 



     <plugin> 



         <groupId>org.springframework.boot</groupId> 



         <artifactId>spring-boot-maven-plugin</artifactId> 



     </plugin> 



 </plugins> 



</build> 

application. properties核心配置文件

#配置内嵌 Tomcat 端口号 



server.port=8090 



 



#配置项目上下文根 



server.servlet.context-path=/



 



#配置数据库的连接信息 



#注意这里的驱动类有变化 



spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 



spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8 



 



spring.datasource.username=root 



spring.datasource.password=root

通过逆向工程生成 DAO

img

创建 RESTfulController

@RestController 



public class RESTfulController { 



 



 /** 



 * 添加学生 



 * 请求地址:



http://localhost:9090/014-springboot-restful/springBoot/student/wangpeng/23 



 * 请求方式:POST 



 * @param name 



 * @param age 



 * @return 



 */ 



 @PostMapping(value = "/springBoot/student/{name}/{age}") 



 public Object addStudent(@PathVariable("name") String name, @PathVariable("age") Integer age) { 



 



 Map<String,Object> retMap = new HashMap<String, Object>(); 



 retMap.put("name",name); 



 retMap.put("age",age); 



 



 



 return retMap; 



 } 



 



 /** 



 * 删除学生 



 * 请求地址:



http://localhost:9090/014-springboot-restful/springBoot/student/1 



 * 请求方式:Delete 



 * @param id 



 * @return 



 */ 



 @DeleteMapping(value = "/springBoot/student/{id}") 



 public Object removeStudent(@PathVariable("id") Integer id) { 



 



 return "删除的学生 id 为:" + id; 



 } 



 



 /** 



 * 修改学生信息 



 * 请求地址:



http://localhost:9090/014-springboot-restful/springBoot/student/2 



 * 请求方式:Put 



 * @param id 



 * @return 



 */ 



 @PutMapping(value = "/springBoot/student/{id}") 



 public Object modifyStudent(@PathVariable("id") Integer id) { 



 



 return "修改学生的 id 为" + id; 



 } 



 



 @GetMapping(value = "/springBoot/student/{id}") 



 public Object queryStudent(@PathVariable("id") Integer id) { 



 



 return "查询学生的 id 为" + id; 



 } 



} 

使用 Postman 模拟发送请求,进行测试 :
img

img

img

img

​ (4)请求冲突的问题

解决方案:<1>修改路径 <2>修改请求方式

创建 RESTfulController 类,结合 Postman 进行测试说明 :

@RestController 



public class RESTfulController { 



 



 /** 



 * id:订单标识 



 * status:订单状态 



 * 请求路径:



http://localhost:9090/015-springboot-restful-url-conflict/springBoot/orde



r/1/1001 



 * @param id 



 * @param status 



 * @return 



 */ 



 @GetMapping(value = "/springBoot/order/{id}/{status}") 



 public Object queryOrder(@PathVariable("id") Integer id, @PathVariable("status") Integer status) { 



 



 Map<String,Object> map = new HashMap<String,Object>(); 



 



 map.put("id",id); 



 map.put("status",status); 



 



 return map; 



 } 



 



 /** 



 * id:订单标识 



 * status:订单状态 



 * 请求路径:



http://localhost:9090/015-springboot-restful-url-conflict/springBoot/1/or



der/1001 



 * @param id 



 * @param status 



 



 * @return 



 */ 



 @GetMapping(value = "/springBoot/{id}/order/{status}") 



 public Object queryOrder1(@PathVariable("id") Integer id, @PathVariable("status") Integer status) { 



 Map<String,Object> map = new HashMap<String,Object>(); 



 



 map.put("id",id); 



 map.put("status",status); 



 



 return map; 



 } 



 



 /** 



 * id:订单标识 



 * status:订单状态 



 * 请求路径:



http://localhost:9090/015-springboot-restful-url-conflict/springBoot/1001



/order/1 



 * @param id 



 * @param status 



 * @return 



 */ 



 @GetMapping(value = "/springBoot/{status}/order/{id}") 



 public Object queryOrder2(@PathVariable("id") Integer id, 



 @PathVariable("status") Integer status) { 



 Map<String,Object> map = new HashMap<String,Object>(); 



 



 map.put("id",id); 



 map.put("status",status); 



 



 return map; 



 } 



 



 /** 



 * id:订单标识 



 * status:订单状态 



 * 请求路径:



http://localhost:9090/015-springboot-restful-url-conflict/springBoot/1001



/order/1 



 * @param id 



 * @param status 



 * @return 



 */ 



 



 



 @PostMapping(value = "/springBoot/{status}/order/{id}") 



 public Object queryOrder3(@PathVariable("id") Integer id,  @PathVariable("status") Integer status) { 



 Map<String,Object> map = new HashMap<String,Object>(); 



 



 map.put("id",id); 



 map.put("status",status); 



 



 return map; 



 } 



 



 



 



 



 /** 



 * query1 和 query2 两个请求路径会发生请求路径冲突问题 



 * query3 与 query1 和 query2 发生请求冲突 



 * 注意:虽然两个路径写法改变了,但是由于传递的两个参数都是 int 值,所以不知道该交给



哪个请求进行处理 



 * 就会出现匹配模糊不清的异常,所以要想解决冲突,有两种方式: 



 * 1.修改请求路径 



 * 2.修改请求方式 



 */ 



} 

​ (5)RESTful 原则

  • 增 post 请求、删 delete 请求、改 put 请求、查 get 请求
  • 请求路径不要出现动词:

img

  • 分页、排序等操作,不需要使用斜杠传参数

img

3.6 Spring Boot 集成 Redis

​ 完善根据学生 id 查询学生的功能:先从 redis 缓存中查找,如果找不到,再从数据库中
查找,然后放到 redis 缓存中。

具体实现步骤:

(A)首先通过 MyBatis 逆向工程生成实体 bean 和数据持久层 :

img

(B)在 pom.xml 文件中添加 redis 依赖

<!-- 加载 spring boot redis 包 --> 



<dependency> 



 <groupId>org.springframework.boot</groupId> 



 <artifactId>spring-boot-starter-data-redis</artifactId> 



</dependency> 

(C)Spring Boot 核心配置文件application.properties 如下:

#配置内嵌 Tomcat 端口号 



server.port=9090 



 



#配置项目上下文根 



server.servlet.context-path=/016-springboot-redis 



 



#配置连接 MySQL 数据库信息 



spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=UTF8&useJDBCCompliantTimezoneShift=true&useLegacyDa



tetimeCode=false&serverTimezone=GMT%2B8 



spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 



spring.datasource.username=root 



spring.datasource.password=root



 



#配置 redis 连接信息 



spring.redis.host=127.0.0.1 



spring.redis.port=6379 



#spring.redis.password=root

(D)启动redis服务img

(E)RedisController类

@RestController 



public class RedisController { 



 



 @Autowired 



 private StudentService studentService; 



 



 /** 



 * 请求地址:



http://localhost:9090/016-springboot-redis//springboot/allStudentCount 



 * @param request 



 * @return 



 */ 



 @GetMapping(value = "/springboot/allStudentCount") 



 public Object allStudentCount(HttpServletRequest request) { 



 



 Long allStudentCount = studentService.queryAllStudentCount(); 



 



 return "学生总人数:" + allStudentCount; 



 } 



} 

(F)StudentService 接口

public interface StudentService { 



 



 /** 



 * 获取学生总人数 



 * @return 



 */ 



 Long queryAllStudentCount(); 



} 

(G)在 StudentServiceImpl 中注入 RedisTemplate,并编写根据 id获取学生的方法

​ 配置了上面的步骤,Spring Boot 将自动配置 RedisTemplate,在需要操作 redis 的类中注入 redisTemplate 即可。
​ 注意:Spring Boot 帮我们注入 RedisTemplate 类,泛型里面只能写 <String, String>、<Object, Object>或者什么都不写。

@Service 



public class StudentServiceImpl implements StudentService { 



 



 @Autowired 



 private StudentMapper studentMapper; 



 



 @Autowired 



 private RedisTemplate<Object,Object> redisTemplate; 



 



 @Override 



 public Long queryAllStudentCount() { 



 



 //设置 redisTemplate 对象 key 的序列化方式 



 redisTemplate.setKeySerializer(new StringRedisSerializer()); 



 



 //从 redis 缓存中获取总人数 



 Long allStudentCount = (Long) redisTemplate.opsForValue().get("allStudentCount"); 



 //判断是否为空 



 if ( allStudentCount==null) { 



 //去数据库查询,并存放到 redis 缓存中 



 



 allStudentCount = studentMapper.selectAllStudentCount(); 



 



redisTemplate.opsForValue().set("allStudentCount",allStudentCount,15,TimeUnit.SECONDS); 



 } 



 return allStudentCount; 



 } 



} 

(H)StudentMapper 接口

@Mapper



public interface StudentMapper {



 /** 



 * 获取学生总人数 



 * @return 



 */ 



 Long selectAllStudentCount(); 



}

(I)StudentMapper 映射文件

<!--获取学生总人数--> 



<select id="selectAllStudentCount" resultType="java.lang.Long"> 



 select count(*) from  t_student 



</select> 

(J)启动类 Application

在 SpringBoot 启动类上添加扫描数据持久层的注解并指定扫描包:

@SpringBootApplication 



@MapperScan(basePackages = "com.abc.springboot.mapper")//扫描数据持久层 



public class Application { 



 



 public static void main(String[] args) { 



 SpringApplication.run(Application.class, args); 



 } 



 



} 

(K)让 Student 类实现序列化接口(可选)

在类名上 Alt + 回车,如果没有提示生成序列化 id,那么需要做如下的配置 :

img

img

(L)启动 SpringBoot 应用,访问测试

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/22606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

D. Make It Round(math)

Problem - D - Codeforces 在Berlandia发生了通货膨胀&#xff0c;所以商店需要改变商品的价格。 商品n的当前价格已经给出。允许将该商品的价格提高k倍&#xff0c;1≤k≤m&#xff0c;k为整数。输出商品的最圆的可能的新价格。也就是在最后有最大数量的零的那个。 例如&…

开发工程师的面经

目录1. static关键字2. 多态是什么&#xff1f;3. ArrayList和LinkList的区别区别ArrayList的扩容机制4. Java是编译型还是解释型&#xff1f;5. 什么是编译&#xff1f;什么是解释&#xff1f;6. String str“abc” 和 String str new String(“abc”)的区别&#xff1f;7. i…

C\C++刷题ADY3

题目来源&#xff1a;力扣 1.第一题 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 思路分析:&#xff08;不带哨兵位的头节点&#xff09; 每次去分析一个节点&#xff0c; 如果节点不是存的是6&#xff0c;就拿节点来尾插 如果节点存的不是6&#xff0c;就把节…

计算机毕业设计ssm+vue基本微信小程序的“香草屋”饮料奶茶点单小程序

项目介绍 随着社会的发展,互联网的迅速发展,5G时代的到来,智能手机的普及,人们的生活方式更加智能一体化,衣食住行也越来越简单快捷,人们的生活也更加趋向于智能化,一台智能手机可以解决生活中的各种难题。为了使人们的生活更加方便,于是各种生活小程序普遍产生, 随着微信小程序…

记一次 .NET 某自动化采集软件 崩溃分析

一&#xff1a;背景 1.讲故事 前段时间有位朋友找到我&#xff0c;说他的程序在客户的机器上跑着跑着会出现偶发卡死&#xff0c;然后就崩掉了&#xff0c;但在本地怎么也没复现&#xff0c;dump也抓到了&#xff0c;让我帮忙看下到底怎么回事&#xff0c;其实崩溃类的dump也…

java项目-第155期ssm班级同学录网站-java毕业设计_计算机毕业设计

java项目-第155期ssm班级同学录网站-java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm班级同学录网站》 该项目分为2个角色&#xff0c;管理员、用户。 用户可以浏览前台,包含功能有&#xff1a; 首页、公告信息、校友风采、论坛信息&#xff0c;用…

vue项目中使用 NProgress 进度加载插件

场景&#xff1a;每次进入页面时&#xff0c;页面顶部都有一个加载条 下来说下这个效果怎么实现的 第一步&#xff1a;下载 NProgress 插件 npm install --save nprogress 第二步&#xff1a;导入 nprogress 并配置 切记&#xff1a;NP 都必须是大写 我是在路由页面中导入的 im…

搜索引擎项目开发过程以及重难点整理

目录认识搜索引擎搜索的核心思路倒排索引介绍项目简介模块管理构建索引模块数据库设计正排索引倒排索引程序入口类Indexer类扫描文档子模块FileScanner类构建文档子模块构建标题parseTitle方法构建urlparseUrl方法构建内容parseContent方法构建正排索引子模块正排索引实体类map…

Nginz静态资源缓存

缓存 缓存&#xff08;cache&#xff09;&#xff0c;原始意义是指访问速度比一般随机存取存储器&#xff08;RAM&#xff09;快的一种高速存储器&#xff0c;通常它不像系统主存那样使用DRAM技术&#xff0c;而使用昂贵但较快速的SRAM技术。缓存的设置是所有现代计算机系统发…

【前端-TypeScript】TypeScript学习思维导图-一图看完《TypeScript编程》

目录前言文章已收录至https://lichong.work&#xff0c;转载请注明原文链接。 ps&#xff1a;欢迎关注公众号“Fun肆编程”或添加我的私人微信交流经验&#x1f91d; 前言 现在&#xff0c;TypeScript 正在逐渐成为与前端框架以及 ES6 语法同一地位的基础工具&#xff0c;更多…

计算机毕业设计node+vue基于微信小程序的西餐外卖系统 uniapp 小程序

项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,西餐外卖系统就是信息时代变革中的产物之一。 任何系统都要遵循系统…

力扣每日一题:808. 分汤 【dp动态规划】

有 A 和 B 两种类型 的汤。一开始每种类型的汤有 n 毫升。有四种分配操作&#xff1a; 提供 100ml 的 汤A 和 0ml 的 汤B 。提供 75ml 的 汤A 和 25ml 的 汤B 。提供 50ml 的 汤A 和 50ml 的 汤B 。提供 25ml 的 汤A 和 75ml 的 汤B 。 当我们把汤分配给某人之后&#xff0c;汤…

CentOS8 安装 erlang 和 RabbitMQ

哈喽大家好&#xff0c;我是阿Q&#xff01; 最近正好用到了消息队列中的 RabbitMQ ,今天就先来个前味菜&#xff0c;总结一下它在 centos 内的安装。 环境&#xff1a;CentOS 8.0 64位 安装erlang 由于 rabbitmq 是基于 erlang 语言开发的&#xff0c;所以必须先安装 erlang…

大数据项目之电商数仓、日志采集Flume、source、channel、 sink、Kafka的三个架构

文章目录4. 用户行为数据采集模块4.3 日志采集Flume4.3.1 Kafka的三个架构4.3.1.1 source4.3.1.2 channel4.3.1.3 sink4.3.1.4 kafka source4.3.1.5 kafka sink4.3.1.6 kafka channel4.3.1.6.1 第一个结构4.3.1.6.2 第二个结构4.3.1.6.3 第三个结构4. 用户行为数据采集模块 4.…

CentOS7 离线部署 Python 项目

1.前言 主要过程如下&#xff1a; &#xff08;1&#xff09;创建项目环境&#xff0c;生成requirements.txt文件。&#xff08;如果已有可跳出&#xff09; &#xff08;2&#xff09;新建一个跟目标机器一样的操作系统&#xff0c;python环境的测试服务器&#xff0c;并下载…

【考研英语语法】名词性从句

0 导言 名词性从句&#xff0c;是指一个句子相当于名词来使用&#xff0c;放到另外一个句子中。通常情况下&#xff0c;名词在句子中主要作四种成分&#xff1a;宾语、表语、主语、同位语。因此&#xff0c;名词性从句就分成四种&#xff1a;宾语从句、表语从句、主语从句、同…

迅为iTOP3568开发板Android11获取root权限关闭selinux

本文档所需资料在网盘资料“iTOP-3568 开发板\02_【iTOP-RK3568 开发板】开发资料\ 06_Android 系统开发配套资料\02_Android11 获取 root 权限配套资料”目录下。本文档参考瑞 芯微官方文档&#xff0c;在源码“Android11/rk_android11.0_sdk/RKDocs/android/patches/root”目…

SpringBoot整合Swagger2

整合Swagger2 1.Swagger介绍 前后端分离开发模式中&#xff0c;api文档是最好的沟通方式。 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 1、及时性 (接口变更后&#xff0c;能够及时准确地通知相关前后端开发人员)…

Kubernetes云原生实战00 何为云原生?

大家好&#xff0c;我是飘渺。 从今天开始我将开启第二个专栏系列&#xff0c;即 Kubernetes云原生实战 何为云原生 都2022年了&#xff0c;我相信各位肯定听过 云原生 这个词&#xff0c;但是究竟什么是云原生&#xff0c;却很少有人能真正说清楚。 如果找资料来看&#x…

广通远驰亮相2022 C-V2X“四跨”(苏州)应用示范活动

2022年11月3-4日&#xff0c;2022 C-V2X“四跨”&#xff08;苏州&#xff09;先导应用示范活动在苏州举办&#xff0c;9家国内外整车企业、22家终端企业、9家芯片模组企业、7家信息安全企业共计23个车队、47家单位参与活动演示。 深圳市广通远驰科技有限公司&#xff08;以下简…