锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. SpringBoot框架

SpringBoot框架

0
  • 软件开发
  • 发布于 2024-07-23
  • 0 次阅读
黄健
黄健

SpringBoot框架

星悦糖 已于 2022-10-09 19:40:01 修改
阅读量10w+ 收藏 6.6k
点赞数 935
分类专栏: springboot 文章标签: springboot mvc java spring boot restful
于 2022-04-01 17:18:47 首次发布
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/friggly/article/details/123888590
            <div class="operating">
                <a class="href-article-edit slide-toggle">版权</a>
            </div>
        </div>
    </div>

</div>

    <div id="blogColumnPayAdvert">
        <div class="column-group">
            <div class="column-group-item column-group0 column-group-item-one">
                <div class="item-l">
                    <a class="item-target" href="https://blog.csdn.net/friggly/category_11703250.html" target="_blank" title="springboot" data-report-click="{&quot;spm&quot;:&quot;1001.2101.3001.6332&quot;}">
                        <img class="item-target" src="https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64" alt="">
                        <span class="title item-target">
                            <span>
                            <span class="tit">springboot</span>
                                <span class="dec">专栏收录该内容</span>
                            </span>
                        </span>
                    </a>
                </div>
                <div class="item-m">
                    <span>12 篇文章</span>
                    <span>69 订阅</span>
                </div>
                <div class="item-r">
                        <a class="item-target article-column-bt articleColumnFreeBt" data-id="11703250">订阅专栏</a>
                </div>
            </div>
        </div>
    </div>
<article class="baidu_pl">
    <div id="article_content" class="article_content clearfix">
    <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/kdoc_html_views-1a98987dfd.css">
    <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/ck_htmledit_views-044f2cf1dc.css">
         
            <div id="content_views" class="htmledit_views">
                <p id="main-toc"><strong>目录</strong>&nbsp;</p> 

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 快速构建

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

 

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

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

        (5)项目结构如下:

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

        (6)对pom.xml文件进行解释

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <!--继承 SpringBoot 框架的一个父项目,所有自己开发的 Spring Boot 都必须的继承-->
  8. <parent>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-parent</artifactId>
  11. <version>2.2.1.RELEASE</version>
  12. <relativePath/> <!-- lookup parent from repository -->
  13. </parent>
  14. <!--当前项目的 GAV 坐标-->
  15. <groupId>com.bjpowernode.springboot</groupId>
  16. <artifactId>002-springboot-springmvc</artifactId>
  17. <version>1.0.0</version>
  18. <!--maven 项目名称,可以删除-->
  19. <name>002-springboot-springmvc</name>
  20. <!--maven 项目描述,可以删除-->
  21. <description>Demo project for Spring Boot</description>
  22. <!--maven 属性配置,可以在其它地方通过${}方式进行引用-->
  23. <properties>
  24. <java.version>1.8</java.version>
  25. </properties>
  26. <dependencies>
  27. <!--SpringBoot 框架 web 项目起步依赖,通过该依赖自动关联其它依赖,不需要我们一个一个去添加
  28. -->
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-web</artifactId>
  32. </dependency>
  33. <!--SpringBoot 框架的测试起步依赖,例如:junit 测试,如果不需要的话可以删除-->
  34. <dependency>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-starter-test</artifactId>
  37. <scope>test</scope>
  38. <exclusions>
  39. <exclusion>
  40. <groupId>org.junit.vintage</groupId>
  41. <artifactId>junit-vintage-engine</artifactId>
  42. </exclusion>
  43. </exclusions>
  44. </dependency>
  45. </dependencies>
  46. <build>
  47. <plugins>
  48. <!--SpringBoot提供的打包编译等插件-->
  49. <plugin>
  50. <groupId>org.springframework.boot</groupId>
  51. <artifactId>spring-boot-maven-plugin</artifactId>
  52. </plugin>
  53. </plugins>
  54. </build>
  55. </project>

 2.2  创建一个 Spring MVC 的 Spring BootController 

      (1)创建SpringBootController 类

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

  1. package com.bjpowernode.springboot.web;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. @Controller
  6. public class SpringBootController {
  7. @RequestMapping(value = "/springBoot/say")
  8. public @ResponseBody String say() {
  9. return "Hello,springBoot!";
  10. }
  11. }

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

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

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

