SpringBoot集成JPA全指南

 更新时间:2025年08月17日 10:16:21   作者:柯南二号  
在Java Web开发中,数据库访问是绕不开的话题,传统方式使用JDBC编写SQL,维护困难、可读性差,后来有了MyBatis这种半自动ORM框架,再到JPA这种全自动ORM规范,SpringBoot对JPA提供了非常友好的自动化支持,本文给大家介绍了SpringBoot集成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);
    }
}

五、运行测试

启动 Spring Boot 项目(IDEA Run

使用 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

六、常见问题

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

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

怎么写复杂 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)保证数据一致性

以上就是SpringBoot集成JPA全指南的详细内容,更多关于SpringBoot集成JPA的资料请关注脚本之家其它相关文章!

相关文章

  • Java中为什么要实现Serializable序列化

    Java中为什么要实现Serializable序列化

    在Java编程中,Serializable序列化是一个常见的概念,它允许对象在网络上传输或持久化到磁盘上,本文将深入探讨为什么在Java中要实现Serializable序列化,并通过示例代码来解释其重要性
    2023-10-10
  • 详解Java设计模式之单例模式

    详解Java设计模式之单例模式

    这篇文章主要为大家详细介绍了Java设计模式之单例模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • JAVA实战练习之图书管理系统实现流程

    JAVA实战练习之图书管理系统实现流程

    随着网络技术的高速发展,计算机应用的普及,利用计算机对图书馆的日常工作进行管理势在必行,本篇文章手把手带你用Java实现一个图书管理系统,大家可以在过程中查缺补漏,提升水平
    2021-10-10
  • 举例详解Java编程中HashMap的初始化以及遍历的方法

    举例详解Java编程中HashMap的初始化以及遍历的方法

    这篇文章主要介绍了Java编程中HashMap的初始化以及遍历的方法,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • SpringBoot整合jnotify实现针对指定目录及其(动态)子目录的监听的方法

    SpringBoot整合jnotify实现针对指定目录及其(动态)子目录的监听的方法

    本文介绍了JNotify这一Java库在SpringBoot中的应用,JNotify允许应用程序监听文件系统事件,包括文件夹/文件的创建、删除、修改和重命名,由于JNotify底层调用的关键部分是C语言开发的,所以在使用前需要在系统中加入相应的动态库
    2024-10-10
  • maven 导入resource lib文件夹中的jar的几种方法

    maven 导入resource lib文件夹中的jar的几种方法

    本文主要介绍了maven 导入resource lib文件夹中的jar的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-05-05
  • java递归菜单树转换成pojo对象

    java递归菜单树转换成pojo对象

    这篇文章介绍了java递归菜单树转换成pojo对象的具体实现,有需要的朋友可以参考一下
    2013-08-08
  • 使用SpringData同时访问MySQL和Neo4j数据库

    使用SpringData同时访问MySQL和Neo4j数据库

    本文通过使用SpringData在SpringBoot中配置MySQL和Neo4j双数据源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • Java利用Redis实现高并发计数器的示例代码

    Java利用Redis实现高并发计数器的示例代码

    这篇文章主要介绍了Java利用Redis实现高并发计数器的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • java开发的工厂方法模式及抽象工厂验证示例

    java开发的工厂方法模式及抽象工厂验证示例

    这篇文章主要为大家介绍了java开发中的工厂方法模式以及抽象工厂的验证示例,有需要的朋友可以借鉴参考下希望能够有所帮助祝大家多多进步
    2021-10-10

最新评论