前言
本人是一名27届双非本科前端程序员,受实验室师兄的鼓舞,想把近日学习springboot框架的学习知识总结起来。首先,为什么要学这个?因为我想自己快速开发一个后台管理系统,想学会自己写crud的操作,在b站花了五个晚上学习了黑马的springboot+vue的课程之后,我深受启发,想以文章的方式来记录我的学习过程,也方便以后回过头来复习。有错误还请掘友批评指正!!
一、SpringBoot是什么?
Spring Boot 是 Java 领域的一个开源框架,由 Pivotal 团队(现属 VMware)开发,旨在简化 Spring 应用的初始搭建和开发流程。它基于 Spring 框架,但通过“约定优于配置”的理念,大幅减少了传统 Spring 应用所需的复杂配置,让开发者能快速构建生产级的独立应用。
1-主要特点:
- 开箱即用
提供预配置的默认设置(如内嵌 Tomcat/Jetty 服务器、默认数据库连接池等),无需手动配置即可直接运行。 - 自动配置(Auto-Configuration)
根据项目依赖(如添加spring-boot-starter-data-jpa会自动配置 JPA 相关组件)智能推断并加载所需配置。 - 内嵌服务器
无需部署到外部 Web 服务器,打包成可执行的 JAR 文件后,通过java -jar命令即可启动服务。 - Starter 依赖
提供一系列预定义的依赖包(如spring-boot-starter-web整合了 Web 开发常用库),解决传统 Maven/Gradle 依赖冲突问题。 - 生产就绪功能
集成健康检查、指标监控(通过 Spring Boot Actuator)、外部化配置(支持application.yml多环境配置)等企业级特性。
2-创建springboot工程
我这里使用的IDEA来创建工程,首先在右上角打开文件,点击我们的项目结构。
在里面选择我们的模块,然后点击+号,点击新建模块。
我们可以选择上**Web**下面的**Spring Web**(用于简化基于 Java 的 Web 应用开发,支持快速构建 RESTful API 和 MVC 架构的 Web 服务。)
还有我们的**Mybatis**(简化数据库操作的持久层框架,通过 XML/注解将 SQL 与 Java 对象映射。)和**MySQL**(开源关系型数据库,用于结构化数据存储和管理)
**Lombok**(通过注解(如 `@Data`)自动生成 Java 代码(如 getter/setter),减少冗余代码)。我们先勾选上,后面都是会用到的--勾选后确认,然后点击应用,再点击确定我们就完成新建模块啦~~。
然后我们找到ac-back/pom.xml文件(我们引入依赖项的地方都在这里)。可以看看依赖是否都引入了:
下边则是我们的目录结构:我们新建软件包:
1. controller包
作用:负责处理HTTP请求和响应,是前后端交互的入口。
- 接收客户端请求(如浏览器、移动端),解析参数。
- 调用
service层处理业务逻辑。 - 返回响应数据(如JSON、页面跳转)。
典型代码:使用@RestController或@Controller注解,定义API接口(如@GetMapping、@PostMapping)。
2. mapper包
作用:数据持久层,直接操作数据库。
- 定义与数据库表交互的接口(如增删改查SQL)。
- 通过MyBatis的
@Mapper注解或XML文件实现SQL映射。
典型代码:接口方法对应SQL语句(如@Select("SELECT * FROM user"))。
3. pojo包
作用:存放实体类(Plain Old Java Object),对应数据库表结构。
- 每个类表示一个数据模型(如
User类对应user表)。 - 用于ORM(对象关系映射)和数据传输。
典型代码:包含属性(如id,name)、Getter/Setter方法。
4. service包(含impl子包)
-
service包:定义业务逻辑接口。
- 接口声明核心业务方法(如
UserService接口定义addUser())。
- 接口声明核心业务方法(如
-
impl子包:存放接口的具体实现类。
- 实现业务逻辑(如数据校验、事务管理)。
- 调用
mapper层操作数据库。
典型代码:接口用public interface UserService,实现类用@Service注解。
5. utils包
作用:存放工具类,提供通用功能。
- 包含静态方法,避免重复代码(如日期格式化、加密解密)。
- 独立于业务逻辑,可全局复用。
典型代码:StringUtils、DateUtils等工具类,使用public static方法。
分层调用流程
- 用户请求 →
controller接收 → 调用service→service调用mapper→ 操作数据库。 - 数据流动:
pojo对象在controller、service、mapper之间传递。 - 工具类:在任意层按需调用(如生成Token、参数校验)。
这种分层结构职责清晰,便于维护和扩展,是典型的MVC架构实践。
注册接口
项目创建完毕之后,就要开始我们有趣的写接口的旅途了!我们先引入我们的实体类(User.java),里面还要加上NotEmpty非空和NotNUll,Pattern是正则。
里面的分别对应我们数据库的字段:
然后我们在controller包里面新建一个UserController类:
然后第一步引入我们的@RestController和@RequestMapping("/user")
1. @RestController 的作用
- 简化控制器声明:
它是@Controller和@ResponseBody的组合注解,表示当前类是一个 REST 风格的控制器,所有方法的返回值会直接以 JSON/XML 格式写入 HTTP 响应体,而非跳转视图。 - 适用场景:
适用于前后端分离的 Web 服务,直接返回数据(如 JSON)给客户端,而非服务端渲染页面。
2. @RequestMapping("/user") 的作用
-
定义请求路径映射:
- 若注解在类上:表示该控制器下所有方法的 URL 都以
/user为根路径(例如/user/list)。 - 若注解在方法上:表示该方法的 URL 是类路径的扩展(例如
/user/{id})。
- 若注解在类上:表示该控制器下所有方法的 URL 都以
-
支持 HTTP 方法:
可通过method属性指定具体的 HTTP 请求类型(如GET,POST),例如:
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
接下来,我们在UserController函数里面开始写我们的第一个注册接口("/register")咯~~
以下是我们的接口:接下来我会解释每个步骤:
//1-依赖注入
@RestController
@RequestMapping("/user")
@Validated //校验
public class UserController {
@Autowired
private UserService userService;
@Autowired
private StringRedisTemplate stringRedisTemplate;
//- @Autowired:Spring框架的自动注入注解
//- UserService:业务逻辑层组件,负责用户相关操作
//- StringRedisTemplate:Redis操作工具(当前代码未实际使用该组件)
//2-请求映射与参数接收
- @PostMapping("/register"):处理POST请求,路径为/register
//-参数校验:
// -使用`@Pattern`进行正则表达式验证
// -^\S{5,16}$ 表示非空字符且长度5-16位
// -拒绝包含空格等空白字符的输入
@PostMapping("/register")
public Result register(@Pattern(regexp = "^\S{5,16}$") String username, @Pattern(regexp = "^\S{5,16}$") String password) {
//3. 注册流程
//查询用户
User u = userService.findByUserName(username);
if (u == null) {
//没有占用,注册
userService.register(username, password);
return Result.success();
} else {
//占用
return Result.error("用户名已被占用");
}
//-查询用户:通过用户名检查是否已存在
//- 注册逻辑:
// -用户不存在时:调用注册方法 → 返回成功
// -用户存在时:返回错误提示
}
}
写好Controller类之后,我们按住alt+enter来到Service层(要先在service包创建好UserService接口)
就会自动给我们创建方法,然后我们在impl包内创建UserServiceImpl来实现(记住一定要写implements)这个接口。
代码如下:
@Autowired
private UserMapper userMapper;
/*- 作用:通过 Spring 的 `@Autowired` 注解自动注入 `UserMapper` 实例。
- 原理:
-Spring 容器会查找与 UserMapper 类型匹配的 Bean。
-如果使用 MyBatis,通常通过 @MapperScan 或 XML 配置将 Mapper 接口注册为 Spring Bean。
-注入后,可以直接调用 UserMapper 的数据库操作方法。*/
@Override
public User findByUserName(String username) {
User u= userMapper.findByUserName(username);
return u;
}
- 作用:根据用户名查询用户。
- 步骤:
1. 调用 Mapper 方法:`userMapper.findByUserName(username)` 执行实际的数据库查询。
2. 返回结果:将从数据库获取的 `User` 对象直接返回给调用方。
最后我们就可以来mapper的UserMapper操作我们的数据库了:
在此之前:我们要进入我们的appliation.yml文件里面配置我们的数据,连接好我们的数据库:
最后我们就可以来Application里面运行了,然后我们可以去postman里面测试我们的接口即可;
在此附上我的Result.java。
package com.itheima.pojo;
//统一响应结果
public class Result<T> {
private Integer code;//业务状态码 0-成功 1-失败
private String message;//提示信息
private T data;//响应数据
public Result() {
}
public Result(Integer code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
//快速返回操作成功响应结果(带响应数据)
public static <E> Result<E> success(E data) {
return new Result<>(0, "操作成功", data);
}
//快速返回操作成功响应结果
public static Result success() {
return new Result(0, "操作成功", null);
}
public static Result error(String message) {
return new Result(1, message, null);
}
/**
* 获取
* @return code
*/
public Integer getCode() {
return code;
}
/**
* 设置
* @param code
*/
public void setCode(Integer code) {
this.code = code;
}
/**
* 获取
* @return message
*/
public String getMessage() {
return message;
}
/**
* 设置
* @param message
*/
public void setMessage(String message) {
this.message = message;
}
/**
* 获取
* @return data
*/
public T getData() {
return data;
}
/**
* 设置
* @param data
*/
public void setData(T data) {
this.data = data;
}
public String toString() {
return "Result{code = " + code + ", message = " + message + ", data = " + data + "}";
}
}