2.3  分析


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

  1.  <properties> 
  2.   <spring-framework.version>5.0.0.RELEASE</ spring-framework.version > 
  3. </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 端口号及项目上下文件根:

  1. #设置内嵌 Tomcat 端口号
  2. server.port=9090
  3. #配置项目上下文根
  4. 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 提供了多环境配置
,具体步骤如下 :

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

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

 application-dev.properties 

  1. #开发环境
  2. #设置内嵌 Tomcat 默认端口号
  3. server.port=8080
  4. #设置项目的上下文根
  5. server.servlet.context-path=/005-springboot-multi-environment-dev

application-product.properties

  1. #生产环境
  2. #配置内嵌 Tomcat 默认端口号
  3. server.port=80
  4. #配置项目上下文根
  5. server.servlet.context-path=/005-springboot-multi-environment-product

application-test.properties

  1. #测试环境
  2. #配置内嵌 Tomcat 端口号
  3. server.port=8081
  4. #配置项目的上下文根
  5. server.servlet.context-path=/005-springboot-multi-environment-test

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

  1. #SpringBoot 的总配置文件
  2. #激活开发环境
  3. #spring.profiles.active=dev
  4. #激活测试环境
  5. #spring.profiles.active=test
  6. #激活生产环境
  7. spring.profiles.active=product

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

 application-dev.yml

  1. #设置开发环境配置
  2. server:
  3. port: 8080 #设置 Tomcat 内嵌端口号
  4. servlet:
  5. context-path: /dev #设置上下文根

application-product.yml

  1. #设置生产环境配置
  2. server:
  3. port: 80
  4. servlet:
  5. context-path: /product

application-test.yml

  1. #设置测试环境配置
  2. server:
  3. port: 9090
  4. servlet:
  5. context-path: /test

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

  1. #springboot 总配置文件
  2. #激活开发环境
  3. #spring:
  4. # profiles:
  5. # active: dev
  6. #激活测试环境
  7. #spring:
  8. # profiles:
  9. # active: test
  10. #激活生产环境
  11. spring:
  12. profiles:
  13. active: product

        (5)Spring Boot 自定义配置

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

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

        案例演示:

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

.properties方式

 .yml方式

  1. #设置端口号及上下文根
  2. server:
  3. port: 9090
  4. servlet:
  5. context-path: /
  6. school:
  7. name: ssm
  8. websit: http://www.baidu.com

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

  1. @Controller
  2. public class SpringBootController {
  3. @Value("${school.name}")
  4. private String schoolName;
  5. @Value("${websit}")
  6. private String websit;
  7. @RequestMapping(value = "/springBoot/config")
  8. public @ResponseBody String say() {
  9. return schoolName + "------" + websit;
  10. }
  11. }

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

         (B)@ConfigurationProperties

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

        案例演示:

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

  1. @Data
  2. @Component
  3. @ConfigurationProperties(prefix = "school")
  4. public class ConfigInfo {
  5. private String name;
  6. private String websit;
  7. }

        (2)application.properties 配置文件

  1. #设置内嵌 Tomcat 端口号
  2. server.port=9090
  3. #设置上下文根
  4. server.servlet.context-path=/config
  5. school.name=ssm
  6. school.websit=http://www.baidu.com

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

  1. @Autowired
  2. private ConfigInfo configInfo;

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

  1. @RequestMapping(value = "/springBoot/config")
  2. public @ResponseBody String say() {
  3. return configInfo.getName() + "=======" + configInfo.getWebsit();
  4. }

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

         (C)警告解决

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

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

  1. <!--解决使用@ConfigurationProperties 注解出现警告问题-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-configuration-processor</artifactId>
  5. <optional>true</optional>
  6. </dependency>

        (D)中文乱码

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

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

