Java 开发——(上篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus
一、概述
记录时间 [2024-10-23]
本文是一个基于 Spring Boot 3 + MybatisPlus 的项目实战开发,主要涵盖以下几个方面:
- 从零开始的项目创建
- IDEA 中开发环境的热部署
Maven
、Swagger3
、MybatisPlus
等的配置- 路由映射知识
- 静态资源访问
- 文件上传功能实现
- 拦截器的配置
通过此次开发练习,我们能对 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
的方式管理项目。
SDK
和 Java
版本选择刚才下载的 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 请求的类型多样,如
Get
、Post
等,在注解中可以规定请求的类型。如果后端规定了请求的类型,那么前端要发送相应类型的请求。 - 后端有两种方式规定请求的类型。
- 第一种,修改注解,如
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
实体类,里面有两个参数username
和password
,给它们生成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
类中的这两个参数username
和password
,注意名字不要写错 - 后端会自动把这些参数封装到
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 的项目实战开发,主要涵盖以下几个方面: 从零开始的项目创建IDEA 中开发环境的热部署Maven、Swagger3、MybatisPlus 等的配置路由映射知识静态资源访问文件上传功能实现拦截器…...
Psychophysiology:脑-心交互如何影响个体的情绪体验?
摘要 情绪的主观体验与对身体(例如心脏)活动变化的情境感知和评估相关。情绪唤醒增加与高频心率变异性(HF-HRV)降低、EEG顶枕区α功率降低以及心跳诱发电位(HEP)振幅较高有关。本研究使用沉浸式虚拟现实(VR)技术来研究与情绪唤醒相关的脑心相互作用,以实现自然而可…...
FunASR实时语音识别内网部署 | 无网络环境中的实时语音识别 | 实时语音识别
1. 在有网的电脑上面先下载下面内容 下载模型文件,可以到modelscope中下载 下载项目源码,可以到github中搜索funasr下载 配置环境,这里使用conda虚拟环境,创建并进入虚拟环境 conda create -n funasr python3.8 conda activate …...
【设计模式-状态模式】
状态模式(State Pattern)是一种行为设计模式,它允许一个对象在内部状态改变时改变它的行为。换句话说,这种模式让对象在不同的状态下能够表现出不同的行为,而不需要修改对象的代码。状态模式通过将对象的行为与状态进行…...
【代码随想录Day50】图论Part02
岛屿数量 深搜 题目链接/文章讲解:代码随想录 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默认的内容页的上一页&下一页的调用代码是: 上一篇:[!--info.pre--] 下一篇:[!--info.next--] 但是实话实说,如果做个很普通的模版那足够用了,但是如果想个性化一点的话,比如加背景ÿ…...
(7)c++复合数据类型之数组
数组 数组就是可以存储一组相同类型的值,比如int a[10];就是一个存储10个int类型的数组。 数组初始化 数组初始化可以单个初始化,也是使用列表初始化,列表初始化可以全部,或者部分,如下案例: #include &…...
2.1 > Shell 是什么、如何更熟练的使用 Bash Shell
Shell 基础知识 Shell是计算机操作系统中的一个命令行解释器,由C语言编写,用于用户与操作系统之间进行交互。用户可以通过Shell输入命令,操作系统接收到这些命令后执行相应的操作。Shell一般还提供了编程语言的基本功能,允许用户…...
YOLO V3 网络构架解析
YOLO V3(You Only Look Once version 3)是由Joseph Redmon等人于2018年提出的一种基于深度学习的目标检测算法。它在速度和精度上相较于之前的版本有了显著提升,成为计算机视觉领域的一个重要里程碑。本文将详细解析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轻量化技术应用的推进,5G RedCap旨在提供低功耗、低成本、广覆盖等功能特点赋能电力智能化升级。特别适用于工业物联网、低空经济、车联网、消费电子和轻量级5G的需求。 5G RedCap工业路由器的特点 低功耗:5G RedCap工业路由器通过节能技术&#…...
029.浏览器自动化-抓取#document下的内容
一、iframe下的#document是什么 #document 是一个特殊的 HTML 元素,表示 <iframe> 元素内部的文档对象。当你在 HTML 页面中嵌入一个 <iframe> 元素时,浏览器会创建一个新的文档对象来表示 <iframe> 内部的内容。这 个文档对象就是 #…...
2024前端html5,css3面试题总汇
1.XML,HTML,XHTML区别⭐ XML:XML是一个可扩展标记语言,主要是用来存储,传输数据的,并非显示数据,可以用来标记数据,定义数据类型,允许用户对自己的标记语言进行定义&…...
css实现外层不换行,内层换行
css实现上图效果,内容A和B整体不换行,B内容中换行 <div className"description"> <div className"label">{formatMessage({id: description})}</Col> <divclassName"value"> &l…...
word取消自动单词首字母大写
情况说明:在word输入单词后首字母会自动变成大写 (1)点击菜单栏文件 (2)点击“更多”——>“选项” (3)点击“校对”——>“自动更正选项” (4)取消“句首字母大写…...
flex常用固定搭配
flex常用固定搭配 flex简写:flex-grow(项目放大),flex-shrink (项目缩小),flex-basis(项目本身) flex: 1; 全写:flex: 1 1 0%;内容自动放大或缩小占满剩余…...
Kafka、Kafka Streams、Drools、Redis 和分布式数据库的风控系统程序
由于实时风控系统难度较大,集成框架设计各个单位均有特点,快速建立一个通用性较强,学习、实施和使用成本较低的框架尤其重要。 提供一个简化的 Java 程序示例,演示如何将 Kafka 消息中间件、Kafka Streams 计算引擎、Drools 规则…...
C++在实际项目中的应用第一课:游戏开发中的C++
第五章:C在实际项目中的应用 第一课:游戏开发中的C 1. 游戏引擎架构的详细分析 游戏引擎是现代游戏开发的核心,负责处理图形渲染、物理计算、音频管理和用户输入等多项功能。以下是游戏引擎架构的各个主要组成部分及其详细分析。 1.1 渲染…...
一键下载海外youtbe视频 解锁版 支持多分辨率
下载:https://pan.quark.cn/s/387e1110ebe5 【应用名称】:Snaptube 【应用版本】:7.28.0 【应用大小】:26.6M 【测试机型】:小米10S 【适用平台】:Andriod 【版本说明】:解锁版...
Scala内部类的运用
内部类:定义在类里面的类(内部类可以访问私有成员用它来操作类的私有成员,封闭性更好) class Student{var age18def say():Unit{}class Book{val bookName: Any "Scala程序设计"}}object Test19 {def main(args: Arra…...
【在Linux世界中追寻伟大的One Piece】Socket编程UDP
目录 1 -> UDP网络编程 1.1 -> V1版本 -echo server 1.2 -> V2版本 -DictServer 1.3 -> V2版本 -DictServer(封装版) 1 -> UDP网络编程 1.1 -> V1版本 -echo server 简单的回显服务器和客户端代码。 备注:代码中会用到地址转换函数。 noc…...
机器学习在聚合物及其复合材料中的应用与实践
在当前的工业和科研领域,聚合物及其复合材料因其卓越的物理和化学性能而受到广泛关注。这些材料在航空航天、汽车制造、能源开发和生物医学等多个行业中发挥着至关重要的作用。随着材料科学的发展,传统的实验和理论分析方法已逐渐无法满足新材料研发的需…...
用大模型或者预训练模型对图片进行OCR
背景:使用大模型或者预训练模型(比如来自huggingface上的模型)对图片进行OCR,并将识别结果标记在图片原文的下方。 愿我们终有重逢之时,而你还记得我们曾经讨论的话题。 QQ group 868373192 QQ second group 277356808 要使用预训练模型对图片进行OCR(光学字符识别)…...
如何使用的是github提供的Azure OpenAI服务
使用的是github提供的Azure OpenAI的服务gpt-4o 说明:使用的是github提供的Azure OpenAI的服务,可以无限薅羊毛。开源地址 进入: 地址 进入后点击 右上角“Get API key”按钮 点击“Get developer key” 选择Beta版本“Generate new to…...
elementUI进度条el-progress不显示白色
效果图 通过设置百分比为100,动态修改进度条的宽度完成 <template><div class"myProgressBox"><div class"index">{{ index }}</div><div class"typeTitle">{{ typeTitle }}</div><div class"twoP…...
学习笔记——路由——IP组播-PIM(协议无关组播)-概述/PIM模式
八、PIM(协议无关组播) 1、前言 在单播中,是一对一的模型,路由器将IP数据包发往目标地址,因此,单播路由器不用关心发送数据包得源地址。而组播数据流量由组播产生,发向一组接收者,那们组播路由器如何这道…...
TCP 协议学习
一、引言 在当今的网络通信世界中,TCP(Transmission Control Protocol,传输控制协议)是最为重要的协议之一。它为各种网络应用提供了可靠的、有序的数据传输服务,是互联网通信的基石。无论是网页浏览、电子邮件发送、…...
python3的基本数据类型:String(字符串)
一. 简介 本文简单学习了一下 python3中的一种数据类型: String(字符串)。 Python中的String类型是一种用于表示文本数据的数据类型。 它可以包含字母、数字、符号等字符,用于存储文本信息。 二. python3的基本数据类型&…...
面试总结(2024/10/16)
面试总结(2024/10/16) 面试11.闭包2.promise3.全局数据的保存4.多模板切换,布局,系统主题颜色5.同一个搜索,不同的搜索条件,输入框不同的校验方法6.自定义一个组件,包括哪些属性7.多个父组件之间…...
从图像识别到聊天机器人:Facebook AI的多领域应用
随着人工智能技术的快速发展,Facebook已在多个领域内广泛应用AI技术,以提升用户体验、提高效率并推动创新。从图像识别到聊天机器人,Facebook的AI应用涵盖了社交媒体的方方面面,下面我们将深入探讨这些应用的具体实现及其对用户生…...
linux wordpress伪静态/资源搜索
说明:该文章主要是以媳妇的视角 讲述 媳妇与婆婆 好好相处的一些原则。 不和公公婆婆争老公,也不要经常问:我和你妈谁在你心里更重要?我和你妈掉水里了你先救谁? 我和你妈都生气了你先哄谁?。。。等等一系列…...
和老妇做爰视频网站/做网站一般需要多少钱
上英语课 阅读《艺术学概论》 转载于:https://www.cnblogs.com/bgd140206110/p/6568092.html...
一些做淘宝优惠券的网站/windows7优化大师官方下载
引子每周我家都会举行一个复盘活动,复盘自己的优点、缺点,干得好的、不好的。在复盘活动上,老公每次只能想到自己的优点,觉得自己特完美。嗯……我的角度看完全不是这样。举个例子,他是典型的双标。如果他加班特别晚&a…...
国内酒店网站建设/搜狐酒业峰会
在数组中保存一组函数名,可以这样写: replies[] {dump,second_chance,marriage};声明一个函数指针数组: void (*replies[])(response){dump,second_chance,marriage};参考:嗨翻C语言...
开发小网站一般多少钱一个/今日十大头条新闻
1.简介 JSR是Java Specification Requests的缩写,意思是Java 规范提案 JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation 即,JSR 303,Bean Validation规范 ,为Bean验证定义了元数据模型和API.。默认的元数据…...
重庆设计网站/汕头网站建设开发
最近看到一道有点意思的逻辑算法题,便着手实现一下。题目是要求打印 出N*N顺时针螺旋数组,规律如下:// 1 2 3 4 5//www.cppcns.com 16 17 18 19 6// 15 24 25 20 7// 14 23 22 21 8// 13 12 11 10 9java 实现示例代码如下:import …...