【Java 后端】Spring Boot 集成 JPA 全攻略

发布于:2025-08-15 ⋅ 阅读:(16) ⋅ 点赞:(0)

Spring Boot 集成 JPA 全攻略

一、前言

在 Java Web 开发中,数据库访问是绕不开的话题。
传统方式使用 JDBC 编写 SQL,维护困难、可读性差。后来有了 MyBatis 这种半自动 ORM 框架,再到 JPA(Java Persistence API)这种全自动 ORM 规范,可以让我们用面向对象的方式操作数据库,而不必写大量 SQL。

Spring Boot 对 JPA 提供了非常友好的自动化支持,几乎可以“零配置”就完成数据库操作。


二、JPA 简介

JPA(Java Persistence API)并不是一个具体实现,而是 Java 官方定义的 ORM 规范,它的常见实现有:

  • Hibernate(最常用,Spring Boot 默认 JPA 实现)
  • EclipseLink
  • OpenJPA

核心思想
实体类(Entity)映射数据库表,用 方法调用 代替手写 SQL。
例如:

// 查询所有用户
List<User> users = userRepository.findAll();

// 根据用户名查询
User user = userRepository.findByUsername("Tom");

三、项目环境准备

1. 新建 Spring Boot 项目

Spring Initializr 选择:

  • Spring Boot 版本:3.x(或 2.7.x)

  • 依赖:

    • Spring Web
    • Spring Data JPA
    • MySQL Driver

生成后导入 IDE(IntelliJ IDEA / VSCode)。


2. Maven 依赖

如果是手动添加,pom.xml 配置如下:

<dependencies>
    <!-- Spring 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>

    <!-- MySQL 驱动 -->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- 测试依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

3. 配置数据库连接

application.yml 中配置:

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

  jpa:
    hibernate:
      ddl-auto: update   # 自动建表(create、update、validate、none)
    show-sql: true       # 控制台打印 SQL
    properties:
      hibernate:
        format_sql: true # 格式化 SQL 输出

ddl-auto 参数说明:

  • create:每次启动删除旧表,创建新表
  • update:如果表不存在则创建,如果有新字段则更新
  • validate:验证表结构和实体类是否匹配
  • none:不做任何处理

四、编写 JPA 样例

1. 创建实体类

User.java

package com.example.jpademo.entity;

import jakarta.persistence.*;
import lombok.Data;

@Data
@Entity
@Table(name = "users") // 表名
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 自增主键
    private Long id;

    @Column(nullable = false, unique = true, length = 50)
    private String username;

    @Column(nullable = false)
    private String password;
}

2. 创建 Repository 接口

UserRepository.java

package com.example.jpademo.repository;

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

public interface UserRepository extends JpaRepository<User, Long> {
    // 按用户名查找
    User findByUsername(String username);
}

JpaRepository 已经内置了大量方法:save()findAll()findById()deleteById() 等。


3. 创建 Service 层

UserService.java

package com.example.jpademo.service;

import com.example.jpademo.entity.User;
import com.example.jpademo.repository.UserRepository;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

    private final UserRepository userRepository;
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

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

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

4. 创建 Controller

UserController.java

package com.example.jpademo.controller;

import com.example.jpademo.entity.User;
import com.example.jpademo.service.UserService;
import org.springframework.web.bind.annotation.*;

import java.util.List;

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

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

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

    @PostMapping
    public User add(@RequestBody User user) {
        return userService.createUser(user);
    }
}

五、运行测试

  1. 启动 Spring Boot 项目(IDEA Run

  2. 使用 Postman 测试:

    • 新增用户

      POST http://localhost:8080/users
      Content-Type: application/json
      
      {
        "username": "Tom",
        "password": "123456"
      }
      
    • 查询所有用户

      GET http://localhost:8080/users
      

控制台会输出类似:

insert into users (password, username) values (?, ?)
select u1_0.id, u1_0.password, u1_0.username from users u1_0

六、常见问题

  1. 为什么启动时会自动建表?
    因为 spring.jpa.hibernate.ddl-auto 设置了 update,Hibernate 会自动根据实体生成表结构。

  2. 不想自动建表怎么办?
    ddl-auto 改成 nonevalidate,用手动 SQL 建表。

  3. 怎么写复杂 SQL?

    • 方法名查询:findByUsernameAndPassword
    • JPQL 查询:@Query("select u from User u where u.username = ?1")
    • 原生 SQL:@Query(value = "select * from users where username = ?1", nativeQuery = true)

七、总结

Spring Boot 集成 JPA 最大的优点就是:

  • 几乎零配置即可运行
  • 面向对象操作数据库,减少 SQL 编写
  • 内置方法丰富,支持分页、排序、条件查询
  • 复杂 SQL 也可以灵活编写

但要注意:

  • 适合中小型业务,超复杂 SQL 可能 MyBatis 更高效
  • ddl-auto 在生产环境建议设为 none,防止误删表
  • 尽量用事务(@Transactional)保证数据一致性


网站公告

今日签到

点亮在社区的每一天
去签到