2.5  Spring Boot 前端使用 JSP

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

  1. <!--引入 Spring Boot 内嵌的 Tomcat 对 JSP 的解析包,不加解析不了 jsp 页面-->
  2. <!--如果只是使用 JSP 页面,可以只添加该依赖-->
  3. <dependency>
  4. <groupId>org.apache.tomcat.embed</groupId>
  5. <artifactId>tomcat-embed-jasper</artifactId>
  6. </dependency>
  7. <!--如果要使用 servlet 必须添加该以下两个依赖-->
  8. <!-- servlet 依赖的 jar 包-->
  9. <dependency>
  10. <groupId>javax.servlet</groupId>
  11. <artifactId>javax.servlet-api</artifactId>
  12. </dependency>
  13. <dependency>
  14. <groupId>javax.servlet.jsp</groupId>
  15. <artifactId>javax.servlet.jsp-api</artifactId>
  16. <version>2.3.1</version>
  17. </dependency>
  18. <!--如果使用 JSTL 必须添加该依赖-->
  19. <!--jstl 标签依赖的 jar 包 start-->
  20. <dependency>
  21. <groupId>javax.servlet</groupId>
  22. <artifactId>jstl</artifactId>
  23. </dependency>

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

  1. <!--
  2. SpringBoot 要求 jsp 文件必须编译到指定的 META-INF/resources 目录下才能访问,否则访问
  3. 不到。
  4. 其它官方已经建议使用模版技术
  5. -->
  6. <resources>
  7. <resource>
  8. <!--源文件位置-->
  9. <directory>src/main/webapp</directory>
  10. <!--指定编译到 META-INF/resources,该目录不能随便写-->
  11. <targetPath>META-INF/resources</targetPath>
  12. <!--指定要把哪些文件编译进去,**表示 webapp 目录及子目录,*.*表示所有文件-->
  13. <includes>
  14. <include>**/*.*</include>
  15. </includes>
  16. </resource>
  17. </resources>

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

  1. #SpringBoot 核心配置文件
  2. #指定内嵌 Tomcat 端口号
  3. server.port=8090
  4. #配置 SpringMVC 视图解析器
  5. #其中:/ 表示目录为 src/main/webapp
  6. spring.mvc.view.prefix=/
  7. spring.mvc.view.suffix=.jsp

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

  1. @Controller
  2. public class SpringBootController {
  3. @RequestMapping(value = "/springBoot/jsp")
  4. public String jsp(Model model) {
  5. model.addAttribute("data","SpringBoot 前端使用 JSP 页面!");
  6. return "index";
  7. }
  8. }

        (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 依赖 

  1. <!--MyBatis 整合 SpringBoot 的起步依赖-->
  2. <dependency>
  3. <groupId>org.mybatis.spring.boot</groupId>
  4. <artifactId>mybatis-spring-boot-starter</artifactId>
  5. <version>2.0.0</version>
  6. </dependency>
  7. <!--MySQL 的驱动依赖-->
  8. <dependency>
  9. <groupId>mysql</groupId>
  10. <artifactId>mysql-connector-java</artifactId>
  11. </dependency>

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

  1. #配置内嵌 Tomcat 端口号
  2. server.port=9090
  3. #配置项目上下文根
  4. server.servlet.context-path=/010-springboot-web-mybatis
  5. #配置数据库的连接信息
  6. #注意这里的驱动类有变化
  7. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  8. spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
  9. spring.datasource.username=root
  10. spring.datasource.password=root

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

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

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

  1. @Controller
  2. public class StudentController {
  3. @Autowired
  4. private StudentService studentService;
  5. @RequestMapping(value = "/springBoot/student")
  6. public @ResponseBody Object student() {
  7. Student student = studentService.queryStudentById(1);
  8. return student;
  9. }
  10. }

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

  1. public interface StudentService {
  2. /**
  3. * 根据学生标识获取学生详情
  4. * @param id
  5. * @return
  6. */
  7. Student queryStudentById(Integer id);
  8. }

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

  1. @Service
  2. public class StudentServiceImpl implements StudentService {
  3. @Autowired
  4. private StudentMapper studentMapper;
  5. @Override
  6. public Student queryStudentById(Integer id) {
  7. return studentMapper.selectByPrimaryKey(id);
  8. }
  9. }

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

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

  1. @Mapper
  2. public interface StudentMapper {
  3. }

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

  1. <resources>
  2. <resource>
  3. <directory>src/main/java</directory>
  4. <includes>
  5. <include>**/*.xml</include>
  6. </includes>
  7. </resource>
  8. </resources>

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

 3.2 DAO 的其它开发方式

方式一:

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

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

  1. @SpringBootApplication
  2. @MapperScan("com.abc.springboot.mapper")
  3. public class Application {

或

  1. @SpringBootApplication
  2. //Mybatis 提供的注解:扫描数据持久层的 mapper 映谢配置文件,DAO 接口上就不用加@Mapper
  3. //basePackages 通常指定到数据持久层包即可
  4. @MapperScan(basePackages = "com.abc.springboot.mapper")
  5. public class Application {

方式二:

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

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

  1. # 指定 Mybatis 映射文件的路径
  2. mybatis.mapper-locations=classpath:mapper/*.xml

 3.3 Spring Boot 事务支持

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

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

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

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

  1. @RequestMapping(value = "/springboot/modify")
  2. public @ResponseBody Object modifyStudent() {
  3. int count = 0;
  4. try {
  5. Student student = new Student();
  6. student.setId(1);
  7. student.setName("Jack");
  8. student.setAge(33);
  9. count = studentService.modifyStudentById(student);
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. return "fail";
  13. }
  14. return count;
  15. }

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

int modifyStudentById(Student student); 

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

  1. @Override
  2. @Transactional //添加此注解说明该方法添加的事务管理
  3. public int update(Student student) {
  4. int updateCount = studentMapper.updateByPrimaryKeySelective(student);
  5. System.out.println("更新结果:" + updateCount);
  6. //在此构造一个除数为 0 的异常,测试事务是否起作用
  7. int a = 10/0;
  8. return updateCount;
  9. }

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

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

  1. @SpringBootApplication
  2. @MapperScan(basePackages = "com.abc.springboot.mapper")
  3. @EnableTransactionManagement //开启事务支持(可选项,但@Transactional 必须添加)
  4. 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

  1. @RestController
  2. public class MyRestController {
  3. @Autowired
  4. private StudentService studentService;
  5. @RequestMapping("/boot/stu")
  6. public Object stu(){
  7. return studentService.getStudentById(1);
  8. }
  9. }

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

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

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

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

        (8)综合案例:

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

  1. //RestController 注解相当于加了给方法加了@ResponseBody 注解,所以是不能跳转页面的,只能返回字符串或者 json 数据
  2. @RestController
  3. public class MVCController {
  4. @GetMapping(value = "/query")
  5. public String get() {
  6. return "@GetMapping 注解,通常查询时使用";
  7. }
  8. @PostMapping(value = "/add")
  9. public String add() {
  10. return "@PostMapping 注解,通常新增时使用";
  11. }
  12. @PutMapping(value = "/modify")
  13. public String modify() {
  14. return "@PutMapping 注解,通常更新数据时使用";
  15. }
  16. @DeleteMapping(value = "/remove")
  17. public String remove() {
  18. return "@DeleteMapping 注解,通常删除数据时使用";
  19. }
  20. }

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

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

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

  1. <dependencies>
  2. <!--SpringBoot 框架 web 项目起步依赖-->
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-starter-web</artifactId>
  6. </dependency>
  7. <!--MyBatis 集成 SpringBoot 框架起步依赖-->
  8. <dependency>
  9. <groupId>org.mybatis.spring.boot</groupId>
  10. <artifactId>mybatis-spring-boot-starter</artifactId>
  11. <version>2.0.1</version>
  12. </dependency>
  13. <!--MySQL 驱动-->
  14. <dependency>
  15. <groupId>mysql</groupId>
  16. <artifactId>mysql-connector-java</artifactId>
  17. </dependency>
  18. </dependencies>
  19. <build>
  20. <!--指定配置资源的位置-->
  21. <resources>
  22. <resource>
  23. <directory>src/main/java</directory>
  24. <includes>
  25. <include>**/*.xml</include>
  26. </includes>
  27. </resource>
  28. </resources>
  29. <plugins>
  30. <!--mybatis 代码自动生成插件-->
  31. <plugin>
  32. <groupId>org.mybatis.generator</groupId>
  33. <artifactId>mybatis-generator-maven-plugin</artifactId>
  34. <version>1.3.6</version>
  35. <configuration>
  36. <!--配置文件的位置-->
  37. <configurationFile>GeneratorMapper.xml</configurationFile>
  38. <verbose>true</verbose>
  39. <overwrite>true</overwrite>
  40. </configuration>
  41. </plugin>
  42. <plugin>
  43. <groupId>org.springframework.boot</groupId>
  44. <artifactId>spring-boot-maven-plugin</artifactId>
  45. </plugin>
  46. </plugins>
  47. </build>

