【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.pswp.cn/web/93108.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytorch学习笔记-加载现有的网络模型(VGG16)、增加/修改其中的网络层(修改为10分类)

写在前面&#xff1a;有些地方和视频里不一样的是因为官方文档更新了&#xff0c;一些参数用法不一样也很正常&#xff0c;包括我现在的也是我这个时间节点最新的&#xff0c;谁知道过段时间会不会更新呢 建议大家不要一味看视频/博客&#xff0c;多看看官方文档才是正道&#…

RocketMQ 4.9.3源码解读-NameServer组件启动流程分析

作者源码阅读笔记主要采用金山云文档记录的,所有的交互图和代码阅读笔记都是记录在云文档里面,本平台的文档编辑实在不方便,会导致我梳理的交互图和文档失去原来的格式,所以整理在文档里面,供大家阅读交流 【金山文档 | WPS云文档】 namesrv 启动流程 相关重要类介绍说明…

《嵌入式 C 语言编码规范与工程实践个人笔记》参考华为C语言规范标准

《嵌入式 C 语言编码规范与工程实践个人笔记》参考华为C语言规范标准 前言 在电子系统开发领域&#xff0c;C 语言作为底层开发的核心语言&#xff0c;其代码质量直接关系到系统的稳定性、可维护性和扩展性。良好的编码规范不仅是团队协作的基础&#xff0c;更是降低生命周期成…

纯半精度模型和全精度模型的耗时分别为248微秒和1400微秒。混合精度模型371微秒比原始模型快大约四倍!

