当前位置: 首页 > news >正文

Spring Boot 实战:构建 RESTful API 服务

一、引言

在当今的软件开发领域,快速构建高效、可维护的后端服务是至关重要的。Spring Boot 作为 Spring 框架的扩展,以其简化配置、快速开发的特性,成为了众多开发者的首选。本文将带领大家通过一个实战项目,详细介绍如何使用 Spring Boot 构建一个 RESTful API 服务,实现对用户信息的增删改查操作。

二、项目准备

2.1 开发环境

  • JDK:建议使用 JDK 8 及以上版本。
  • Maven:用于项目依赖管理。
  • IDE:可以选择 IntelliJ IDEA 或 Eclipse。

2.2 创建 Spring Boot 项目

我们可以使用 Spring Initializr(https://start.spring.io/)来快速创建项目。在该网站上,我们进行如下配置:

  • Project:选择 Maven Project。
  • Language:选择 Java。
  • Spring Boot:选择合适的版本,这里我们选择 2.7.10。
  • Group:填写项目的包名,例如 com.example
  • Artifact:填写项目名称,例如 user-api
  • Dependencies:添加以下依赖:
    • Spring Web:用于构建 RESTful API。
    • Spring Data JPA:用于数据库操作。
    • H2 Database:嵌入式数据库,方便开发测试。

点击 “Generate” 按钮下载项目压缩包,解压后导入到 IDE 中。

三、项目结构

项目创建完成后,其基本结构如下:

收起

plaintext

user-api/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           └── userapi/
│   │   │               ├── UserApiApplication.java
│   │   │               ├── controller/
│   │   │               ├── entity/
│   │   │               ├── repository/
│   │   │               └── service/
│   │   └── resources/
│   │       ├── application.properties
│   │       └── static/
│   │       └── templates/
├── pom.xml

  • UserApiApplication.java:项目的启动类。
  • controller 包:用于存放控制器类,处理 HTTP 请求。
  • entity 包:用于存放实体类,对应数据库表。
  • repository 包:用于存放数据访问接口,操作数据库。
  • service 包:用于存放业务逻辑类。
  • application.properties:项目配置文件。

四、实体类设计

在 entity 包下创建 User 实体类,使用 JPA 注解将其映射到数据库表。

收起

java

package com.example.userapi.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private int age;

    // 无参构造函数
    public User() {
    }

    // 有参构造函数
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getters 和 Setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

在上述代码中,@Entity 注解表示这是一个实体类,@Id 注解指定主键,@GeneratedValue 注解指定主键的生成策略。

五、数据访问层

在 repository 包下创建 UserRepository 接口,继承 JpaRepository 接口,该接口提供了基本的 CRUD 操作。

收起

java

package com.example.userapi.repository;

import com.example.userapi.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
}

JpaRepository 接口的第一个泛型参数是实体类类型,第二个泛型参数是主键类型。

六、业务逻辑层

在 service 包下创建 UserService 类,实现用户信息的增删改查业务逻辑。

收起

java

package com.example.userapi.service;

import com.example.userapi.entity.User;
import com.example.userapi.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    // 获取所有用户信息
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    // 根据 ID 获取用户信息
    public Optional<User> getUserById(Long id) {
        return userRepository.findById(id);
    }

    // 添加用户信息
    public User addUser(User user) {
        return userRepository.save(user);
    }

    // 更新用户信息
    public User updateUser(Long id, User updatedUser) {
        return userRepository.findById(id)
              .map(user -> {
                    user.setName(updatedUser.getName());
                    user.setAge(updatedUser.getAge());
                    return userRepository.save(user);
                })
              .orElseGet(() -> {
                    updatedUser.setId(id);
                    return userRepository.save(updatedUser);
                });
    }

    // 删除用户信息
    public void deleteUser(Long id) {
        userRepository.deleteById(id);
    }
}

在上述代码中,@Service 注解表示这是一个业务逻辑类,@Autowired 注解用于自动注入 UserRepository 实例。

七、控制器层

在 controller 包下创建 UserController 类,处理 HTTP 请求,调用业务逻辑层的方法。

收起

java

package com.example.userapi.controller;

import com.example.userapi.entity.User;
import com.example.userapi.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/api/users")
public class UserController {
    @Autowired
    private UserService userService;