application. properties核心配置文件

  1. #配置内嵌 Tomcat 端口号
  2. server.port=8090
  3. #配置项目上下文根
  4. server.servlet.context-path=/
  5. #配置数据库的连接信息
  6. #注意这里的驱动类有变化
  7. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  8. spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
  9. spring.datasource.username=root
  10. spring.datasource.password=root

通过逆向工程生成 DAO

创建 RESTfulController

  1. @RestController
  2. public class RESTfulController {
  3. /**
  4. * 添加学生
  5. * 请求地址:
  6. http://localhost:9090/014-springboot-restful/springBoot/student/wangpeng/23
  7. * 请求方式:POST
  8. * @param name
  9. * @param age
  10. * @return
  11. */
  12. @PostMapping(value = "/springBoot/student/{name}/{age}")
  13. public Object addStudent(@PathVariable("name") String name, @PathVariable("age") Integer age) {
  14. Map<String,Object> retMap = new HashMap<String, Object>();
  15. retMap.put("name",name);
  16. retMap.put("age",age);
  17. return retMap;
  18. }
  19. /**
  20. * 删除学生
  21. * 请求地址:
  22. http://localhost:9090/014-springboot-restful/springBoot/student/1
  23. * 请求方式:Delete
  24. * @param id
  25. * @return
  26. */
  27. @DeleteMapping(value = "/springBoot/student/{id}")
  28. public Object removeStudent(@PathVariable("id") Integer id) {
  29. return "删除的学生 id 为:" + id;
  30. }
  31. /**
  32. * 修改学生信息
  33. * 请求地址:
  34. http://localhost:9090/014-springboot-restful/springBoot/student/2
  35. * 请求方式:Put
  36. * @param id
  37. * @return
  38. */
  39. @PutMapping(value = "/springBoot/student/{id}")
  40. public Object modifyStudent(@PathVariable("id") Integer id) {
  41. return "修改学生的 id 为" + id;
  42. }
  43. @GetMapping(value = "/springBoot/student/{id}")
  44. public Object queryStudent(@PathVariable("id") Integer id) {
  45. return "查询学生的 id 为" + id;
  46. }
  47. }

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

 

 

 

         (4)请求冲突的问题

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

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

  1. @RestController
  2. public class RESTfulController {
  3. /**
  4. * id:订单标识
  5. * status:订单状态
  6. * 请求路径:
  7. http://localhost:9090/015-springboot-restful-url-conflict/springBoot/orde
  8. r/1/1001
  9. * @param id
  10. * @param status
  11. * @return
  12. */
  13. @GetMapping(value = "/springBoot/order/{id}/{status}")
  14. public Object queryOrder(@PathVariable("id") Integer id, @PathVariable("status") Integer status) {
  15. Map<String,Object> map = new HashMap<String,Object>();
  16. map.put("id",id);
  17. map.put("status",status);
  18. return map;
  19. }
  20. /**
  21. * id:订单标识
  22. * status:订单状态
  23. * 请求路径:
  24. http://localhost:9090/015-springboot-restful-url-conflict/springBoot/1/or
  25. der/1001
  26. * @param id
  27. * @param status
  28. * @return
  29. */
  30. @GetMapping(value = "/springBoot/{id}/order/{status}")
  31. public Object queryOrder1(@PathVariable("id") Integer id, @PathVariable("status") Integer status) {
  32. Map<String,Object> map = new HashMap<String,Object>();
  33. map.put("id",id);
  34. map.put("status",status);
  35. return map;
  36. }
  37. /**
  38. * id:订单标识
  39. * status:订单状态
  40. * 请求路径:
  41. http://localhost:9090/015-springboot-restful-url-conflict/springBoot/1001
  42. /order/1
  43. * @param id
  44. * @param status
  45. * @return
  46. */
  47. @GetMapping(value = "/springBoot/{status}/order/{id}")
  48. public Object queryOrder2(@PathVariable("id") Integer id,
  49. @PathVariable("status") Integer status) {
  50. Map<String,Object> map = new HashMap<String,Object>();
  51. map.put("id",id);
  52. map.put("status",status);
  53. return map;
  54. }
  55. /**
  56. * id:订单标识
  57. * status:订单状态
  58. * 请求路径:
  59. http://localhost:9090/015-springboot-restful-url-conflict/springBoot/1001
  60. /order/1
  61. * @param id
  62. * @param status
  63. * @return
  64. */
  65. @PostMapping(value = "/springBoot/{status}/order/{id}")
  66. public Object queryOrder3(@PathVariable("id") Integer id, @PathVariable("status") Integer status) {
  67. Map<String,Object> map = new HashMap<String,Object>();
  68. map.put("id",id);
  69. map.put("status",status);
  70. return map;
  71. }
  72. /**
  73. * query1 和 query2 两个请求路径会发生请求路径冲突问题
  74. * query3 与 query1 和 query2 发生请求冲突
  75. * 注意:虽然两个路径写法改变了,但是由于传递的两个参数都是 int 值,所以不知道该交给
  76. 哪个请求进行处理
  77. * 就会出现匹配模糊不清的异常,所以要想解决冲突,有两种方式:
  78. * 1.修改请求路径
  79. * 2.修改请求方式
  80. */
  81. }

        (5)RESTful 原则

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

        

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

        

