Spring Boot 整合 JPA 实现数据持久化
目录
前言
一、JPA 核心概念与实体映射
1. 什么是 JPA?
2. JPA 的主要组件
3. 实体映射
4. 常见的字段映射策略
二、Repository 接口与自定义查询
1. 什么是 Repository 接口?
2. 动态查询方法
3. 自定义查询
4. 分页与排序
三、实战案例:完整数据持久化示例
1. 创建一个简单的用户管理系统
2. 测试接口
前言
在现代企业级应用开发中,数据持久化是不可或缺的一部分。Spring Boot 提供了对 JPA(Java Persistence API)的强大支持,使得数据库操作变得更加简单和高效。本文将从以下几个方面详细讲解如何在 Spring Boot 中整合 JPA 实现数据持久化:
- JPA 核心概念与实体映射
- Repository 接口与自定义查询
通过本文的学习,你将能够掌握 Spring Boot 中 JPA 的基本使用方法,并能够根据实际需求进行灵活的扩展。
一、JPA 核心概念与实体映射
1. 什么是 JPA?
JPA(Java Persistence API)是 Java EE 平台中用于对象关系映射(ORM)的标准 API。它允许开发者通过 Java 类来表示数据库中的表,并通过 JPA 提供的接口和注解来执行 CRUD(增删改查)操作。
2. JPA 的主要组件
- EntityManager:负责管理实体对象的生命周期,并提供 CRUD 操作的方法。
- Persistence Unit:一组相关的实体类和配置信息的集合。
- Entity:表示数据库表的 Java 类。
3. 实体映射
在 JPA 中,实体类通过注解来映射到数据库表。以下是常用的注解:
@Entity:标识这是一个实体类。@Table:指定实体类对应的数据库表名。@Id:标识实体类的主键字段。@GeneratedValue:指定主键的生成策略。@Column:指定字段对应的数据库列名、长度等属性。
示例代码:
import jakarta.persistence.*; @Entity
@Table(name = "users")
public class User {@Id @GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "username", length = 50, nullable = false)private String username;@Column(name = "email", unique = true)private String email;// Getter and Setter methods
}
4. 常见的字段映射策略
- 基本类型映射:如
String、Integer、Long等。 - 关联关系映射:
- 一对一(OneToOne):通过
@OneToOne注解实现。 - 一对多(OneToMany):通过
@OneToMany注解实现。 - 多对一(ManyToOne):通过
@ManyToOne注解实现。 - 多对多(ManyToMany):通过
@ManyToMany注解实现。
- 一对一(OneToOne):通过
示例代码(一对多关系):
import jakarta.persistence.*; @Entity
@Table(name = "posts")
public class Post {@Id @GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "title", nullable = false)private String title;@Column(name = "content")private String content;@ManyToOne @JoinColumn(name = "user_id")private User user;// Getter and Setter methods
}
二、Repository 接口与自定义查询
1. 什么是 Repository 接口?
Spring Data JPA 提供了一个 Repository 接口,用于简化数据访问层的开发。通过继承 JpaRepository 或 CrudRepository,我们可以快速获得 CRUD 操作的能力。
示例代码:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository; @Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
JpaRepository:继承了CrudRepository和PagingAndSortingRepository,提供了基本的 CRUD 操作和分页支持。UserRepository:定义了一个针对User实体的仓库接口。
2. 动态查询方法
Spring Data JPA 支持通过方法名动态生成查询语句。例如:
public interface UserRepository extends JpaRepository<User, Long> {List<User> findByUsername(String username);List<User> findByEmailContaining(String keyword);List<User> findByUsernameAndEmail(String username, String email);
}
findByUsername:根据用户名查询用户。findByEmailContaining:根据邮箱包含关键字查询用户。findByUsernameAndEmail:根据用户名和邮箱联合查询用户。
3. 自定义查询
对于复杂的查询需求,可以通过 @Query 注解来自定义 JPQL(Java Persistence Query Language)或原生 SQL 查询。
示例代码:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository; import java.util.List; @Repository
public interface UserRepository extends JpaRepository<User, Long> {@Query("SELECT u FROM User u WHERE u.username LIKE %:keyword%")List<User> findByUsernameLike(@Param("keyword") String keyword);@Query(value = "SELECT * FROM users WHERE email LIKE %?1%", nativeQuery = true)List<User> findByEmailLike(String keyword);
}
findByUsernameLike:使用 JPQL 查询用户名包含关键字的用户。findByEmailLike:使用原生 SQL 查询邮箱包含关键字的用户。
4. 分页与排序
Spring Data JPA 提供了 Pageable 接口来支持分页和排序。
示例代码:
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; public interface UserRepository extends JpaRepository<User, Long> {Page<User> findAll(Pageable pageable);Page<User> findByUsernameContaining(String keyword, Pageable pageable);
}
三、实战案例:完整数据持久化示例
1. 创建一个简单的用户管理系统
实体类(User.java ):
import jakarta.persistence.*; @Entity
@Table(name = "users")
public class User {@Id @GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "username", length = 50, nullable = false)private String username;@Column(name = "email", unique = true)private String email;// Getter and Setter methods
}
Repository 接口(UserRepository.java ):
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository; import java.util.List; @Repository
public interface UserRepository extends JpaRepository<User, Long> {List<User> findByUsername(String username);@Query("SELECT u FROM User u WHERE u.email LIKE %:keyword%")List<User> findByEmailLike(@Param("keyword") String keyword);
}
Service 层(UserService.java ):
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import java.util.List; @Service
public class UserService {@Autowired private UserRepository userRepository;public List<User> findAllUsers() {return userRepository.findAll(); }public User saveUser(User user) {return userRepository.save(user); }public List<User> findByUsername(String username) {return userRepository.findByUsername(username); }public List<User> findByEmailLike(String keyword) {return userRepository.findByEmailLike(keyword); }
}
Controller 层(UserController.java ):
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import java.util.List; @RestController
@RequestMapping("/api/users")
public class UserController {@Autowired private UserService userService;@GetMapping public List<User> getAllUsers() {return userService.findAllUsers(); }@PostMapping public User createUser(@RequestBody User user) {return userService.saveUser(user); }@GetMapping("/username/{username}")public List<User> findByUsername(@PathVariable String username) {return userService.findByUsername(username); }@GetMapping("/email/{keyword}")public List<User> findByEmailLike(@PathVariable String keyword) {return userService.findByEmailLike(keyword); }
}
2. 测试接口
启动应用后,可以通过 Postman 或 Swagger UI 测试以下接口:
GET http://localhost:8080/api/users:获取所有用户。POST http://localhost:8080/api/users:创建新用户。GET http://localhost:8080/api/users/username/{username}:根据用户名查询用户。GET http://localhost:8080/api/users/email/{keyword}:根据邮箱关键字查询用户。
相关文章:
Spring Boot 整合 JPA 实现数据持久化
目录 前言 一、JPA 核心概念与实体映射 1. 什么是 JPA? 2. JPA 的主要组件 3. 实体映射 4. 常见的字段映射策略 二、Repository 接口与自定义查询 1. 什么是 Repository 接口? 2. 动态查询方法 3. 自定义查询 4. 分页与排序 三、实战案例&…...
快速在wsl上部署学习使用c++轻量化服务器-学习笔记
知乎上推荐的Tinywebserver这个服务器,快速部署搭建,学习c服务器开发 仓库地址 githubhttps://link.zhihu.com/?targethttps%3A//github.com/qinguoyi/TinyWebServerhttps://link.zhihu.com/?targethttps%3A//github.com/qinguoyi/TinyWebServer 在…...
【R语言】数据操作
一、查看和编辑数据 1、查看数据 直接打印到控制台 x <- data.frame(a1:20, b21:30) x View()函数 此函数可以将数据以电子表格的形式进行展示。 用reshape2包中的tips进行举例: library("reshape2") View(tips) head()函数 查看前几行数据&…...
MariaDB MaxScale实现mysql8主从同步读写分离
一、MaxScale基本介绍 MaxScale是maridb开发的一个mysql数据中间件,其配置简单,能够实现读写分离,并且可以根据主从状态实现写库的自动切换,对多个从服务器能实现负载均衡。 二、MaxScale实验环境 中间件192.168.121.51MaxScale…...
【python】简单的flask做页面。一组字母组成的所有单词。这里的输入是一组字母,而输出是所有可能得字母组成的单词列表
目录结构如下: https://github.com/kaede316/Pythons_pj.git 效果: 后续可扩展为工具网站: 更新 2025.02.09 1、增加等间距制作人 时间信息 2、增加判断润年的功能...
单片机之基本元器件的工作原理
一、二极管 二极管的工作原理 二极管是一种由P型半导体和N型半导体结合形成的PN结器件,具有单向导电性。 1. PN结形成 P型半导体:掺入三价元素,形成空穴作为多数载流子。N型半导体:掺入五价元素,形成自由电子作为多…...
吴恩达深度学习——卷积神经网络的特殊应用
内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习使用。 文章目录 人脸识别相关定义Similarity函数使用Siamese网络实现函数d使用Triplet损失学习参数 神经风格迁移深度卷积网络可视化神经风格迁移的代价函数内容损失函数风格损失函数 人脸识别 …...
安宝特方案 | AR助力制造业安全巡检智能化革命!
引言: 在制造业中,传统巡检常面临流程繁琐、质量波动、数据难以追溯等问题。安宝特AR工作流程标准化解决方案,通过增强现实AR技术,重塑制造业安全巡检模式,以标准化作业流程为核心,全面提升效率、质量与…...
Unity-Mirror网络框架-从入门到精通之Discovery示例
文章目录 前言Discovery示例NetworkDiscoveryNetworkDiscoveryHUDServerRequestServerResponse最后前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题。Mirror是一个用于Un…...
项目的虚拟环境的搭建与pytorch依赖的下载
文章目录 配置环境 pytorch的使用需要安装对应的cuda 在PyTorch中使用CUDA, pytorch与cuda不同版本对应安装指南,查看CUDA版本,安装对应版本pytorch 【超详细教程】2024最新Pytorch安装教程(同时讲解安装CPU和GPU版本) 配置环境…...
现代前端工程化实践:高效构建的秘密
一、前端工程化错误监控 这种监控可以帮助开发人员及时发现和解决问题,提高应用程序的稳定性和可靠性。 1. Sentry:Sentry是一款开源的错误监控平台,可以监控前端、后端以及移动端应用程序中的错误和异常。Sentry提供了实时错误报告、错误分…...
ARM Linux Qt使用JSON-RPC实现前后台分离
文章目录 1、前言2、解决方案2.1、JSON-RPC2.2、Qt中应用JSON-RPC的框架图2.3、优点2.4、JSON-RPC 1.0 协议规范 3、程序示例3.1、Linux C(只例举RPC Server相关程序)3.2、Qt程序(只例举RPC Client相关程序) 4、编译程序4.1、交叉…...
【C++篇】C++11新特性总结1
目录 1,C11的发展历史 2,列表初始化 2.1C98传统的{} 2.2,C11中的{} 2.3,C11中的std::initializer_list 3,右值引用和移动语义 3.1,左值和右值 3.2,左值引用和右值引用 3.3,…...
【Nginx + Keepalived 实现高可用的负载均衡架构】
使用 Nginx Keepalived 可以实现高可用的负载均衡架构,确保在某个 Nginx 节点故障时,自动将流量转移到备用节点。以下是详细的实现步骤: 1. 架构概述 Nginx:作为负载均衡器,将流量分发到后端服务器。Keepalived&…...
使用外骨骼灵活远程控制协作机器人案例
外骨骼控制器采用可调节结构,简化了机器人编程,使协作机器人 FR3 的远程控制变得容易。 一、引言 在开发机器人手臂或双臂系统的应用程序时,经常会遇到以下挑战: 1. 使用拖动和示教进行定位的困难:拖动和示教功能通常…...
Centos Stream 10 根目录下的文件夹结构
/ ├── bin -> usr/bin ├── boot ├── dev ├── etc ├── home ├── lib -> usr/lib ├── lib64 -> usr/lib64 ├── lostfound ├── media ├── mnt ├── opt ├── proc ├── root ├── run ├── sbin -> usr/sbin ├── srv ├─…...
python连点器
要实现一个用于抖音点赞的鼠标连点工具,可以通过编程或现有软件实现。以下是两种常见方法(但请注意:频繁自动化操作可能违反平台规则,需谨慎使用): 方法 1:使用现成工具(如 AutoClic…...
STM32G474--Whetstone程序移植(单精度)笔记
1 准备基本工程代码 参考这篇笔记从我的仓库中选择合适的基本工程,进行程序移植。这里我用的是stm32g474的基本工程。 使用git clone一个指定文件或者目录 2 移植程序 2.1 修改Whetstone.c 主要修改原本变量定义的类型,以及函数接口全部更换为单精度…...
Spring Boot 3.4 中 MockMvcTester 的新特性解析
引言 在 Spring Boot 3.4 版本中,引入了一个全新的 MockMvcTester 类,使 MockMvc 测试可以直接支持 AssertJ 断言。本文将深入探讨这一新特性,分析它如何优化 MockMvc 测试并提升测试的可读性。 Spring MVC 示例 为了演示 MockMvcTester 的…...
java 读取sq3所有表数据到objectNode
1.实现效果:将sq3中所有表的所有字段读到objectNode 对象中,兼容后期表字段增删情况,数据组织形式如下图所示: 代码截图: 代码如下: package com.xxx.check.util;import java.sql.*; import java.util.Arr…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
