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

Java持久化之--Spring Data JPA

1、简介

Java持久化技术是Java开发中比较重要的部分,主要用于将对象数据持久化到数据库,或者从数据库中查询数据,简化数据库的CRUD操作。

2、JPA简介

JPA(Java Persistence API)是Java实现ORM(Object Relational Mapping)技术提供的规范,主要用于将Java对象映射到关系数据库,便于持久化操作。

3、Spring Data JPA简介

Spring Data JPA是Spring 框架下的一个模块,是基于JPA规范实现的上层封装,旨在简化JPA的使用。Spring Data JPA提供了一些常用的接口,例如JpaRepository、JpaSpecificationExecutor,这些接口中包含了很多CRUD操作方法,同时提供了基于方法命名规范的查询方法,可以根据方法自动生成相应的SQL。

除了基础的CRUD操作,Spring Data JPA还提供很多高级功能,例如分页查询、排序、动态查询等,同时支持多种数据库,例如MySQL、PostgreSQL、Oracle等。

  • Spring Data JPA 是 Spring Data 项目家族中的一员,它为基于Spring框架应用程序提供了更加便捷和强大的数据操作方式。
  • Spring Data JPA 支持多种数据存储技术,包括关系型数据库和非关系型数据库。
  • Spring Data JPA 提供了简单、一致且易于使用的API来访问和操作数据存储,其中包括基本的CRUD操作、自定义查询方法、动态查询等功能。
  • Spring Data JPA 也支持QueryDSL、Jinq、Kotlin Query等其他查询框架

4、快速使用

4.1、添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

4.2、创建实体类

1、实体类必须使用@Entity注解、还可以添加@Table映射表名,使用lombok的@Data

package com.mqtt.mqttproject.entity;import lombok.Data;
import javax.persistence.*;/*** @ Author : Gridsum* @ Description : 测试实体类*/
@Entity
@Table(name = "user")
@Data
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "name")private String name;@Column(name = "age")private Integer age;@Column(name = "addr")private String addr;
}

4.3、创建Repository接口

package com.mqtt.mqttproject.repository;import com.mqtt.mqttproject.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;@Repository
public interface UserRepository extends JpaRepository<User, Long> {User findByName(String name);
}

实现类

package com.mqtt.mqttproject.service.impl;import com.mqtt.mqttproject.entity.User;
import com.mqtt.mqttproject.repository.UserRepository;
import com.mqtt.mqttproject.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @ Author : Gridsum* @ Description :*/
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserRepository userRepository;@Overridepublic User findByName(String name) {return userRepository.findByName(name);}@Overridepublic void save(User user){userRepository.save(user);}
}

4.4、基本CRUD

定义Repository接口,继承JpaRepository<T, ID>,泛型T指实体类,ID实体id。

方法名描述
T save(T entity)保存实体对象
Iterable saveAll(Iterable entities)批量保存实体对象
Optional findById(ID id)根据主键获取实体对象
boolean existsById(ID id)判断是否存在特定主键的实体对象
Iterable findAll()获取所有实体对象
Iterable findAllById(Iterable ids)根据主键批量获取实体对象
long count()获取实体对象的数量
void deleteById(ID id)根据主键删除实体对象
void delete(T entity)删除实体对象
void deleteAll(Iterable<? extends T> entities)批量删除实体对象
package com.mqtt.mqttproject.repository;import com.mqtt.mqttproject.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;import java.util.List;
import java.util.Optional;@Repository
public interface UserRepository extends JpaRepository<User, Long> {User findByName(String name);@OverrideUser save(User user);@OverrideOptional<User> findById(Long id);@OverrideList<User> findAll();@Overridevoid deleteById(Long id);
}

4.5、自定义查询

方法名称查询是 Spring Data JPA 中最简单的一种自定义查询方法,并且不需要额外的注解或 XML 配置。它通过方法名来推断出查询的条件,例如以 findBy 开头的方法表示按照某些条件查询,以 deleteBy 开头的方法表示按照某些条件删除数据。

 例如 findByName(String name)

@Repository
public interface UserRepository extends JpaRepository<User, Long> {User findByName(String name);@OverrideUser save(User user);@OverrideOptional<User> findById(Long id);@OverrideList<User> findAll();@Overridevoid deleteById(Long id);
}

4.5.1、查询参数设置

除了方法名称查询外,还可以使用参数设置方式进行自定义查询。它通过在方法上使用 @Query 注解来指定查询语句,然后使用 @Param 注解来指定方法参数与查询语句中的参数对应关系。 

UserRepository接口中自定义查询接口:

