SpringBoot的初学习(一)

309 阅读8分钟

前言

本人是一名27届双非本科前端程序员,受实验室师兄的鼓舞,想把近日学习springboot框架的学习知识总结起来。首先,为什么要学这个?因为我想自己快速开发一个后台管理系统,想学会自己写crud的操作,在b站花了五个晚上学习了黑马的springboot+vue的课程之后,我深受启发,想以文章的方式来记录我的学习过程,也方便以后回过头来复习。有错误还请掘友批评指正!!

一、SpringBoot是什么?

Spring Boot 是 Java 领域的一个开源框架,由 Pivotal 团队(现属 VMware)开发,旨在简化 Spring 应用的初始搭建和开发流程。它基于 Spring 框架,但通过“约定优于配置”的理念,大幅减少了传统 Spring 应用所需的复杂配置,让开发者能快速构建生产级的独立应用。

1-主要特点:

  1. 开箱即用
    提供预配置的默认设置(如内嵌 Tomcat/Jetty 服务器、默认数据库连接池等),无需手动配置即可直接运行。
  2. 自动配置(Auto-Configuration)
    根据项目依赖(如添加 spring-boot-starter-data-jpa 会自动配置 JPA 相关组件)智能推断并加载所需配置。
  3. 内嵌服务器
    无需部署到外部 Web 服务器,打包成可执行的 JAR 文件后,通过 java -jar 命令即可启动服务。
  4. Starter 依赖
    提供一系列预定义的依赖包(如 spring-boot-starter-web 整合了 Web 开发常用库),解决传统 Maven/Gradle 依赖冲突问题。
  5. 生产就绪功能
    集成健康检查、指标监控(通过 Spring Boot Actuator)、外部化配置(支持 application.yml 多环境配置)等企业级特性。

2-创建springboot工程

我这里使用的IDEA来创建工程,首先在右上角打开文件,点击我们的项目结构。

1698b0c99f419a3615b13aab59cc24c.png

在里面选择我们的模块,然后点击+号,点击新建模块。

e4567a83479059a3f0dba96b83e6186.png

点击新建模块之后,我们直接选择**Spring Boot**,然后给我们的项目起名称(我这里选择**ac-back**),然后选择好我们要存放的项目位置,语言还是**java**,类型选择**Maven**,组的话我们依自己需要而定,我这边写**com.ac**,然后**JDK**我的是17版本的,打包我们默认**Jar**即可。

31dc3b6867cebb48555fc3bd82c0e89.png

点击下一步,来到选择依赖项这里
我们可以选择上**Web**下面的**Spring Web**(用于简化基于 Java 的 Web 应用开发,支持快速构建 RESTful API 和 MVC 架构的 Web 服务。)
还有我们的**Mybatis**(简化数据库操作的持久层框架,通过 XML/注解将 SQL 与 Java 对象映射。)和**MySQL**(开源关系型数据库,用于结构化数据存储和管理)
**Lombok**(通过注解(如 `@Data`)自动生成 Java 代码(如 getter/setter),减少冗余代码)。我们先勾选上,后面都是会用到的--勾选后确认,然后点击应用,再点击确定我们就完成新建模块啦~~。

image.png

1e3680c954995fb567faae873dac269.png

52c9865278e0a2d1d84184e0dd279c1.png

然后我们找到ac-back/pom.xml文件(我们引入依赖项的地方都在这里)。可以看看依赖是否都引入了:

1740153814106.png

下边则是我们的目录结构:我们新建软件包:

927aa33a9099407a0ab105eb69d3268.png

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(对象关系映射)和数据传输。
    典型代码:包含属性(如idname)、Getter/Setter方法。

4. service包(含impl子包)

  • service包:定义业务逻辑接口。

    • 接口声明核心业务方法(如UserService接口定义addUser())。
  • impl子包:存放接口的具体实现类。

    • 实现业务逻辑(如数据校验、事务管理)。
    • 调用mapper层操作数据库。
      典型代码:接口用public interface UserService,实现类用@Service注解。

5. utils包

作用:存放工具类,提供通用功能。

  • 包含静态方法,避免重复代码(如日期格式化、加密解密)。
  • 独立于业务逻辑,可全局复用。
    典型代码StringUtilsDateUtils等工具类,使用public static方法。

分层调用流程

  1. 用户请求 → controller接收 → 调用service → service调用mapper → 操作数据库。
  2. 数据流动pojo对象在controllerservicemapper之间传递。
  3. 工具类:在任意层按需调用(如生成Token、参数校验)。

这种分层结构职责清晰,便于维护和扩展,是典型的MVC架构实践。

注册接口

项目创建完毕之后,就要开始我们有趣的写接口的旅途了!我们先引入我们的实体类(User.java),里面还要加上NotEmpty非空和NotNUll,Pattern是正则。

1740155074788.png

1740155112509.png 里面的分别对应我们数据库的字段:

1740155157031.png

然后我们在controller包里面新建一个UserController类:

image.png

然后第一步引入我们的@RestController和@RequestMapping("/user")

1. @RestController 的作用

  • 简化控制器声明
    它是 @Controller 和 @ResponseBody 的组合注解,表示当前类是一个 REST 风格的控制器,所有方法的返回值会直接以 JSON/XML 格式写入 HTTP 响应体,而非跳转视图
  • 适用场景
    适用于前后端分离的 Web 服务,直接返回数据(如 JSON)给客户端,而非服务端渲染页面。

2. @RequestMapping("/user") 的作用

  • 定义请求路径映射

    • 若注解在上:表示该控制器下所有方法的 URL 都以 /user 为根路径(例如 /user/list)。
    • 若注解在方法上:表示该方法的 URL 是类路径的扩展(例如 /user/{id})。
  • 支持 HTTP 方法
    可通过 method 属性指定具体的 HTTP 请求类型(如 GETPOST),例如:

@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接口)

1740156349373.png 就会自动给我们创建方法,然后我们在impl包内创建UserServiceImpl来实现(记住一定要写implements)这个接口。

image.png 代码如下:


@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操作我们的数据库了:

1740156816768.png

在此之前:我们要进入我们的appliation.yml文件里面配置我们的数据,连接好我们的数据库:

1740156921885.png 最后我们就可以来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 + "}";
    }
}