3.6  Spring Boot 集成 Redis 

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

具体实现步骤:

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

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

  1. <!-- 加载 spring boot redis 包 -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-redis</artifactId>
  5. </dependency>

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

  1. #配置内嵌 Tomcat 端口号
  2. server.port=9090
  3. #配置项目上下文根
  4. server.servlet.context-path=/016-springboot-redis
  5. #配置连接 MySQL 数据库信息
  6. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=UTF8&useJDBCCompliantTimezoneShift=true&useLegacyDa
  7. tetimeCode=false&serverTimezone=GMT%2B8
  8. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  9. spring.datasource.username=root
  10. spring.datasource.password=root
  11. #配置 redis 连接信息
  12. spring.redis.host=127.0.0.1
  13. spring.redis.port=6379
  14. #spring.redis.password=root

(D)启动redis服务

 (E)RedisController类

  1. @RestController
  2. public class RedisController {
  3. @Autowired
  4. private StudentService studentService;
  5. /**
  6. * 请求地址:
  7. http://localhost:9090/016-springboot-redis//springboot/allStudentCount
  8. * @param request
  9. * @return
  10. */
  11. @GetMapping(value = "/springboot/allStudentCount")
  12. public Object allStudentCount(HttpServletRequest request) {
  13. Long allStudentCount = studentService.queryAllStudentCount();
  14. return "学生总人数:" + allStudentCount;
  15. }
  16. }

