定制开发生产管理软件推荐,重庆网站优化排名,网站网站开发需要多少钱,iis7 网站打不开一、SpringBoot概述
1. 简介 springboot是spring家族中的一个全新框架#xff0c;用来简化spring程序的创建和开发过程。在以往我们通过SpringMVCSpringMybatis框架进行开发的时候#xff0c;我们需要配置web.xml#xff0c;spring配置#xff0c;mybatis配置#xff0c;…一、SpringBoot概述
1. 简介 springboot是spring家族中的一个全新框架用来简化spring程序的创建和开发过程。在以往我们通过SpringMVCSpringMybatis框架进行开发的时候我们需要配置web.xmlspring配置mybatis配置然后整合在一起而springboot抛弃了繁琐的xml配置过程采用大量默认的配置来简化我们的spring开发过程。 SpringBoot化繁为简使开发变得更加的简单迅速。
2. 特性
(1) 能够快速创建基于spring的程序
(2) 能够直接使用Java main方法启动内嵌的Tomcat服务器运行springboot程序不需要部署war包
(3) 提供约定的starter POM来简化Maven配置让Maven的配置变得简单
(4) 自动化配置根据项目的Maven依赖配置springboot自动配置spring、springmvc等
(5) 提供了程序的健康检查功能
(6) 基本可以完全不使用xml配合文件采用注解配置 3. 四大核心
自动配置、起步依赖、Actuator、命令行界面
二、springboot入门案例
1. SpringBoot 项目开发步骤 1创建一个 Module选择类型为Spring Initializr 快速构建 2设置 GAV 坐标及 pom 配置信息 3选择 Spring Boot 版本及依赖 4设置模块名称、Content Root 路径及模块文件的目录然后点击finish即可 5项目结构如下 static存放静态资源。如图片、CSS、JavaScript 等 templates存放 Web 页面的模板文件 application.properties/application.yml 用于存放程序的各种依赖模块的配置信息比如 服务端口数据库连接配置等.gitignore使用版本控制工具 git 的时候设置一些忽略提交的内容 Application.javaSpringBoot 程序执行的入口执行该程序中的 main 方法启动当前SpringBoot项目。 6对pom.xml文件进行解释
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0
xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion !--继承 SpringBoot 框架的一个父项目所有自己开发的 Spring Boot 都必须的继承-- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.2.1.RELEASE/version relativePath/ !-- lookup parent from repository -- /parent !--当前项目的 GAV 坐标-- groupIdcom.bjpowernode.springboot/groupId artifactId002-springboot-springmvc/artifactId version1.0.0/version !--maven 项目名称可以删除-- name002-springboot-springmvc/name !--maven 项目描述可以删除-- descriptionDemo project for Spring Boot/description !--maven 属性配置可以在其它地方通过${}方式进行引用-- properties java.version1.8/java.version /properties dependencies !--SpringBoot 框架 web 项目起步依赖通过该依赖自动关联其它依赖不需要我们一个一个去添加
-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !--SpringBoot 框架的测试起步依赖例如junit 测试如果不需要的话可以删除-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope exclusions exclusion groupIdorg.junit.vintage/groupId artifactIdjunit-vintage-engine/artifactId /exclusion /exclusions /dependency /dependencies build plugins !--SpringBoot提供的打包编译等插件-- plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build
/project 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上下文根为空 。 3在浏览器中输入 http://localhost:8080/springBoot/say进行访问
3. 分析 1spring-boot-starter-parent 是一个 Springboot 的父级依赖开发 SpringBoot 程序都需 要继承该父级项目它用来提供相关的 Maven 默认依赖使用它之后常用的 jar 包依赖可以省去 version 配置 2Spring Boot 提供了一些默认的jar 包的依赖可查看该父级依赖的 pom 文件 3如果不想使用某个默认的依赖版本可以通过 pom.xml 文件的属性配置覆盖各个 依赖项比如覆盖 Spring 版本 properties spring-framework.version5.0.0.RELEASE/ spring-framework.version /properties 4 SpringBootApplication 注解是 Spring Boot 项目的核心注解主要作用是开启 Spring 自动配置如果在 Application 类上去掉该注解那么不会启动 SpringBoot程序 5main 方法是一个标准的 Java 程序的 main 方法是boot项目启动运行的入口 6Controller 及 ResponseBody 依然是我们之前的 Spring MVC因为 Spring Boot 的里面依然是使用我们的 Spring MVC Spring MyBatis 等框架
4. 核心配置文件格式 1.properties 文件默认采用该文件
通过修改 application.properties 配置文件修改默认 tomcat 端口号及项目上下文件根
#设置内嵌 Tomcat 端口号
server.port9090 #配置项目上下文根
server.servlet.context-path/003-springboot-port-context-path 页面显示结果 2 .yml 文件 项目名称004-springboot-yml yml 是一种 yaml 格式的配置文件主要采用一定的空格、换行等格式排版进行配置。它能够直观的被计算机识别数据序列化格式容易被人类阅读yaml 类似于 xml但是语法比 xml 简洁很多值与前面的冒号配置项必须要有一个空格 yml 后缀也可以使用 yaml 后缀 。 注意当两种格式配置文件同时存在时使用的是.properties 配置文件。 3多环境配置.properties方式 在实际开发的过程中我们的项目会经历很多的阶段开发-测试-上线每个阶段 的配置也会不同例如端口、上下文根、数据库等那么这个时候为了方便在不同的环境 之间切换SpringBoot 提供了多环境配置具体步骤如下
为每个环境创建一个配置文件命名必须为 application-环境标识.properties|yml application-dev.properties (开发环境核心置文件)
#开发环境
#设置内嵌 Tomcat 默认端口号
server.port8080 #设置项目的上下文根
server.servlet.context-path/005-springboot-multi-environment-dev
application-product.properties (生产环境核心置文件)
#生产环境 #配置内嵌 Tomcat 默认端口号
server.port80 #配置项目上下文根
server.servlet.context-path/005-springboot-multi-environment-product application-test.properties (测试环境核心置文件)
#测试环境 #配置内嵌 Tomcat 端口号
server.port8081 #配置项目的上下文根
server.servlet.context-path/005-springboot-multi-environment-test 在总配置文件 application.properties 进行环境的激活
#SpringBoot 的总配置文件 #激活开发环境
#spring.profiles.activedev #激活测试环境
#spring.profiles.activetest #激活生产环境
spring.profiles.activeproduct 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 5Spring Boot 自定义配置 在 SpringBoot 的核心配置文件中除了使用内置的配置项之外我们还可以在自定义配 置然后采用如下注解去读取配置的属性值 AValue注解 用于逐个读取application.properties中的配置 案例演示 1 在核心配置文件 applicatin.properties 中添加两个自定义配置项 school.name 和 website。在 IDEA 中可以看到这两个属性不能被 SpringBoot 识别背景是桔色的
.properties方式 .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在浏览器中进行测试 BConfigurationProperties 作用将整个文件映射成一个对象用于自定义配置项比较多的情况 。 案例演示 1在 com.abc.springboot.config 包下创建 ConfigInfo 类并为该类加上 Component 和 ConfigurationProperties 注解并在 ConfigurationProperties 注解中添加属性 prefix可以区分同名配置 。
Data
Component
ConfigurationProperties(prefix school)
public class ConfigInfo { private String name; private String websit;
} 2application.properties 配置文件
#设置内嵌 Tomcat 端口号
server.port9090 #设置上下文根
server.servlet.context-path/config school.namessm
school.websithttp://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在浏览器中进行测试 C警告解决 在 ConfigInfo 类中使用了 ConfigurationProperties 注解后IDEA 会出现一个警告不影响程序的执行。 点击 open documentnation 跳转到网页在网页中提示需要加一个依赖我们将这 个依赖拷贝粘贴到 pom.xml 文件中 即可。
!--解决使用ConfigurationProperties 注解出现警告问题--
dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-configuration-processor/artifactId optionaltrue/optional
/dependency D中文乱码 如果在 SpringBoot 核心配置文件中有中文信息会出现乱码
一般在配置文件中不建议出现中文注释除外 如果出现中文可以先转化为 ASCII 码 2.5 Spring Boot 前端使用 JSP 1在 pom.xml 文件中配置以下依赖项
!--引入 Spring Boot 内嵌的 Tomcat 对 JSP 的解析包不加解析不了 jsp 页面-- !--如果只是使用 JSP 页面可以只添加该依赖-- dependency groupIdorg.apache.tomcat.embed/groupId artifactIdtomcat-embed-jasper/artifactId /dependency !--如果要使用 servlet 必须添加该以下两个依赖-- !-- servlet 依赖的 jar 包-- dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId /dependency dependency groupIdjavax.servlet.jsp/groupId artifactIdjavax.servlet.jsp-api/artifactId version2.3.1/version /dependency !--如果使用 JSTL 必须添加该依赖-- !--jstl 标签依赖的 jar 包 start-- dependency groupIdjavax.servlet/groupId artifactIdjstl/artifactId /dependency 2在 pom.xml 的 build 标签中要配置以下信息 SpringBoot 要求 jsp 文件必须编译到指定的 META-INF/resources 目录下才能访问否则 访问不到。其实官方已经更建议使用模板技术。
!-- SpringBoot 要求 jsp 文件必须编译到指定的 META-INF/resources 目录下才能访问否则访问 不到。 其它官方已经建议使用模版技术 -- resources resource !--源文件位置-- directorysrc/main/webapp/directory !--指定编译到 META-INF/resources该目录不能随便写-- targetPathMETA-INF/resources/targetPath !--指定要把哪些文件编译进去**表示 webapp 目录及子目录*.*表示所有文件-- includes include**/*.*/include /includes /resource /resources 3在 application.properties 文件配置 Spring MVC 的视图展示为jsp这里相当于 Spring MVC 的配置。
#SpringBoot 核心配置文件 #指定内嵌 Tomcat 端口号 server.port8090 #配置 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 。 6在 index.jsp 中获取 Controller 传递过来的数据 7重新运行 Application通过浏览器访问测试
3 SpringBoot框架Web开发 通过实际代码案例进行梳理 3.1 Spring Boot 集成 MyBatis 通过 SpringBoot MyBatis 实现对数据库学生表的查询操作的实现步骤
1创建新的数据库springboot并向表中插入数据
2创建一个新的 SpringBoot 的 Module 创建项目的过程省略
3在 pom.xml 中添加相关 jar 依赖
!--MyBatis 整合 SpringBoot 的起步依赖-- dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.0.0/version /dependency !--MySQL 的驱动依赖-- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId /dependency 4在 Springboot 的核心配置文件 application.properties 中配置数据源
#配置内嵌 Tomcat 端口号 server.port9090 #配置项目上下文根 server.servlet.context-path/010-springboot-web-mybatis #配置数据库的连接信息 #注意这里的驱动类有变化 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver spring.datasource.urljdbc:mysql://localhost:3306/springboot?useUnicodetruecharacterEncodingUTF-8useJDBCCompliantTimezoneShifttrueuseLegacyDatetimeCodefalseserverTimezoneGMT%2B8 spring.datasource.usernameroot spring.datasource.passwordroot 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 存在报错可以尝试进行如下配置解决 E 在 Mybatis 反向工程生成的 StudentMapper 接口上加一个 Mapper 注解 Mapper 作用mybatis 自动扫描数据持久层的映射文件及 DAO 接口的关系
Mapper public interface StudentMapper { } F默认情况下Mybatis 的 xml 映射文件不会编译到 target 的 class 目录下所 以我们需要在 pom.xml 文件中配置 resource 。
resources resource directorysrc/main/java/directory includes include**/*.xml/include /includes /resource /resources G启动 Application 应用浏览器访问测试运行 3.2 DAO 的其它开发方式 方式一
A注释掉 StudentMapper 接口上的Mapper 注解
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 目录下 在 application.properties 配置文件中指定映射文件的位置这个配置只有接口和映 射文件不在同一个包的情况下才需要指定
# 指定 Mybatis 映射文件的路径 mybatis.mapper-locationsclasspath: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主要有以下注解 1ControllerSpring MVC 的注解处理 http 请求 2RestController 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); } } 3RequestMapping支持 Get 请求也支持 Post 请求 。 4GetMapping 只支持 Get 请求主要用于查询操作。 5PostMapping只支持Post请求主要用于新增数据。 6PutMapping只支持put请求主要用于修改数据 7DeleteMapping只支持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启动应用在浏览器中输入不同的请求进行测试 C结合POSTMan工具测试其他请求类型 3.5 SpringBoot实现RESTFUL 1简介 它是一种互联网软件设计的风格它只是提出了一组客户端和服务器交互时的架构理念和设计原则基于这种理念和原则设计的接口可以更简洁更有层次。
比如我们要访问一个 http 接口http://localhost:8080/boot/order?id1021status1 采用 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 groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !--MyBatis 集成 SpringBoot 框架起步依赖-- dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.0.1/version /dependency !--MySQL 驱动-- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId /dependency /dependencies build !--指定配置资源的位置-- resources resource directorysrc/main/java/directory includes include**/*.xml/include /includes /resource /resources plugins !--mybatis 代码自动生成插件-- plugin groupIdorg.mybatis.generator/groupId artifactIdmybatis-generator-maven-plugin/artifactId version1.3.6/version configuration !--配置文件的位置-- configurationFileGeneratorMapper.xml/configurationFile verbosetrue/verbose overwritetrue/overwrite /configuration /plugin plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build application. properties核心配置文件
#配置内嵌 Tomcat 端口号 server.port8090 #配置项目上下文根 server.servlet.context-path/ #配置数据库的连接信息 #注意这里的驱动类有变化 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver spring.datasource.urljdbc:mysql://localhost:3306/springboot?useUnicodetruecharacterEncodingUTF-8useJDBCCompliantTimezoneShifttrueuseLegacyDatetimeCodefalseserverTimezoneGMT%2B8 spring.datasource.usernameroot spring.datasource.passwordroot 通过逆向工程生成 DAO
创建 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) { MapString,Object retMap new HashMapString, 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 模拟发送请求进行测试 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) { MapString,Object map new HashMapString,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) { MapString,Object map new HashMapString,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) { MapString,Object map new HashMapString,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) { MapString,Object map new HashMapString,Object(); map.put(id,id); map.put(status,status); return map; } /** * query1 和 query2 两个请求路径会发生请求路径冲突问题 * query3 与 query1 和 query2 发生请求冲突 * 注意虽然两个路径写法改变了但是由于传递的两个参数都是 int 值所以不知道该交给 哪个请求进行处理 * 就会出现匹配模糊不清的异常所以要想解决冲突有两种方式 * 1.修改请求路径 * 2.修改请求方式 */ } 5RESTful 原则
增 post 请求、删 delete 请求、改 put 请求、查 get 请求 请求路径不要出现动词 分页、排序等操作不需要使用斜杠传参数
3.6 Spring Boot 集成 Redis 完善根据学生 id 查询学生的功能先从 redis 缓存中查找如果找不到再从数据库中 查找然后放到 redis 缓存中。
具体实现步骤
A首先通过 MyBatis 逆向工程生成实体 bean 和数据持久层
B在 pom.xml 文件中添加 redis 依赖
!-- 加载 spring boot redis 包 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency CSpring Boot 核心配置文件application.properties 如下
#配置内嵌 Tomcat 端口号 server.port9090 #配置项目上下文根 server.servlet.context-path/016-springboot-redis #配置连接 MySQL 数据库信息 spring.datasource.urljdbc:mysql://127.0.0.1:3306/springbootuseUnicodetruecharacterEncodingUTF8useJDBCCompliantTimezoneShifttrueuseLegacyDa tetimeCodefalseserverTimezoneGMT%2B8 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver spring.datasource.usernameroot spring.datasource.passwordroot #配置 redis 连接信息 spring.redis.host127.0.0.1 spring.redis.port6379 #spring.redis.passwordroot D启动redis服务 ERedisController类
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; } } FStudentService 接口
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 RedisTemplateObject,Object redisTemplate; Override public Long queryAllStudentCount() { //设置 redisTemplate 对象 key 的序列化方式 redisTemplate.setKeySerializer(new StringRedisSerializer()); //从 redis 缓存中获取总人数 Long allStudentCount (Long) redisTemplate.opsForValue().get(allStudentCount); //判断是否为空 if ( allStudentCountnull) { //去数据库查询并存放到 redis 缓存中 allStudentCount studentMapper.selectAllStudentCount(); redisTemplate.opsForValue().set(allStudentCount,allStudentCount,15,TimeUnit.SECONDS); } return allStudentCount; } } HStudentMapper 接口
Mapper public interface StudentMapper { /** * 获取学生总人数 * return */ Long selectAllStudentCount(); } IStudentMapper 映射文件
!--获取学生总人数-- select idselectAllStudentCount resultTypejava.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那么需要做如下的配置