Spring Boot 后端操作数据库

上一篇:Spring Boot 后端接收参数

一般使用三层架构来完成对数据库的操作:

  • 控制器层(ControllerLayer):负责处理 HTTP 请求,将请求内容传递给服务层进行处理。
  • 服务层(ServiceLayer):封装业务逻辑,处理来自控制器层的请求,与数据访问层交互。
  • 数据访问层(RepositoryLayer):负责与数据库进行交互,执行存储、查询、更新和删除操作。
  • 数据库(Database):实际存储数据的地方。
graph LR; ControllerLayer[控制器层] -->|调用| ServiceLayer[服务层]; ServiceLayer -->|调用| RepositoryLayer[数据访问层]; RepositoryLayer -->|访问| Database[数据库]; classDef layer fill:#f9f,stroke:#333,stroke-width:2px; classDef db fill:#bbf,stroke:#333,stroke-width:2px; class ControllerLayer,ServiceLayer,RepositoryLayer layer; class Database db;

在这个结构中,控制器层与服务层之间、服务层与数据访问层之间的关系是通过方法调用实现的,而数据访问层与数据库之间的关系是通过数据访问技术(如 JPA、JDBC)实现的。

我们在根包下创建以下目录结构:

.
├── DemoApplication.java
├── controller
├── model
├── repository
└── service

代码

模型类

模型类用于封装和表示业务实体,定义数据结构及其操作,并支持数据持久化和验证。

package com.example.demo.model;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Data;

@Entity
@Data
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String email;
}
  • @Id:表示主键

你可以把模型类当作数据库表。这里我们创建了一张 user 表。

控制器层

控制器层负责接收客户端请求,处理请求数据,并将结果返回给客户端,是应用程序与用户交互的桥梁。

controller/UserController.java

package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

import com.example.demo.model.User;
import com.example.demo.service.UserService;

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userService.saveUser(user);
    }
}
  • @Autowire:自动依赖注入

    通过 @Autowire,不再需要手动创建对象实例:

    @Autowired
    private UserService userService;
    

    等同于以下手动注入的代码:

    private UserService userService;
    
    public UserController(UserService userService) {
        this.userService = userService;
    }
    

这里控制器层通过调用服务层获取数据。

服务层

服务层负责封装应用程序的业务逻辑,处理数据传输和转换,并协调不同组件之间的交互。

service/UserService.java

package com.example.demo.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    public User saveUser(User user) {
        return userRepository.save(user);
    }
}

这里服务层只是简单地传递了一下数据,不过之后我们可以让它进行更复杂的操作。

数据访问层

数据访问层负责与数据库进行交互,执行数据的持久化操作,包括数据库的增删改查,以便为应用程序提供数据支持。

repository/UserRepository.java

package com.example.demo.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import com.example.demo.model.User;

public interface UserRepository extends JpaRepository<User, Long> {
}
  • 接口 UserRepository 继承了接口 JpaRepository 中的标准 CRUD 方法。
  • Spring Data JPA 会根据方法名自动生成相应的查询实现。因此,对于常用的 CRUD 方法我们无须自己实现。
  • 对于自定义方法,我们可以将实现写在 impl 子包中,并命名为 xxxImpl

配置

依赖

pom.xml

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.18.30</version>
	<scope>provided</scope>
</dependency>

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-jpa</artifactId>
	<version>3.4.1</version>
</dependency>

<dependency>
	<groupId>com.mysql</groupId>
	<artifactId>mysql-connector-j</artifactId>
	<version>9.1.0</version>
	<scope>runtime</scope>
</dependency>

Spring Boot 配置

demo/src/main/resources/application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/user_info?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

Spring Boot 会自动创建数据库。因此只要数据库连接填写正确,我们就不用手动编写 SQL 脚本建库。

测试

mvn clean package
mvn spring-boot:run

新建用户:

$ curl -X POST http://localhost:8080/users \
      -H "Content-Type: application/json" \
      -d '{"name": "Zhangsan", "email": "zhangsan@example.com"}'
{"id":1,"name":"Zhangsan","email":"zhangsan@example.com"}

查询所有用户:

$ curl -X GET http://localhost:8080/users
[{"id":1,"name":"Zhangsan","email":"zhangsan@example.com"}]
posted @ 2025-01-03 01:06  Undefined443  阅读(11)  评论(0编辑  收藏  举报