当前位置: 首页 > news >正文

Java 开发——(上篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus

一、概述

记录时间 [2024-10-23]

本文是一个基于 Spring Boot 3 + MybatisPlus 的项目实战开发,主要涵盖以下几个方面:

  • 从零开始的项目创建
  • IDEA 中开发环境的热部署
  • MavenSwagger3MybatisPlus 等的配置
  • 路由映射知识
  • 静态资源访问
  • 文件上传功能实现
  • 拦截器的配置

通过此次开发练习,我们能对 MVC 架构有一个简单的了解,会使用 Spring Boot 框架进行 Java 项目的开发,感受前后端之间是如何传递信息的。可以说,这个项目相当于一个后端基础模板,在此基础上我们可以按照需求进一步开发,若搭配 Vue 进行前端开发,便可以搭建出一个简单的前后端分离系统。

考虑到篇幅的问题,将分成两篇文章写,此为上篇。


二、开发环境搭建

1. 开发工具

此项目需要使用的开发工具如下,各种工具通过官网安装,读者可进行参考:

  • Windows 11 - 笔记本的系统
  • JDK 17 - springboot3.0 以上最低支持的 jdk 版本,官网下载
  • Intellij IDEA 2021.2.2 - 编写 Java 代码的开发工具
  • MySQL 5.7.43 - 本地数据库
  • Navicat 16.0 - 数据库查看 / 测试工具
  • Postman - API 接口测试工具
  • Notepad++ - 文本修改工具,会标记代码颜色

2. 配置 JDK

Java 开发环境(JDK)搭建,参考文章 - Java 开发环境搭建

(使用 IDEA 开发不需要配置系统环境变量,下载解压就行)


3. 配置 Maven

参考文章 - Maven 在 IDEA 中的配置与使用


三、创建 springboot3.0 项目

Spring Boot 项目可以通过官网创建,IDEA 集成了 Spring 官网创建项目的方式,因此,使用 IDEA 创建 Spring Boot 项目在本质上也是通过官网提供的服务 URL 创建的。

1. 新建项目 Spring Initializr

创建路径:File ==> New ==> New Project

使用 IDEA 创建 Spring Initializr 项目,开发语言选择 Java,以 Maven 的方式管理项目。

SDKJava 版本选择刚才下载的 17 版本,同时选择以 jar 包的形式对项目进行打包。

然后点击 Next 继续操作。

在这里插入图片描述


2. 添加 Web 依赖

在这里我们选择 Spring Boot 的版本在 3.0 以上。

与 2.0 版本相比,3.0 版本是一次较大的升级,造成了很多不兼容更新。例如最低兼容的 Java 版本为 17,底层也切换到了 Spring 6,Swagger 的配置也有很大的不同。

然后,勾选 Web 依赖,Spring Boot 项目会内置 Tomcat,自动完成一些 xml 的相关配置。

最后点击 Finish,完成创建。

在这里插入图片描述


3. 编码设置

设置项目的编码为 UTF-8,以防出现中文乱码的情况。

直接搜索 File Encodings 进行查找。

在这里插入图片描述


4. 开发环境热部署

在实际的项目开发调试过程中,我们会频繁地修改后台类文件,导致项目需要重新编译重新启动,整个过程非常麻烦,影响开发效率。

解决办法:设置 Spring Boot 开发环境热部署。

当 IDEA 监测到主程序中的内容发生改变后,会自动对项目进行编译和重启,此方法可以带来些许便利。

  • 使用 Spring Boot 提供的组件:spring-boot-devtools
  • 在 IDEA 中进行相应的设置

添加 Maven 依赖

在 pom.xml 文件中添加 dev-tools 依赖

<!-- 使用 optional=true 表示依赖不会传递,即该项目依赖 devtools;其他项目如果引入此项目生成的 JAR 包,则不会包含 devtools -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional>
</dependency>

修改配置文件

在 application.properties 中配置 dev-tools

# 设置热部署生效
spring.devtools.restart.enabled=true# 设置重启目录
spring.devtools.restart.additional-paths=src/main/java# 设置 classpath 目录下的 WEB-INF 文件夹内容修改不重启
# spring.devtools.restart.exclude=static/**

修改 IDEA 的设置

修改路径:File ==> Settings ==> Build ==> Compiler

勾选 Build project automatically,点击 Apply 进行应用,使其能自动编译构建项目。

在这里插入图片描述


同时勾选上 auto-make,点击 Apply 进行应用,确保热部署配置成功。

修改路径:File ==> Settings ==> Advanced Settings ==> Compiler

在这里插入图片描述


5. 运行主程序

找到 Spring Boot 项目的主程序入口,后缀名为 xxxApplication,点击运行即可启动整个项目。

在这里插入图片描述


四、接收 / 处理 HTTP 请求

1. 控制器 @RestController

Spring Boot 中提供了两种注解来标识控制器的类负责接收和处理 HTTP 请求,分别是 @Controller@RestController

  • @Controller:返回页面和数据;
  • @RestController:只返回数据,默认情况下,该注解会将返回的对象数据转换成 JSON 格式

在前后端分离模式中,一般由前端发送 HTTP 请求给后端,后端响应请求并返回数据,故使用 @RestController 注解。

com.example.demo 目录下新建 package controller,这个包下面放的是控制器类添加上相应的注解后,可以接收和处理 HTTP 请求。


2. 路由映射 @RequestMapping

路由映射指的是后端(服务端)规定前端以何种方式发送请求。后端的控制类中的一个方法对应一种请求方式

或者说是后端给前端规定了一条路径,通过这条路径,前端发送的消息才能被后端接收到。

这条路径会写在注解 @RequestMapping 中。

  • @RequestMapping 可以写在控制类或者具体的方法中,也可以两个地方都写,整体的路径就是两个拼接起来。如请求 hello1 方法的整体路由为 http://localhost:后端端口号/hello/hello1
  • 当注解中只有一个路径参数时,可以省略变量名 value,但如果还有其他的参数,就不可以省略。
// 以下是一个控制类
@RestController
@RequestMapping("/hello")
public class HelloController {@RequestMapping (value = "/hello1")public String hello1() {return "hello "}
}

  • HTTP 请求的类型多样,如 GetPost 等,在注解中可以规定请求的类型。如果后端规定了请求的类型,那么前端要发送相应类型的请求
  • 后端有两种方式规定请求的类型。
    • 第一种,修改注解,如 Get 请求,就把注解修改成 @GetMapping,以此类推还有 @PostMapping@PutMapping 等。
    • 第二种,在注解中用 method 参数进行标识。
// 以下是一个控制类
@RestController
@RequestMapping("/hello")
public class HelloController {// 这是一个 get 请求@RequestMapping (value = "/hello1",method = RequestMethod.GET)public String hello1() {return "hello "}// 这是一个 post 请求@PostMapping("/hello2")public String hello2() {return "login OK";}}

3. 测试工具 Postman

浏览器只能发送简单的 Get 请求,其他请求可以通过测试工具 Postman 进行测试。

在这里插入图片描述


4. 参数传递

前端在发送请求时,可以在请求中添加一些参数,这些参数会一起发送给后端。

后端通过某种方式可以获取这些参数。

方式一(Query Params)

  • 前端直接把参数写在请求路径上,格式为 参数名=参数内容,如果有多个参数,则使用 & 字符进行拼接。如 http://localhost:8080/hello?nickname=zhangsan&phone=123
  • 后端可以在方法中添加参数类型,来接收参数,如 hello(String nickname, String phone)
  • 当请求中的参数名称与方法中的参数名称一致时,自动识别参数内容。
  • 这里的参数传递不是必须的,如果前端没传参数,但是后端设置了接收,则参数的内容为默认的(String 类型为 null)。
// 测试用 http://localhost:8080/hello
// 测试用 http://localhost:8080/hello?nickname=zhangsan&phone=123
@GetMapping("/hello")
public String hello(String nickname, String phone) {// 参数传递// 当请求中的参数名称与方法中的参数名称一致时,自动识别参数内容System.out.println(phone);return "hello " + nickname;
}

  • 当请求中的参数名称与方法中的参数名称不一致时,后端不会自动识别参数内容,需要添加参数映射
  • 参数映射使用注解 @RequestParam 来实现,作用是把这两个参数名称对应起来。如请求中的参数名称为 nickname,方法中的参数名称为 name,则需要映射 @RequestParam(value = "nickname") String name
  • 默认情况下,用了参数映射,则这个参数必须传递。解决方式是更改 required = false
// 参数映射
// 当加了参数映射,参数必须传递,否则报错 (除非加参数 required = false)
// 不加映射,值可为空
@RequestMapping (value = "/hello1",method = RequestMethod.GET)
public String hello1(@RequestParam(value = "nickname",required = false) String name) {// 参数传递// 当请求中的参数名称与方法中的参数名称一致时,自动识别参数内容// 不一致时,添加参数映射System.out.println("hello1....");return "hello " + name;
}


参考测试

先确定路由映射的路径,方法,需要传递的参数。

在这里插入图片描述


方式二(请求体 Body + 封装类)

  • 当请求传递的参数数量较多时,可以将参数封装到实体类中。
  • 在 Spring Boot 项目中编写一个 User 实体类,里面有两个参数 usernamepassword,给它们生成 Getter / Setter + toString() 方法。
// 用于封装参数的实体类
public class User {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

  • 前端要传递的参数就是 User 类中的这两个参数 usernamepassword,注意名字不要写错
  • 后端会自动把这些参数封装到 user 对象中去。
// 把对象封装到类里,注意参数名称相同
@PostMapping("/hello2")
public String hello2(User user) {System.out.println(user.toString());return "login OK" + user.getUsername();
}

  • 如果前端用 JSON 格式请求,则对象前需要加上请求体 @RequestBody
  • 注意 JSON 格式的参数是有数据类型的,如,用双引号表示的是字符串类 "zhangsan",对应 User 类中的参数类型 String
// 如果前端用 JSON 格式请求,则对象前需要加上请求体 @RequestBody
@PostMapping("/hello3")
public String hello3(@RequestBody User user) {System.out.println(user.toString());return "login OK" + user.getUsername();
}


参考测试

先确定路由映射的路径,方法,需要传递的参数。

在这里插入图片描述


前端用 JSON 格式请求

在这里插入图片描述


方式三(通配符)

  • 浅看一下
// 通配符请求
// * 一个目录  http://localhost:8080/text/*
// ** 多个目录 http://localhost:8080/text/**/****
@GetMapping("/text/**")
public String text() {return "通配符请求";
}

参考资料

参考学习视频 - SpringBoot + Vue 全栈开发:https://www.bilibili.com/video/BV1nV4y1s7ZN/

参考文章 - Java 开发环境搭建:https://blog.csdn.net/Sareur_1879/article/details/137963848

参考文章 - Maven 在 IDEA 中的配置与使用:https://blog.csdn.net/Sareur_1879/article/details/143091933

参考文章 - Spring Boot 项目是两种创建方式:https://blog.csdn.net/Sareur_1879/article/details/139201323

Maven 官网:https://maven.apache.org/download.cgi

MVN 仓库:https://mvnrepository.com/

Spring Boot 官网:https://spring.io/projects/spring-boot

Oracle 官网:https://www.oracle.com

IDEA 官网:https://www.jetbrains.com.cn/idea/

Postman 官网:https://www.postman.com/

Notepad++ 下载地址:https://notepad-plus.en.softonic.com/

WinRAR 下载地址:https://www.winrar.com.cn/

相关文章:

Java 开发——(上篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus

一、概述 记录时间 [2024-10-23] 本文是一个基于 Spring Boot 3 MybatisPlus 的项目实战开发&#xff0c;主要涵盖以下几个方面&#xff1a; 从零开始的项目创建IDEA 中开发环境的热部署Maven、Swagger3、MybatisPlus 等的配置路由映射知识静态资源访问文件上传功能实现拦截器…...

Psychophysiology:脑-心交互如何影响个体的情绪体验?

摘要 情绪的主观体验与对身体(例如心脏)活动变化的情境感知和评估相关。情绪唤醒增加与高频心率变异性(HF-HRV)降低、EEG顶枕区α功率降低以及心跳诱发电位(HEP)振幅较高有关。本研究使用沉浸式虚拟现实(VR)技术来研究与情绪唤醒相关的脑心相互作用&#xff0c;以实现自然而可…...

FunASR实时语音识别内网部署 | 无网络环境中的实时语音识别 | 实时语音识别

1. 在有网的电脑上面先下载下面内容 下载模型文件&#xff0c;可以到modelscope中下载 下载项目源码&#xff0c;可以到github中搜索funasr下载 配置环境&#xff0c;这里使用conda虚拟环境&#xff0c;创建并进入虚拟环境 conda create -n funasr python3.8 conda activate …...

【设计模式-状态模式】

状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式&#xff0c;它允许一个对象在内部状态改变时改变它的行为。换句话说&#xff0c;这种模式让对象在不同的状态下能够表现出不同的行为&#xff0c;而不需要修改对象的代码。状态模式通过将对象的行为与状态进行…...

【代码随想录Day50】图论Part02

岛屿数量 深搜 题目链接/文章讲解&#xff1a;代码随想录 class Solution {// 计算网格中岛屿的数量public int numIslands(char[][] grid) {int sum 0; // 初始化岛屿数量为0// 遍历整个网格for (int i 0; i < grid.length; i) {for (int j 0; j < grid[0].length…...

帝国CMS 内容页调用上一篇下一篇的方法(精华汇总)

帝国cms默认的内容页的上一页&下一页的调用代码是&#xff1a; 上一篇&#xff1a;[!--info.pre--] 下一篇&#xff1a;[!--info.next--] 但是实话实说&#xff0c;如果做个很普通的模版那足够用了&#xff0c;但是如果想个性化一点的话&#xff0c;比如加背景&#xff…...

(7)c++复合数据类型之数组

数组 数组就是可以存储一组相同类型的值&#xff0c;比如int a[10];就是一个存储10个int类型的数组。 数组初始化 数组初始化可以单个初始化&#xff0c;也是使用列表初始化&#xff0c;列表初始化可以全部&#xff0c;或者部分&#xff0c;如下案例&#xff1a; #include &…...

2.1 > Shell 是什么、如何更熟练的使用 Bash Shell

Shell 基础知识 Shell是计算机操作系统中的一个命令行解释器&#xff0c;由C语言编写&#xff0c;用于用户与操作系统之间进行交互。用户可以通过Shell输入命令&#xff0c;操作系统接收到这些命令后执行相应的操作。Shell一般还提供了编程语言的基本功能&#xff0c;允许用户…...

YOLO V3 网络构架解析

YOLO V3&#xff08;You Only Look Once version 3&#xff09;是由Joseph Redmon等人于2018年提出的一种基于深度学习的目标检测算法。它在速度和精度上相较于之前的版本有了显著提升&#xff0c;成为计算机视觉领域的一个重要里程碑。本文将详细解析YOLO V3的网络架构&#x…...

【zlm】 webrtc源码讲解(二)

目录 webrtc播放 MultiMediaSourceMuxer里的_ring webrtc播放 > MediaServer.exe!mediakit::WebRtcPlayer::onStartWebRTC() 行 60 CMediaServer.exe!mediakit::WebRtcTransport::OnDtlsTransportConnected(const RTC::DtlsTransport * dtlsTransport, RTC::SrtpSession::…...

5G RedCap工业路由器赋能电力物联网应用

随着5G轻量化技术应用的推进&#xff0c;5G RedCap旨在提供低功耗、低成本、广覆盖等功能特点赋能电力智能化升级。特别适用于工业物联网、低空经济、车联网、消费电子和轻量级5G的需求。 5G RedCap工业路由器的特点 低功耗&#xff1a;5G RedCap工业路由器通过节能技术&#…...

029.浏览器自动化-抓取#document下的内容

一、iframe下的#document是什么 #document 是一个特殊的 HTML 元素&#xff0c;表示 <iframe> 元素内部的文档对象。当你在 HTML 页面中嵌入一个 <iframe> 元素时&#xff0c;浏览器会创建一个新的文档对象来表示 <iframe> 内部的内容。这 个文档对象就是 #…...

2024前端html5,css3面试题总汇

1.XML&#xff0c;HTML&#xff0c;XHTML区别⭐ XML&#xff1a;XML是一个可扩展标记语言&#xff0c;主要是用来存储&#xff0c;传输数据的&#xff0c;并非显示数据&#xff0c;可以用来标记数据&#xff0c;定义数据类型&#xff0c;允许用户对自己的标记语言进行定义&…...

css实现外层不换行,内层换行

css实现上图效果&#xff0c;内容A和B整体不换行&#xff0c;B内容中换行 <div className"description"> <div className"label">{formatMessage({id: description})}</Col> <divclassName"value"> &l…...

word取消自动单词首字母大写

情况说明&#xff1a;在word输入单词后首字母会自动变成大写 &#xff08;1&#xff09;点击菜单栏文件 &#xff08;2&#xff09;点击“更多”——>“选项” &#xff08;3&#xff09;点击“校对”——>“自动更正选项” &#xff08;4&#xff09;取消“句首字母大写…...

flex常用固定搭配

flex常用固定搭配 flex简写&#xff1a;flex-grow&#xff08;项目放大&#xff09;&#xff0c;flex-shrink &#xff08;项目缩小&#xff09;&#xff0c;flex-basis&#xff08;项目本身&#xff09; flex: 1; 全写&#xff1a;flex: 1 1 0%;内容自动放大或缩小占满剩余…...

Kafka、Kafka Streams、Drools、Redis 和分布式数据库的风控系统程序

由于实时风控系统难度较大&#xff0c;集成框架设计各个单位均有特点&#xff0c;快速建立一个通用性较强&#xff0c;学习、实施和使用成本较低的框架尤其重要。 提供一个简化的 Java 程序示例&#xff0c;演示如何将 Kafka 消息中间件、Kafka Streams 计算引擎、Drools 规则…...

C++在实际项目中的应用第一课:游戏开发中的C++

第五章&#xff1a;C在实际项目中的应用 第一课&#xff1a;游戏开发中的C 1. 游戏引擎架构的详细分析 游戏引擎是现代游戏开发的核心&#xff0c;负责处理图形渲染、物理计算、音频管理和用户输入等多项功能。以下是游戏引擎架构的各个主要组成部分及其详细分析。 1.1 渲染…...

一键下载海外youtbe视频 解锁版 支持多分辨率

下载&#xff1a;https://pan.quark.cn/s/387e1110ebe5 【应用名称】&#xff1a;Snaptube 【应用版本】&#xff1a;7.28.0 【应用大小】&#xff1a;26.6M 【测试机型】&#xff1a;小米10S 【适用平台】&#xff1a;Andriod 【版本说明】&#xff1a;解锁版...

Scala内部类的运用

内部类&#xff1a;定义在类里面的类&#xff08;内部类可以访问私有成员用它来操作类的私有成员&#xff0c;封闭性更好&#xff09; class Student{var age18def say():Unit{}class Book{val bookName: Any "Scala程序设计"}}object Test19 {def main(args: Arra…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...