当前位置: 首页 > 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…...

SDXL 1.0电影级绘图工坊:Python入门教程与基础图像处理

SDXL 1.0电影级绘图工坊&#xff1a;Python入门教程与基础图像处理 1. 引言 你是不是也曾经被那些精美的AI生成图片所吸引&#xff0c;想要自己动手创作却不知道从何开始&#xff1f;今天我们就来聊聊如何用Python快速上手SDXL 1.0这个强大的AI绘图工具。 SDXL 1.0是当前最先…...

Slickflow.NET 基于 AI 大模型实现智能客服多轮问答系统

正文 异步/等待解决了什么问题&#xff1f; 在传统同步I/O操作中&#xff08;如文件读取或Web API调用&#xff09;&#xff0c;调用线程会被阻塞直到操作完成。这在UI应用中会导致界面冻结&#xff0c;在服务器应用中则造成线程资源的浪费。async/await通过非阻塞的异步操作解…...

绝地求生罗技鼠标宏配置全攻略:从零到精通的压枪优化指南

绝地求生罗技鼠标宏配置全攻略&#xff1a;从零到精通的压枪优化指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为《绝地求生》中的枪口…...

AI辅助开发:打造你的智能编程技能教练——基于快马平台实践

最近在学编程时&#xff0c;发现一个痛点&#xff1a;遇到问题经常要反复查文档、搜论坛&#xff0c;效率很低。刚好体验了InsCode(快马)平台的AI辅助功能&#xff0c;用它做了个"智能编程教练"的小项目&#xff0c;效果意外地好。分享下具体实现思路和实际体验&…...

保姆级教程:在Ubuntu 20.04上为ZYNQ配置Linaro GCC 10.3交叉编译环境(含阿里云源和依赖库避坑)

从零构建ZYNQ嵌入式开发环境&#xff1a;Linaro GCC 10.3全流程实战指南 在嵌入式开发领域&#xff0c;为特定硬件平台搭建高效的交叉编译环境往往是项目成功的第一步。对于Xilinx ZYNQ系列这种集成了ARM Cortex-A系列处理器和FPGA的异构计算平台而言&#xff0c;选择合适的工…...

C# IDisposable:3个致命陷阱+5个最佳实践,你踩过几个?

&#x1f525;关注墨瑾轩&#xff0c;带你探索编程的奥秘&#xff01;&#x1f680; &#x1f525;超萌技术攻略&#xff0c;轻松晋级编程高手&#x1f680; &#x1f525;技术宝库已备好&#xff0c;就等你来挖掘&#x1f680; &#x1f525;订阅墨瑾轩&#xff0c;智趣学习不…...

CLIP-GmP-ViT-L-14与YOLOv11结合:实现目标检测后的细粒度语义描述

CLIP-GmP-ViT-L-14与YOLOv11结合&#xff1a;实现目标检测后的细粒度语义描述 你有没有遇到过这种情况&#xff1f;一个智能摄像头告诉你“画面里有人”&#xff0c;但你更想知道的是“画面里有一个穿着蓝色外套、正在打电话的年轻人”。或者&#xff0c;一个货架分析系统告诉…...

FreeMoCap终极指南:如何用普通摄像头实现专业级3D动作捕捉

FreeMoCap终极指南&#xff1a;如何用普通摄像头实现专业级3D动作捕捉 【免费下载链接】freemocap Free Motion Capture for Everyone &#x1f480;✨ 项目地址: https://gitcode.com/GitHub_Trending/fr/freemocap 还在为专业动作捕捉设备的高昂价格而烦恼吗&#xff…...

ReAct Agent:新手程序员必看!收藏这款融合推理与行动的AI智能体框架,轻松入门大模型应用开发

ReAct框架通过结合推理与行动&#xff0c;解决了传统提示工程的局限性&#xff0c;构建出能主动思考、决策并执行复杂任务的智能体。本文详细介绍了ReAct的核心设计思想&#xff0c;包括推理模块的动态思考链和错误回溯机制&#xff0c;以及行动模块的工具集成和环境状态感知。…...

AI教材生成强力工具!低查重保障,让教材编写事半功倍!

梳理教材知识点确实是一项“精细活”&#xff0c;最大的挑战在于平衡和衔接知识之间的关系。如果不小心&#xff0c;很可能会遗漏一些核心知识点&#xff0c;或者在难度的把控上出现问题——小学教材常常写得过于复杂&#xff0c;让学生难以理解&#xff1b;而高中教材又可能显…...