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

news2024/11/23 13:01:12

一、概述

记录时间 [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;
}


参考测试

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

在这里插入图片描述


方式二(动态获取)

  • 这种方式一般搭配 RESTful API 使用。
  • 将请求 URL 中的模板变量映射到方法参数上,@GetMapping 中写请求路径,需要传递的参数用大括号包裹,如 /user/{id},这表示前端要传递的参数是 id = 10,前端的写法是 http://localhost:8080/user/10
  • 后端想要获取这个参数值,需要在对应的参数前加注解 @PathVariable
// 动态方式获取 {id},需要添加注解 @PathVariable
@GetMapping("/user/{id}")
public String getUserById(@PathVariable int id) {
    return "根据 ID 获取用户信息:" + id;
}

参考测试

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

在这里插入图片描述


方式三(请求体 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;
    }

    @Override
    public 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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2224417.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

颐驰06持续交付,明日科技赋能出行生活

在全球智能出行领域&#xff0c;自动驾驶技术的发展一直是行业关注的焦点。不久前&#xff0c;特斯拉发布的自动驾驶出租车引发了全球关注&#xff0c;但由于缺乏具体的技术细节&#xff0c;导致投资者信心受挫&#xff0c;特斯拉股票一度下跌近10%。与此同时&#xff0c;中国车…

智能台灯设计(一)原理图设计

1. 前言 作者最近突发奇想&#xff0c;想自己做一个小台灯&#xff0c;设想的功能有&#xff1a;带锂电池可充电、可以调节亮度&#xff0c;后续通过增加WIFI模块实现手机控制开关功能。目前先实现最简单的功能&#xff0c;有时间再一步步完善吧。 2. 原理图设计 充电芯片使用…

常用的三角公式

目录 1. 基本公式​ 2. 倍角公式​ 3. 半角公式​ 4. 和差公式​ 5. 和差化积​ 6. 积化和差​ 7. 万能公式​ 1. 基本公式 2. 倍角公式 3. 半角公式 4. 和差公式 5. 和差化积 6. 积化和差 7. 万能公式

self-supervised learning(BERT和GPT)

1芝麻街与NLP模型 我們接下來要講的主題呢叫做Self-Supervised Learning&#xff0c;在講self-supervised learning之前呢&#xff0c;就不能不介紹一下芝麻街&#xff0c;為什麼呢因為不知道為什麼self-supervised learning的模型都是以芝麻街的人物命名。 因為Bert是一個非常…

第九部分 Java API

第九部分 Java API 9.1 Java Number & Math 9.1.1 Java Number类 一般地&#xff0c;当需要使用数字的时候&#xff0c;我们通常使用内置数据类型&#xff0c;如&#xff1a;byte、int、long、double 等。 实例 int a 5000; float b 13.65f; byte c 0x4a;然而&…

《云原生安全攻防》-- K8s攻击案例:权限维持的攻击手法

在本节课程中&#xff0c;我们将一起深入了解K8s权限维持的攻击手法&#xff0c;通过研究这些攻击手法的技术细节&#xff0c;来更好地认识K8s权限维持所带来的安全风险。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; K8s权限维持&#xff1a;简单介绍K8s权限维持…

VUE中文本域默认展示最底部内容

