Spring Data JPA 集成 PostgreSQL 完整教程
这是最简洁、可直接运行的 Spring Boot + Spring Data JPA + PostgreSQL 集成方案,包含完整配置、实体类、Repository、测试代码。
一、环境准备
- JDK 8+
- Spring Boot 2.x/3.x
- PostgreSQL 10+(本地/远程均可)
- Maven/Gradle
二、核心依赖(pom.xml)
<!-- Spring Boot Web (可选) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Data JPA 核心依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- PostgreSQL 驱动 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
三、application.yml 配置(推荐)
spring:
# 数据源配置
datasource:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://localhost:5432/你的数据库名
username: 数据库用户名
password: 数据库密码
# JPA 配置
jpa:
hibernate:
# 自动创建/更新表(生产环境建议 none)
ddl-auto: update
# 显示 SQL 语句
show-sql: true
properties:
hibernate:
# 格式化 SQL
format_sql: true
# 指定数据库方言
database-platform: org.hibernate.dialect.PostgreSQLDialect
关键配置说明
ddl-auto: update:自动根据实体类创建/更新表,无需手动建表database-platform:必须指定 PostgreSQL 方言,适配 pgsql 语法- 生产环境建议:
ddl-auto: none,避免自动修改表结构
四、编写实体类(映射 PostgreSQL 表)
以用户表 sys_user 为例:
import jakarta.persistence.*; // Spring Boot 3.x
// Spring Boot 2.x 用 import javax.persistence.*;
import lombok.Data;
@Data
@Entity
@Table(name = "sys_user") // 映射 PostgreSQL 表名
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "username", unique = true, nullable = false, length = 50)
private String username;
@Column(name = "password", nullable = false, length = 100)
private String password;
@Column(name = "email", length = 100)
private String email;
@Column(name = "age")
private Integer age;
}
五、编写 Repository 接口(继承 JPA)
直接继承 JpaRepository,无需写 SQL 即可实现增删改查:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// 可自定义方法,JPA 自动实现
User findByUsername(String username);
}
六、测试(Service/Controller)
1. Service 层
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
// 新增/更新用户
public User saveUser(User user) {
return userRepository.save(user);
}
// 根据ID查询
public User getUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
// 查询所有
public List<User> getAllUsers() {
return userRepository.findAll();
}
// 删除
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
}
2. Controller 层(测试接口)
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@PostMapping("/save")
public User save(@RequestBody User user) {
return userService.saveUser(user);
}
@GetMapping("/{id}")
public User get(@PathVariable Long id) {
return userService.getUserById(id);
}
@GetMapping("/list")
public List<User> list() {
return userService.getAllUsers();
}
@DeleteMapping("/{id}")
public String delete(@PathVariable Long id) {
userService.deleteUser(id);
return "删除成功";
}
}
七、启动测试
- 启动 Spring Boot 项目
- 自动在 PostgreSQL 中创建
sys_user表 - 调用接口即可完成数据操作
常见问题解决
1. 连接失败
检查:
- PostgreSQL 服务是否启动
- 数据库名、账号、密码是否正确
- 防火墙/安全组开放 5432 端口
2. 表创建失败
- 确认
ddl-auto: update - 检查实体类
@Entity、@Id注解是否添加
3. Spring Boot 3.x 报错
必须使用 jakarta.persistence 包,不能用 javax.persistence
总结
- 只需3步完成集成:引入依赖 → 配置数据源 → 写实体+Repository
- Spring Data JPA 自动实现 CRUD,零 SQL 开发
- PostgreSQL 适配核心:驱动 + 方言 + 正确连接地址
- 生产环境关闭
ddl-auto,保证数据安全