    // 获取所有用户信息
    @GetMapping
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }

    // 根据 ID 获取用户信息
    @GetMapping("/{id}")
    public ResponseEntity<User> getUserById(@PathVariable Long id) {
        Optional<User> user = userService.getUserById(id);
        return user.map(value -> new ResponseEntity<>(value, HttpStatus.OK))
              .orElseGet(() -> new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }

    // 添加用户信息
    @PostMapping
    public ResponseEntity<User> addUser(@RequestBody User user) {
        User savedUser = userService.addUser(user);
        return new ResponseEntity<>(savedUser, HttpStatus.CREATED);
    }

    // 更新用户信息
    @PutMapping("/{id}")
    public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User updatedUser) {
        User user = userService.updateUser(id, updatedUser);
        return new ResponseEntity<>(user, HttpStatus.OK);
    }

    // 删除用户信息
    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }
}

在上述代码中,@RestController 注解表示这是一个 RESTful 控制器,@RequestMapping 注解指定请求的基础路径。不同的 HTTP 请求方法(@GetMapping@PostMapping@PutMapping@DeleteMapping)对应不同的操作。

八、配置文件

在 application.properties 文件中进行数据库配置:

收起

properties

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.h2.console.enabled=true
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update

上述配置使用 H2 嵌入式数据库,spring.h2.console.enabled=true 表示开启 H2 数据库控制台,方便我们查看数据库内容。

九、测试 API

启动项目后,我们可以使用 Postman 或其他 API 测试工具来测试我们的 RESTful API。

  • 获取所有用户信息:发送 GET 请求到 http://localhost:8080/api/users
  • 根据 ID 获取用户信息:发送 GET 请求到 http://localhost:8080/api/users/{id},例如 http://localhost:8080/api/users/1
  • 添加用户信息:发送 POST 请求到 http://localhost:8080/api/users,请求体为 JSON 格式,例如:

收起

json

{
    "name": "John Doe",
    "age": 30
}

  • 更新用户信息:发送 PUT 请求到 http://localhost:8080/api/users/{id},请求体为 JSON 格式,例如:

收起

json

{
    "name": "Jane Doe",
    "age": 32
}

  • 删除用户信息:发送 DELETE 请求到 http://localhost:8080/api/users/{id},例如 http://localhost:8080/api/users/1

十、总结

通过本文的实战项目,我们学习了如何使用 Spring Boot 构建一个简单的 RESTful API 服务。从项目创建、实体类设计、数据访问层、业务逻辑层到控制器层的开发,以及数据库配置和 API 测试,我们对 Spring Boot 的开发流程有了更深入的了解。Spring Boot 的简化配置和强大的功能使得我们能够快速开发出高效、可维护的后端服务。在实际项目中,我们可以根据需求进一步扩展功能,例如添加数据验证、日志记录、安全认证等。

相关文章:

  • Vue 项目中配置代理的必要性与实现指南
  • ChatGPT入驻Safari,AI搜索时代加速到来
  • 打包rocketmq-dashboard报错问题记录
  • 游戏引擎学习第125天
  • 免费使用SCI润色神器QuillBot
  • LabVIEW同步数据采集功能
  • 力扣1:两数之和
  • mac设置 pip 的镜像
  • Windows逆向工程入门之LOOP与REP指令的深度解析
  • Ubuntu 20.04环境下安装cuda、cuDNN和pytorch
  • 计算机毕设-基于springboot的仁和机构的体检预约系统的设计与实现(附源码+lw+ppt+开题报告)
  • 安科瑞AM5SE-IS防孤岛保护装置:新能源领域的“安全卫士“-安科瑞 耿笠
  • 记一次线上Tomcat服务内存溢出的问题处理
  • vue3使用iframe全屏展示pdf效果
  • 基于 Spring Boot +VUE的 “机动车号牌管理系统” 系统的设计与实现
  • JavaScript 系列之:Ajax、Promise、Axios
  • <网络> 网络基础3
  • 建筑三维设计软件如何实现弯道超车?
  • AI知识架构之神经网络
  • 【Cursor】报错:FATAL:v8_initializer.cc(630)] Error loading V8 startup snapshot file
  • 福建厦门市副市长、市公安局局长陈育煌出任吉林省公安厅厅长
  • 真人秀《幸存者》百万美元奖金,25年间“缩水”近一半
  • 18世纪“精于剪切、复制、粘贴”的美国新闻界
  • 韩国大选连发“五月惊奇”:在野党刚“摆脱”官司,执政党又生“内讧”
  • 云南多地突查公职人员违规饮酒:公安局门口开展酒精吹气测试
  • 印度最新发声:对所有敌对行动均予以反击和回应,不会升级冲突