(F)StudentService 接口

  1. public interface StudentService {
  2. /**
  3. * 获取学生总人数
  4. * @return
  5. */
  6. Long queryAllStudentCount();
  7. }

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

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

  1. @Service
  2. public class StudentServiceImpl implements StudentService {
  3. @Autowired
  4. private StudentMapper studentMapper;
  5. @Autowired
  6. private RedisTemplate<Object,Object> redisTemplate;
  7. @Override
  8. public Long queryAllStudentCount() {
  9. //设置 redisTemplate 对象 key 的序列化方式
  10. redisTemplate.setKeySerializer(new StringRedisSerializer());
  11. //从 redis 缓存中获取总人数
  12. Long allStudentCount = (Long) redisTemplate.opsForValue().get("allStudentCount");
  13. //判断是否为空
  14. if ( allStudentCount==null) {
  15. //去数据库查询,并存放到 redis 缓存中
  16. allStudentCount = studentMapper.selectAllStudentCount();
  17. redisTemplate.opsForValue().set("allStudentCount",allStudentCount,15,TimeUnit.SECONDS);
  18. }
  19. return allStudentCount;
  20. }
  21. }

(H)StudentMapper 接口

  1. @Mapper
  2. public interface StudentMapper {
  3. /**
  4. * 获取学生总人数
  5. * @return
  6. */
  7. Long selectAllStudentCount();
  8. }

