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
。
配置
依赖
-
MySQL Connector/J:连接数据库
-
Project Lombok:自动生成常见代码片段
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"}]