在后端开发领域,SpringBoot 凭借其 "约定优于配置" 的核心思想,极大简化了 Spring 应用的搭建与开发流程。SpringBoot3 作为其最新稳定版本,不仅兼容 Spring 6 的核心特性,还在性能优化、原生镜像支持等方面有显著提升。本文将从项目搭建、核心配置、分层开发、统一返回与异常处理等维度,详细讲解 SpringBoot3 项目的构建与工程设计,帮助开发者快速上手。
一、项目整体架构设计
1. 技术栈选型
1.1 后端技术栈
核心框架:SpringBoot3(基于 Java17,简化 Spring 配置,提升开发效率)
数据持久层:MyBatis-Plus(简化 MySQL 操作,提供 CRUD 接口、分页插件等)
数据库:MySQL8.0(存储用户核心数据)
工具类:Lombok(简化实体类代码)、FastJSON(JSON 数据序列化 / 反序列化)
接口文档:Knife4j(基于 Swagger,自动生成接口文档,方便前后端联调)
1.2 前端技术栈
核心框架:Vue3(Composition API 语法,响应式更高效)
UI 组件库:Element-Plus(适配 Vue3 的 UI 组件库,提供表格、表单、弹窗等常用组件)
网络请求:Axios(封装请求拦截器、响应拦截器,统一处理接口请求)
路由管理:Vue Router4(实现页面跳转与路由守卫)
状态管理:Pinia(Vue3 官方推荐,替代 Vuex,轻量高效)
2. 架构流程图
前端(Vue3 + Element-Plus)
│
├─ 页面组件(用户列表、新增/编辑弹窗)
├─ 网络请求(Axios 封装)
├─ 路由管理(Vue Router)
└─ 状态管理(Pinia)
│
▼
HTTP 请求(RESTful API)
│
▼
后端(SpringBoot3)
│
├─ 控制层(Controller:接收请求、返回响应)
├─ 服务层(Service:业务逻辑处理)
├─ 持久层(Mapper:MyBatis-Plus 数据访问)
├─ 实体层(Entity:数据库表映射)
├─ 公共组件(统一返回、全局异常处理)
└─ 接口文档(Knife4j)
│
▼
数据库(MySQL8.0)
3. 核心功能模块
用户列表展示:表格形式展示用户 ID、用户名、生日、性别、地址等信息,支持分页加载
条件查询功能:根据用户名、地址筛选用户数据,支持清空查询条件
新增用户功能:通过弹窗表单收集用户信息,表单校验后提交至后端
编辑用户功能:回显选中用户信息至弹窗,修改后提交更新
删除功能:支持单条用户删除、批量用户删除,删除前弹出确认提示
数据格式化:对生日字段进行统一格式化(年 - 月 - 日),提升页面可读性
二、IDEA创建Spring Boot

删除无用的文件

然后在pom.xml文件当中进行配置

配置maven

选择 pom.xml 然后加载依赖

三、Spring boot内容简介

四、pom.xml文件

spring-boot-dependencies:核心依赖在父工程里面
我们在写或者引入一些SpringBoot依赖的时候,不需要指定版本
启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
启动器:说白了就是SpringBoot启动的场景
比如Spring-boot-srarter-web,他会帮助我们自动导入web环境所有的依赖
SpringBoot会将所有的功能场景,都变成一个个的启动器
我们需要使用的功能,只需要找到他们的启动器便可以进行使用

启动成功

加载web启动
<!--加载web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
controller层
@RestController
public class HelloController {
@RequestMapping("/hello")
public String getHello(){
return "Hello world";
}
}
配置文件
server.port=8081
访问地址:http://localhost:8081/hello

五、统一返回包装类 Result

包装类:作用是统一后端返回的数据类型,code 是作为前端判断请求成功的依据,msg 是错误的信息,data 是返回给前端的数据
public class Result {
private String code;
private Object data;
private String msg;
public static Result success() {
Result result = new Result();
result.setCode("200");
result.setMsg("请求成功");
return result;
}
public static Result success(Object data) {
Result result = new Result();
result.setCode("200");
result.setData(data);
result.setMsg("请求成功");
return result;
}
public static Result error(String msg) {
Result result = new Result();
result.setCode("500");
result.setMsg(msg);
return result;
}
public static Result error(String code, String msg) {
Result result = new Result();
result.setCode(code);
result.setMsg(msg);
return result;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
更改返回的数据形式

六、500 错误:常见的系统的错误

抛出这些错误非常不友好,我们应该使用统一的处理方式

配置日志
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

@ControllerAdvice("com.qcby.springboot.controller")
public class GlobalExceptionHandler {
private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(Exception.class)
@ResponseBody // 将result对象转换成 json的格式
public Result error(Exception e) {
log.error("系统异常", e);
return Result.error("系统异常");
}
}
系统异常怎么办
你得看你的控制台,然后找到报错的代码位置,具体去修正代码
自定义异常

/**
* 自定义异常
* 运行时异常
*/
public class CustomerException extends RuntimeException {
private String code;
private String msg;
public CustomerException(String code, String msg) {
this.code = code;
this.msg = msg;
}
public CustomerException(String msg) {
this.code = "500";
this.msg = msg;
}
public CustomerException() {}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
最终版全局异常
/**
* 全局异常捕获器
* @ControllerAdvice("com.qcby.springboot.controller")
* 指定该全局异常处理器作用于 com.qcby.springboot.controller 包下的控制器。
*/
@ControllerAdvice("com.qcby.springboot.controller")
public class GlobalExceptionHandler {
private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
/**
* 全局异常捕获器
* @param e
* @return
*/
@ExceptionHandler(Exception.class)
@ResponseBody // 将result对象转换成 json的格式
public Result error(Exception e) {
log.error("系统异常", e);
return Result.error("系统异常");
}
/**
* 自定义异常捕获器
* @param e
* @return
*/
@ExceptionHandler(CustomerException.class)
@ResponseBody // 将result对象转换成 json的格式
public Result customerError(CustomerException e) {
log.error("自定义错误", e);
return Result.error(e.getCode(), e.getMsg());
}
}
测试自定义异常
controller测试接口
@GetMapping("/admin")
public Result admin(String name) {
String admin = adminService.admin(name);
return Result.success(admin);
}
service
package com.example.service;
import com.example.exception.CustomerException;
import org.springframework.stereotype.Service;
@Service
public class AdminService {
public String admin(String name) {
if ("admin".equals(name)) {
return "admin";
} else {
throw new CustomerException("账号错误");
}
}
}