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

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 实现数据持久化:

  1. JPA 核心概念与实体映射
  2. 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. 常见的字段映射策略
  • 基本类型映射:如 StringIntegerLong 等。
  • 关联关系映射
    • 一对一(OneToOne):通过 @OneToOne 注解实现。
    • 一对多(OneToMany):通过 @OneToMany 注解实现。
    • 多对一(ManyToOne):通过 @ManyToOne 注解实现。
    • 多对多(ManyToMany):通过 @ManyToMany 注解实现。

示例代码(一对多关系):

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 接口,用于简化数据访问层的开发。通过继承 JpaRepositoryCrudRepository,我们可以快速获得 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&#xff1f; 2. JPA 的主要组件 3. 实体映射 4. 常见的字段映射策略 二、Repository 接口与自定义查询 1. 什么是 Repository 接口&#xff1f; 2. 动态查询方法 3. 自定义查询 4. 分页与排序 三、实战案例&…...

快速在wsl上部署学习使用c++轻量化服务器-学习笔记

知乎上推荐的Tinywebserver这个服务器&#xff0c;快速部署搭建&#xff0c;学习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进行举例&#xff1a; library("reshape2") View(tips) head()函数 查看前几行数据&…...

MariaDB MaxScale实现mysql8主从同步读写分离

一、MaxScale基本介绍 MaxScale是maridb开发的一个mysql数据中间件&#xff0c;其配置简单&#xff0c;能够实现读写分离&#xff0c;并且可以根据主从状态实现写库的自动切换&#xff0c;对多个从服务器能实现负载均衡。 二、MaxScale实验环境 中间件192.168.121.51MaxScale…...

【python】简单的flask做页面。一组字母组成的所有单词。这里的输入是一组字母,而输出是所有可能得字母组成的单词列表

目录结构如下&#xff1a; https://github.com/kaede316/Pythons_pj.git 效果&#xff1a; 后续可扩展为工具网站&#xff1a; 更新 2025.02.09 1、增加等间距制作人 时间信息 2、增加判断润年的功能...

单片机之基本元器件的工作原理

一、二极管 二极管的工作原理 二极管是一种由P型半导体和N型半导体结合形成的PN结器件&#xff0c;具有单向导电性。 1. PN结形成 P型半导体&#xff1a;掺入三价元素&#xff0c;形成空穴作为多数载流子。N型半导体&#xff1a;掺入五价元素&#xff0c;形成自由电子作为多…...

吴恩达深度学习——卷积神经网络的特殊应用

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习使用。 文章目录 人脸识别相关定义Similarity函数使用Siamese网络实现函数d使用Triplet损失学习参数 神经风格迁移深度卷积网络可视化神经风格迁移的代价函数内容损失函数风格损失函数 人脸识别 …...

安宝特方案 | AR助力制造业安全巡检智能化革命!

引言&#xff1a; 在制造业中&#xff0c;传统巡检常面临流程繁琐、质量波动、数据难以追溯等问题。安宝特AR工作流程标准化解决方案&#xff0c;通过增强现实AR技术&#xff0c;重塑制造业安全巡检模式&#xff0c;以标准化作业流程为核心&#xff0c;全面提升效率、质量与…...

Unity-Mirror网络框架-从入门到精通之Discovery示例

文章目录 前言Discovery示例NetworkDiscoveryNetworkDiscoveryHUDServerRequestServerResponse最后前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题。Mirror是一个用于Un…...

项目的虚拟环境的搭建与pytorch依赖的下载

文章目录 配置环境 pytorch的使用需要安装对应的cuda 在PyTorch中使用CUDA, pytorch与cuda不同版本对应安装指南&#xff0c;查看CUDA版本&#xff0c;安装对应版本pytorch 【超详细教程】2024最新Pytorch安装教程&#xff08;同时讲解安装CPU和GPU版本&#xff09; 配置环境…...

现代前端工程化实践:高效构建的秘密

一、前端工程化错误监控 这种监控可以帮助开发人员及时发现和解决问题&#xff0c;提高应用程序的稳定性和可靠性。 1. Sentry&#xff1a;Sentry是一款开源的错误监控平台&#xff0c;可以监控前端、后端以及移动端应用程序中的错误和异常。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&#xff08;只例举RPC Server相关程序&#xff09;3.2、Qt程序&#xff08;只例举RPC Client相关程序&#xff09; 4、编译程序4.1、交叉…...

【C++篇】C++11新特性总结1

目录 1&#xff0c;C11的发展历史 2&#xff0c;列表初始化 2.1C98传统的{} 2.2&#xff0c;C11中的{} 2.3&#xff0c;C11中的std::initializer_list 3&#xff0c;右值引用和移动语义 3.1&#xff0c;左值和右值 3.2&#xff0c;左值引用和右值引用 3.3&#xff0c;…...

【Nginx + Keepalived 实现高可用的负载均衡架构】

使用 Nginx Keepalived 可以实现高可用的负载均衡架构&#xff0c;确保在某个 Nginx 节点故障时&#xff0c;自动将流量转移到备用节点。以下是详细的实现步骤&#xff1a; 1. 架构概述 Nginx&#xff1a;作为负载均衡器&#xff0c;将流量分发到后端服务器。Keepalived&…...

使用外骨骼灵活远程控制协作机器人案例

外骨骼控制器采用可调节结构&#xff0c;简化了机器人编程&#xff0c;使协作机器人 FR3 的远程控制变得容易。 一、引言 在开发机器人手臂或双臂系统的应用程序时&#xff0c;经常会遇到以下挑战&#xff1a; 1. 使用拖动和示教进行定位的困难&#xff1a;拖动和示教功能通常…...

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连点器

要实现一个用于抖音点赞的鼠标连点工具&#xff0c;可以通过编程或现有软件实现。以下是两种常见方法&#xff08;但请注意&#xff1a;频繁自动化操作可能违反平台规则&#xff0c;需谨慎使用&#xff09;&#xff1a; 方法 1&#xff1a;使用现成工具&#xff08;如 AutoClic…...

STM32G474--Whetstone程序移植(单精度)笔记

1 准备基本工程代码 参考这篇笔记从我的仓库中选择合适的基本工程&#xff0c;进行程序移植。这里我用的是stm32g474的基本工程。 使用git clone一个指定文件或者目录 2 移植程序 2.1 修改Whetstone.c 主要修改原本变量定义的类型&#xff0c;以及函数接口全部更换为单精度…...

Spring Boot 3.4 中 MockMvcTester 的新特性解析

引言 在 Spring Boot 3.4 版本中&#xff0c;引入了一个全新的 MockMvcTester 类&#xff0c;使 MockMvc 测试可以直接支持 AssertJ 断言。本文将深入探讨这一新特性&#xff0c;分析它如何优化 MockMvc 测试并提升测试的可读性。 Spring MVC 示例 为了演示 MockMvcTester 的…...

java 读取sq3所有表数据到objectNode

1.实现效果&#xff1a;将sq3中所有表的所有字段读到objectNode 对象中&#xff0c;兼容后期表字段增删情况&#xff0c;数据组织形式如下图所示&#xff1a; 代码截图&#xff1a; 代码如下&#xff1a; package com.xxx.check.util;import java.sql.*; import java.util.Arr…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...