当前位置: 首页 > ds >正文

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

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=UTCusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driverjpa:hibernate:ddl-auto: update   # 自动建表(create、update、validate、none)show-sql: true       # 控制台打印 SQLproperties: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;}@GetMappingpublic List<User> list() {return userService.getAllUsers();}@PostMappingpublic 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)保证数据一致性

http://www.xdnf.cn/news/17996.html

相关文章:

  • Nginx学习笔记(九)—— Nginx Rewrite深度解析
  • 版本更新!FairGuard-Mac加固工具已上线!
  • win11右键菜单改回win10样式
  • Data Augmentation数据增强
  • EtherCAT概念介绍
  • EchoEar喵伴接入小聆AI,MCP服务轻松体验,智能升级!
  • 低配硬件运行智谱GLM-4.5V视觉语言模型推理服务的方法
  • 如何基于langchain基类LLM自定义大模型
  • 飞算JavaAI开发全流程解析:从自然语言到可运行工程的智能进化
  • 从零开始学Python之数据结构(字符串以及数字)
  • 深入解析 Chrome UI 布局配置的设计思想与实现机制
  • STL算法【常用的算数生成算法】
  • vue3+leaflet案例:告警系统GIS一张图(附源码下载)
  • 基于大语言模型的爬虫数据清洗与结构化
  • 手机实时提取SIM卡打电话的信令声音-整体解决方案规划
  • 《WebGL中FBO的底层运行逻辑》
  • Day57--图论--53. 寻宝(卡码网)
  • 【前端工具】使用 Node.js 脚本实现项目打包后自动压缩
  • 计算机视觉(opencv)实战三——图像运算、cv2.add()、cv2.addWeighted()
  • Docker + Cronicle + Traefik 搭建服务器计划任务工具
  • nginx入门需知(含安装教程)
  • QT+Yolov8 推理部署,ONNX模型 ,实例分割+目标检测
  • 14、Docker Compose 安装 Redis 集群(三主三从)
  • linux 软硬链接详解
  • vscode的wsl环境,ESP32驱动0.96寸oled屏幕
  • 前端包管理工具
  • 基于wireshark的USB 全速硬件抓包工具USB Sniffer Lite的使用
  • 【lucene】DocumentsWriterFlushControl
  • 负载因子(Load Factor) :哈希表(Hash Table)中的一个关键性能指标
  • C++ 滑动窗口、二分查找