(I)StudentMapper 映射文件 

  1. <!--获取学生总人数-->
  2. <select id="selectAllStudentCount" resultType="java.lang.Long">
  3. select count(*) from t_student
  4. </select>

(J)启动类 Application

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

  1. @SpringBootApplication
  2. @MapperScan(basePackages = "com.abc.springboot.mapper")//扫描数据持久层
  3. public class Application {
  4. public static void main(String[] args) {
  5. SpringApplication.run(Application.class, args);
  6. }
  7. }

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

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

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

文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树首页概览148855 人正在系统学习中
相关文章

万字:支付“核心系统”详解 2024-11-02 15:33

专栏作者:隐墨星辰 \| 主编:陈天宇宙 这篇文章也尝试化繁为简,探寻支付系统的本质,讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付行业已经过了风头最劲的时光,但跨境支付仍然在蓬勃发展,每年依然有很多新人进入这个行业,这篇文章尝试为这些刚入行的新人提供一点帮助。 文章只介绍一些支付行业十几

资深支付架构师视角:实战从问题定义到代码落地的完整套路 2024-11-02 15:33

前言 今天从一个实际案例入手,介绍站在架构师的角度,如何识别并定义问题,提炼需求,技术方案选型,再到详细设计,最后利用AI的能力协助写出核心的代码,验证与调优。 解决问题存在一定的模式,也可以称之为框架,总结出自己的思考和解题框架,以后再碰到同类型的问题就可以如庖丁解牛一样容易。 很多年前,我写代码

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

设计模式第16讲——迭代器模式(Iterator) 2024-10-08 11:24

一、什么是迭代器模式 迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 二、角色组成 抽象迭代器(Iterator):定义了遍历聚合对象所需的方法

vue2路由和vue3路由区别及原理 2024-10-08 11:24

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。 import Vue from 'vue';import VueRouter from 'vue-router';i

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.