@Query("SELECT u FROM User u WHERE u.name = :name")
User findByUserName(@Param("name") String name);

 4.6、使用 Sort 和 Pageable 进行排序和分页

在查询数据时,经常需要对结果进行排序和分页操作。Spring Data JPA 提供了 SortPageable 两个类来实现排序和分页功能。

Sort 类表示排序规则,可以使用 Sort.by() 静态方法

创建实例,并指定排序属性和排序方向。常用方法如下:

方法名描述
static Sort by(Sort.Order... orders)根据排序规则创建 Sort 实例
static Sort.Order by(String property)根据属性升序排序
static Sort.Order by(String property, Sort.Direction direction)根据属性排序
    List<User> findByOrderByAgeAsc();// 根据年龄降序分页查询用户列表Page<User> findBy(Pageable pageable);

4.7、Specification 进行动态查询

在实际应用中,我们经常需要根据条件动态生成查询语句。Spring Data JPA 提供了 Specification 接口来支持动态查询,它可以通过使用匿名内部类或 Lambda 表达式来实现。

Specification 接口定义了 toPredicate() 方法,该方法接受一个 Root<T> 对象和一个 CriteriaQuery<?> 对象作为参数,并返回一个 Predicate 对象,表示查询条件。

toPredicate() 方法内部,可以通过 root.get() 方法获取实体属性,并使用 criteriaBuilder 构建查询条件。 1.例如,以下 Lambda 表达式表示查询 age 大于等于 18 的用户。

 

public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {List<User> findAll(Specification<User> spec);
}// 使用
Specification<User> spec = (root, query, criteriaBuilder) -> criteriaBuilder.greaterThanOrEqualTo(root.get("age"), 18);
userRepostory.findAll(spec);

相关文章:

Java持久化之--Spring Data JPA

1、简介 Java持久化技术是Java开发中比较重要的部分&#xff0c;主要用于将对象数据持久化到数据库&#xff0c;或者从数据库中查询数据&#xff0c;简化数据库的CRUD操作。 2、JPA简介 JPA&#xff08;Java Persistence API&#xff09;是Java实现ORM&#xff08;Object Re…...

excel里的函数技巧(持续更新中)

行转列 在 Excel 中&#xff0c;行转列&#xff08;将一行数据转换为一列&#xff0c;或者将一列数据转换为一行&#xff09;是一项常见的操作。你可以使用 转置 功能轻松实现这一操作。 TRANSPOSE(数组)...

基于python sanic框架,使用Nacos进行微服务管理

微服务软件系统构建方式,已经很普及了,通过开源的sanic进行微服务管理,便捷,技术也比较成熟,而在项目实际应用过程中,微服务类型不仅有java的,还有nodejs、python等,尤其是结合算法模型构建的python接口,需要在Nacos进行注册管理。本文内容耗时2天踏坑,亲测一切ok。 …...

Day84:数据可视化

数据可视化是数据分析的重要组成部分,它能直观地展现数据规律,使复杂数据变得易懂。Python 提供了多个数据可视化库,其中最常用的是 Matplotlib 和 Seaborn。今天,我们将学习如何使用这些工具绘制折线图、柱状图、散点图等。 1. 安装和导入库 如果你的 Python 没有安装 Ma…...

fetch() 与 XMLHttpRequest 的差异

fetch() 与 XMLHttpRequest 的差异 fetch() 的功能与 XMLHttpRequest 基本相同&#xff0c;都是向服务器发出 HTTP 请求&#xff0c;但有三个主要的差异。 &#xff08;1&#xff09;fetch()使用 Promise&#xff0c;不使用回调函数&#xff0c;因此大大简化了写法&#xff0…...

TDengine 产品由哪些组件构成

目 录 背景产品生态taosdtaosctaosAdaptertaosKeepertaosExplorertaosXtaosX Agent应用程序或第三方工具 背景 了解一个产品&#xff0c;最好从了解产品包括哪些内容开始&#xff0c;我这里整理了一份儿 TDegnine 产品包括有哪些组件&#xff0c;每个组件作用是什么的说明&a…...

.NET Web-静态文件访问目录浏览

一、Web根目录访问 创建wwwroot文件夹app.UseStaticFiles(); // 启⽤静态⽂件中间件url/路径 进行访问 二、Web根目录之外的文件 app.UseStaticFiles(new StaticFileOptions {FileProvider new PhysicalFileProvider(Path.Combine(builder.Environment.ContentRootPath,&qu…...

SQL数据清理:去除字段值中的多余符号(Demo例子)

目录 前言1. 基础2. 进阶 前言 Excel中有大量不合法的符号&#xff0c;导入到系统之后&#xff0c;数据库有很多脏数据&#xff0c;对此下述展开sql的清洗教程 在数据库的文本字段中&#xff0c;可能会存在多余的逗号或符号&#xff0c;如,销售,, 或 二手车,销售,,这种情况 希…...