不过有一点需要注意:在上下文管理器内部生成的任何输出,必然会采用该上下文管理器的数据类型。因此,之后我们必须将这些输出转换回FP32(例如,使用float()函数)。 with torch.autocast(device_type="cuda", dtype=torch.float16): res16 = mixed32(torch.randn…

一款开源的远程桌面软件,旨在为用户提供流畅的游戏体验,支持 2K 分辨率、60 FPS,延迟仅为 40ms。

软件介绍 CloudPlayPlus&#xff08;云玩加&#xff09;是一款令人惊艳的开源远程桌面、串流软件&#xff0c;云玩加由个人开发者开发者&#xff0c;具有四大特征&#xff1a;开源、免费、低延迟、安全。 软件使用 客户端支持多个平台&#xff0c;包括 Windows、Mac OS、安卓…

MySql——binlog和redolog的区别

目录一、binlog和redolog的区别一、binlog和redolog的区别 binlog和redolog都是存储修改的新数据&#xff0c;是否保留binlog和redolog中的一个即可。 binlog属于整个mysql&#xff0c;是所有引擎共用的&#xff0c;不是只属于innoDB引擎。而redolog属于InnoDB存储引擎。binlo…

软件著作权产生与登记关键点

知识讲解一、 软件著作权的核心特征与权利内容自动产生原则&#xff1a; 这是软件著作权最核心、最重要的特征。产生时间&#xff1a; 软件著作权自软件开发完成之日起自动产生。法律依据&#xff1a; 《中华人民共和国著作权法》第二条及《计算机软件保护条例》第五条明确规定…

什么是主成分分析(PCA)和数据降维

主成分分析&#xff08;PCA&#xff09;和数据降维是机器学习和统计学中处理高维数据的核心工具。下面用清晰的结构解释其概念、原理和应用&#xff1a; 一、数据降维&#xff08;Dimensionality Reduction&#xff09; 1. 是什么&#xff1f; 目标&#xff1a;将高维数据&…

图论(4)单源赋权最短路径算法实现(BFS实现)

目录 1. 什么是赋权最短路径 2. 赋权最短路径中的关键概念 3. Dijkstra 算法的基本思想 4. Dijkstra 算法实现&#xff08;Java&#xff09; 1. 什么是赋权最短路径 在图论中&#xff0c;最短路径问题是指在图中寻找两点之间路径总权重最小的路径问题。如果图的每条边都带…

【Lua】题目小练9

题目&#xff1a;实现一个简单的“银行账户”类要求&#xff1a;使用 元表 模拟面向对象。支持以下功能&#xff1a;Account:new(owner, balance) 创建账户&#xff08;初始余额可选&#xff0c;默认为 0&#xff09;。deposit(amount) 存款&#xff08;不能为负数&#xff09;…

【二分图】染色问题

核心思想&#xff1a;为每一个未染色的&#xff0c;对它自己和它的邻居进行染色&#xff0c;看是否会出现冲突时间复杂度O&#xff08;nm&#xff09;#include<bits/stdc.h> using namespace std; using lllong long; const int N200010; int n,m; vector<int>edge…

报数游戏(我将每文更新tips)

今日tips&#xff1a;报数游戏题目描述报数游戏的游戏规则如下&#xff1a;对一个区间内的整数进行报数&#xff0c;若遇到的数字是质数或个位数是 1&#xff0c;则不报数&#xff0c;输出 pass。 给定开始游戏的第一个整数 a&#xff0c;及结束游戏时的最后一个整数 b&#xf…

大模型开发 - 基于Spring AI 借助MCP Client 通过STDIO和SSE协议调用MCP Server (上)

文章目录概述MCP协议&#xff1a;为AI应用连接外部世界的桥梁MCP Server&#xff1a;上下文与能力的提供者基于Spring AI 1.0.0的开发之路1. 使用Spring AI构建MCP客户端2. 使用Spring AI构建MCP服务器Mcp Client 实战整体架构概览技术栈Codepom配置mcp servers(sse&stdio)…

分析三个文件--启动文件、链接文件、map文件

目录 启动文件 链接文件 部分map文件内容 FLASH物理地址(0x08000000开始)的映射关系 0x08000000 之前地址空间 启动文件 ;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** ;* File Name : startup_stm32f40_41xxx.s ;* Author…

从零开始学Python之数据结构(字符串以及数字)

一、字符串 1.1 怎么定义字符串 字符串是Python最常用的数据结构之一。在 Python 里是用于处理文本数据的&#xff0c;比如存储姓名、文章内容等文本信息 。 定义方式&#xff1a; 单引号&#xff1a;用单引号 包裹文本&#xff0c;如 name Alice &#xff0c;单引号内可…

Navicat 全量增量数据库迁移

在使用 Navicat 进行数据库迁移时&#xff0c;除了常见的“全量迁移”&#xff08;一次性迁移所有数据和结构&#xff09;&#xff0c;有时还需要支持 增量迁移&#xff08;只迁移新增或修改的数据&#xff09;。下面我将详细讲解如何通过 Navicat 实现&#xff1a;&#x1f50…

css初学者第五天

<1>css的三大特性1.1 层叠性相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一份冲突的样式。层叠式主要解决样式冲突的问题。层叠性原则&#xff1a;-样式冲突&#xff0c;遵循的原则是就近原则&#xff0c;哪个样式离结构近…

从神经网络语言模型(NNLM)到Word2Vec:自然语言处理中的词向量学习

语言模型 语言(人说的话)模型(完成某个任务) 任务: 概率评估任务:在两句话中&#xff0c;判断哪句话出现的概率大(哪句话在自然语言中更合理)生成任务:预测词语,我明天要____ 统计语言模型 用统计的方法解决上述的两个任务 核心思想 给定一个词序列&#xff0c;计算该序列出现的…

PID学习笔记5-双环PID

在学习江协科技PID课程时&#xff0c;做一些笔记&#xff0c;对应视频3-1&#xff0c;对应代码&#xff1a;1313-双环PID定速定位置控制-代码封装main.c:#include "stm32f10x.h" // Device header #include "Delay.h" #include "OLE…

C#vb.net中Interlocked类实现原子操作加减计算,涵盖状态切换、计数控制等常见场景

以下是 C# 中使用 int 类型结合 Interlocked 类实现原子操作的完整示例&#xff0c;涵盖状态切换、计数控制等常见场景&#xff1a; 完整代码示例csharp using System; using System.Threading;/// <summary> /// 基于整数类型的原子操作工具类&#xff08;线程安全&am…