文本域内容 <textarea ref"textareaRef" style"width: 100%; resize: none;" readonly v-model"errorLog" rows"15"></textarea> 样式展示 this.$nextTick(() > { // 使用$refs获取文本域的DOM元素 const textareaInfo…

SwiftUI:单个App支持设置多语言

SwiftUI 全新多语言方案 简化本地化的字符串- WWDC21 - 视频 本地化您的SwiftUI app - WWDC21 - 视频 构建全球化App&#xff1a;本地化的示例- WWDC22 - 视频 构建支持多语言的App - WWDC24 - 视频 单个App支持设置多语言 工程 Info.plist里添加 键值UIPrefersShowingLangua…

解析三相220V与三相380V变频器的关键差异

在工业自动化的广阔舞台上&#xff0c;作为电力电子技术的杰出代表&#xff0c;扮演着调节电机速度、优化能源利用的重要角色。本文将深入探讨三相220V与三相380V变频器之间的九大核心区别&#xff0c;帮助读者更全面地理解这两种设备的应用特性。 一、电压等级&#xff1a;基础…

【C#】调用本机AI大模型流式返回

【python】AI Navigator的使用及搭建本机大模型_anaconda ai navigator-CSDN博客 【Python】AI Navigator对话流式输出_python ai流式返回-CSDN博客 前两章节我们讲解了使用AI Navigator软件搭建本机大模型&#xff0c;并使用python对大模型api进行调用&#xff0c;使其流式返…

【线下培训】龙信科技应邀参与了由教育部网络安全与执法虚拟教研室(中国刑事警察学院)举办的学术讲座

文章关键词&#xff1a;电子数据取证培训、产学研推进、手机取证、介质取证 2024年10月23日&#xff0c;龙信科技应邀参与了由教育部网络安全与执法虚拟教研室&#xff08;中国刑事警察学院&#xff09;举办的学术讲座。在这次学术交流中&#xff0c;我们公司的技术专家陈杰以…

使用.NET MAUI开发第一个安卓APP

它是.NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架&#xff0c;用于使用 C# 和 XAML 创建本机移动和桌面应用。 .NET MAUI可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。 使用 .NET MAUI 开发第一个 Android 应用是一个直观的过程&#xff0c;…

【C++初阶】一文讲通C++内存管理

文章目录 1. C/C内存分布2. C语言中动态内存管理方式3. C内存管理方式3. 1 new/delete操作内置类型3. 2 new和delete操作自定义类型 4. new与delete的原理4. 1 operator new与operator delete函数4. 2 内置类型4. 3 自定义类型 5. 定位new表达式(placement-new)6. malloc/free和…

苍穹外卖--开发记录day09-10

目录 苍穹外卖day09-10一&#xff1a;springtask二&#xff1a;订单状态定时处理三&#xff1a;websocket四&#xff1a;来单提醒五&#xff1a;客户催单 总结 苍穹外卖day09-10 首先第九天是实战日&#xff0c;要完成以下内容的开发&#xff1a; 用户端历史订单模块&#xf…

Python小游戏13——植物大战僵尸

代码 import random import time # 植物类 class Plant: def __init__(self, name, health): self.name name self.health health def is_alive(self): return self.health > 0 # 僵尸类 class Zombie: def __init__(self, name, health): self.name name self.health h…

eks节点的网络策略配置机制解析

参考链接 vpc-cni网络策略最佳实践&#xff0c;https://aws.github.io/aws-eks-best-practices/security/docs/network/#additional-resourcesvpc cni网络策略faq&#xff0c;https://github.com/aws/amazon-vpc-cni-k8s/blob/0703d03dec8afb8f83a7ff0c9d5eb5cc3363026e/docs/…

一致角色的视频且唇形同步中文配音和免费音效添加

现在AI可以免费生成不带水印、不限时长的视频了&#xff0c;并且视频里的角色可以进行唇形同步配音。最重要的是&#xff0c;我还会分享给大家&#xff0c;怎么生成角色一致的动画场景&#xff0c;怎么使用场景图片生成完整的视频&#xff0c;并且我还会介绍一款&#xff0c;我…

COSCon'24 志愿者招募令:共创开源新生活!

亲爱的开源爱好者们&#xff0c; 第九届中国开源年会&#xff08;COSCon24&#xff09;即将在北京中关村国家自主创新示范区会议中心于2024年11月2日至3日隆重举行。今年的主题是“Open Source, Open Life&#xff5c;开源新生活”&#xff0c;旨在探索开源技术如何在各个领域推…

高级 SQL 技巧全面教程:提升你的数据库操作能力

高级 SQL 技巧全面教程&#xff1a;提升你的数据库操作能力 引言 在数据驱动的时代&#xff0c;SQL&#xff08;结构化查询语言&#xff09;是与数据库交互的核心工具。虽然基础 SQL 语法足以满足日常需求&#xff0c;但掌握一些高级技巧能够显著提高你的工作效率和数据处理能…

C++基础:三个字符串也能搞大小?

上一篇说了三个整数比较大小&#xff0c;按照顺序输入的&#xff0c;这次我们看看字符串的&#xff0c;顺便把那个简化以下&#xff1a; 题目:这次输入三个字符串。如果用户输入“Stenbeck", “Hemingway”,“Fitzgerald”,输出将是“Fitzgerald&#xff0c;Hemingway&…