.NET版Word处理控件Aspose.Words教程:使用 C# 删除 Word 中的空白页

Word 文档中的空白页会使其看起来不专业并扰乱流程。用户会遇到需要删除 Word 中的空白页的情况&#xff0c;但手动删除它们需要时间和精力。在这篇博文中&#xff0c;我们将探讨如何使用 C# 删除 Word 中的空白页。 本文涵盖以下主题&#xff1a; C# 库用于删除 Word 中的空…...

【工业场景】用YOLOv8实现火灾识别

火灾识别任务是工业领域急需关注的重点安全事项,其应用场景和背景意义主要体现在以下几个方面: 应用场景:工业场所:在工厂、仓库等工业场所中,火灾是造成重大财产损失和人员伤亡的主要原因之一。利用火灾识别技术可以及时发现火灾迹象,采取相应的应急措施,保障人员安全和…...

Flask Web开发的重要概念和示例

一口气列举Flask Web应用的所有概念和示例 Flask Web 应用基本框架 路由(Routing) 模版(Template) request 对象 JSON 数据处理 redirect 示例 文件上传示例 文件下载示例 Session 示例 Cookie操作 Flask Web 应用基本框架 这是一个 最基础的 Flask Web 应用,…...

【Antv G2 5.x】饼图添加点击事件,获取当前坐标数据

// 监听 tooltip:show 事件this.chart.on(tooltip:show, (event) => {this.currentShowTooltipName = event.data.items[0].name})// 监听绘图区plot的点击事件this.chart.on(interval:click, ev => {this.$emit(chartClick, this.currentShowTooltipName);})// 监听绘图…...

深度学习-112-大语言模型LLM之langchain的聊天模型概述和基本概念介绍

文章目录 1 概念指南Conceptual guide1.1 概念Concepts1.2 词汇表Glossary2 聊天模型Chat models2.1 概述Overview2.2 功能Features2.3 集成Integrations2.4 接口Interface2.4.1 关键方法Key methods2.4.2 输入和输出Inputs and outputs2.4.3 标准参数Standard parameters2.5 工…...

Vue.js 实现树形结构管理系统的前端设计与实现

Vue.js 实现树形结构管理系统的前端设计与实现: 在现代前端开发中&#xff0c;树形结构是一种常见的数据展示方式&#xff0c;尤其适用于需要展示层级关系的场景&#xff0c;如目录、文件、分类等。本文将详细介绍如何使用 Vue.js 和 Element UI 组件库实现一个功能强大且易于…...

OSPF高级特性(3):安全特效

引言 OSPF的基础我们已经结束学习了&#xff0c;接下来我们继续学习OSPF的高级特性。为了方便大家阅读&#xff0c;我会将高级特性的几篇链接放在末尾&#xff0c;所有链接都是站内的&#xff0c;大家点击即可阅读&#xff1a; OSPF基础&#xff08;1&#xff09;&#xff1a;工…...

Unity Shader Graph 2D - Procedural程序化图形转动的环状六边形

前言 Hexagon又称六边形,在游戏中是十分常见的基础形状,本文将使用程序化的六边形来制作多个环状六边形叠加的转动动画效果,实践Unity Shader Graph中的常用节点功能。 创建一个Shader Graph文件命名为Hexagon,并创建对应的材质球M_Hexagon,在Shader Graph中创建一…...

鸿蒙HarmonyOS NEXT开发:横竖屏切换开发实践

文章目录 一、概述二、窗口旋转说明1、配置module.json5的orientation字段2、调用窗口的setPreferredOrientation方法 四、性能优化1、使用自定义组件冻结2、对图片使用autoResize3、排查一些耗时操作 四、常见场景示例1、视频类应用横竖屏开发2、游戏类应用横屏开发 五、其他常…...

汇能感知宠物智能监控模块

汇能感知宠物智能监控模块 分辨率&#xff1a;2/3M 帧率&#xff1a;15-30FPS 压缩方式&#xff1a;H.264/H.265 APP支持&#xff1a;涂鸦Tuya、安居云AJcloud 配网方式&#xff1a;BLE蓝牙 / WiFi WIFI&#xff1a;2.4/5.8G WIFI 音频&#xff1a;单向/双向语音对讲/录…...

C# 两种方案实现调用 DeepSeek API

目录 序 开发运行环境 访问API的一个通用方法 原生官网实现 申请 API key 调用实现 调用示例 腾讯云知识引擎原子调用 申请 API key 调用示例 小结 序 DeepSeek&#xff08;深度求索&#xff09; 最近可谓火爆的一塌糊涂&#xff0c;具体的介绍这里不再赘述&#x…...

Android ndk兼容 64bit so报错

1、报错logcat如下 2025-01-13 11:34:41.963 4687-4687 DEBUG pid-4687 A #01 pc 00000000000063b8 /system/lib64/liblog.so (__android_log_default_aborter16) (BuildId: 467c2038cdfa767245f9280e657fdb85) 2025…...

从RIPv2到RIPng:IPv6时代路由协议的演进与实战部署

1. 从RIPv2到RIPng&#xff1a;为什么IPv6需要新的路由协议&#xff1f; 第一次在实验室配置RIPv2时&#xff0c;我盯着那些IPv4地址看了整整三天。直到某天客户突然要求支持IPv6&#xff0c;才发现这个诞生于1988年的老协议已经跟不上时代——就像用传呼机收发4K视频&#xff…...

XUnity自动翻译器:打破语言壁垒的终极Unity游戏汉化解决方案

XUnity自动翻译器&#xff1a;打破语言壁垒的终极Unity游戏汉化解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾经因为语言障碍而错过精彩的游戏剧情&#xff1f;是否在面对日文RPG或英文…...

工业 AI 赋能采购:智能供应商匹配重构招标流程

Q1&#xff1a;传统企业采购招标&#xff0c;供应商对接与筛选存在哪些固有痛点&#xff1f;传统工业企业采购招标模式高度依赖人工经验&#xff0c;存在三大核心痛点&#xff1a;供应商资源固化&#xff1a;每次招标都需从零手动联络供应商&#xff0c;仅依靠采购人员个人记忆…...

ClickHouse性能优化:OLAP数据库实战,让查询飞起来

**作者&#xff1a;洛水石** | **更新日期&#xff1a;2026-05-11** | **标签&#xff1a;ClickHouse | OLAP | 数据库优化 | 大数据**前言上个月&#xff0c;运营同学找我抱怨&#xff1a;每天凌晨的报表查询要等5分钟才能出来&#xff0c;数据量大的时候直接超时。作为DBA&am…...

深入解析91160-cli医疗挂号自动化系统:架构设计与实战部署指南

深入解析91160-cli医疗挂号自动化系统&#xff1a;架构设计与实战部署指南 【免费下载链接】91160-cli 健康160全自动挂号脚本&#xff0c;捡漏神器 项目地址: https://gitcode.com/gh_mirrors/91/91160-cli 在当今医疗资源紧张的环境下&#xff0c;医院挂号难已成为普遍…...

【DeepSeek开发者垂直搜索实战指南】:3大行业落地案例+5个避坑要点,限时公开内部调优参数

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek开发者垂直搜索应用案例全景概览 DeepSeek系列大模型凭借其开源、高性能与强推理能力&#xff0c;正被广泛集成至开发者垂直搜索场景中——从代码片段检索、API文档语义查找&#xff0c;到私有…...

C# 从零开发 MCP 工具基础教程

在C#编程领域&#xff0c;MCP&#xff08;Managed Code Programming&#xff0c;托管代码编程&#xff09;工具能极大提升开发效率与代码管理能力。无论是代码分析、自动化构建&#xff0c;还是调试辅助&#xff0c;一款实用的MCP工具都能成为开发者的得力助手。本教程将带你从…...

AgenticROS:用自然语言操控ROS2机器人的AI Agent接口实践

1. 项目概述&#xff1a;当AI大模型遇见机器人操作系统如果你和我一样&#xff0c;既对AI大模型的能力着迷&#xff0c;又对机器人开发充满兴趣&#xff0c;那么你肯定想过一个问题&#xff1a;能不能让Claude、Gemini这样的AI&#xff0c;像我们人类工程师一样&#xff0c;直接…...

终极大脑训练指南:5个简单步骤用BrainWorkshop提升你的认知能力

终极大脑训练指南&#xff1a;5个简单步骤用BrainWorkshop提升你的认知能力 【免费下载链接】brainworkshop Continued development of the popular brainworkshop game 项目地址: https://gitcode.com/gh_mirrors/br/brainworkshop BrainWorkshop是一款专业的免费开源大…...

天气图片分类模型:基于迁移学习与GPU资源优化

天气图片分类模型:基于迁移学习与GPU资源优化 1. 引言 天气识别在自动驾驶、户外监控、气象服务等领域具有重要应用价值。传统方法依赖于手工设计的特征(如纹理、颜色直方图),鲁棒性不足。深度学习尤其是卷积神经网络(CNN)能够自动从图像中学习层次化特征,显著提升分类…...