【Spring实战】07 JPA

news2025/2/5 4:54:26

文章目录

    • 1. 定义
    • 2. 出现原因
    • 3. 添加依赖
    • 4. 使用
      • 1)创建 Repository 接口
      • 2)自定义查询方法(非必须)
      • 3)创建实体类
      • 4)调用方法
    • 5. 验证
    • 6. 优点
    • 7. 缺点
    • 8. 详细代码
    • 总结

1. 定义

Spring Data JPA 是 Spring 提供的一个用于简化数据访问层的框架,基于 Java 持久化 API (JPA) 的规范。它允许开发者通过使用注解和接口声明的方式,轻松地实现对关系型数据库的访问和操作。

2. 出现原因

它的出现简化了数据访问层的开发,提供了一种更方便的方式来处理数据库交互。通过使用注解和接口声明的方式,开发者可以更专注于业务逻辑而不是繁琐的数据访问层代码。

在这里插入图片描述

3. 添加依赖

需要在 pom.xml 中添加 Jpa 的依赖(如果使用 Gradle 的话,则需要添加对应的依赖)

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

4. 使用

1)创建 Repository 接口

public interface UserRepository extends JpaRepository<User, Integer> {

}

此类继承自 JpaRepository,它又继承自 ListCrudRepository 。而 ListCrudRepository 又继承自 CrudRepository因此 UserRepository 则拥有了一组基础的 CRUD 方法供我们使用。

public interface JpaRepository<T, ID> extends ListCrudRepository<T, ID>
    
public interface ListCrudRepository<T, ID> extends CrudRepository<T, ID>

在这里插入图片描述

2)自定义查询方法(非必须)

public interface UserRepository extends JpaRepository<User, Integer> {

    // 自定义一个通过名字查询用户信息的方法
    User findByName(String name);
}

如果,基础的 CRUD 方法无法满足我们的时候,我们就可以自定义查询方法了

3)创建实体类

创建一个 User 实体类,并使用 @Entity 注解标注它是一个实体,此处使用了 name 属性去重定义了表名为 t_user,如果没有重定义的话,则表名和类名相同

@Entity(name = "t_user")
public class User {
    @Id
    private Integer id;
    private String name;
    private Integer age;
}

4)调用方法

  • 插入一条

        @GetMapping("insertOne")
        public String insertOne() {
            User user = new User(1, "cheney", 11);
            userRepository.save(user);
            return "一个用户信息保存成功";
        }
    

    此方法,将向数据库中插入一条用户信息

  • 插入多条

        @GetMapping("insertMany")
        public String insertMany() {
            List<User> users = new ArrayList<>();
            users.add(new User(2, "aaa", 11));
            users.add(new User(3, "bbb", 11));
            userRepository.saveAll(users);
            return "一组用户信息保存成功";
        }
    

    此方法,将向数据库中插入两条用户信息

  • 查询全部

        @GetMapping("selectAll")
        public String selectAll() {
            List<User> users = userRepository.findAll();
            StringBuilder sb = new StringBuilder();
            for (User user : users) {
                sb.append(user).append("</br>");
            }
            return sb.toString();
        }
    

    此方法,将从数据库中查询全部用户信息

  • 更新

        @GetMapping("update")
        public String update() {
            // 修改用户信息
            User user = new User(1, "cheney", 22);
            userRepository.save(user);
            // 查询修改后的结果
            return this.getByName();
        }
    

    此方法,将更新指定的用户信息

  • 通过自定义方法查询

        @GetMapping("getByName")
        public String getByName() {
            User user = userRepository.findByName("cheney");
            return user.toString();
        }
    

    此方法,将从数据库中通过名字去查询用户信息

  • 删除

        @GetMapping("delete")
        public String delete() {
            // 删除 用户ID是3的用户信息
            userRepository.deleteById(3);
            // 查询删除后的结果
            return this.selectAll();
        }
    

    此方法,将从数据库中删除指定用户信息

5. 验证

启动服务,然后分别调用下面的请求,验证一下我们的执行结果

  • 使用浏览器执行 insertOne 请求

    在这里插入图片描述

  • 使用浏览器执行 insertMany 请求

    在这里插入图片描述
    %88%98%E3%80%9107%20JPA.assets%2F1703590022774.png&pos_id=img-ERPBOg6B-1703590609987)

  • 使用浏览器执行 selectAll 请求

    在这里插入图片描述

  • 使用浏览器执行 update 请求

    在这里插入图片描述

  • 使用浏览器执行 getByName 请求

    在这里插入图片描述

  • 使用浏览器执行 delete 请求

    在这里插入图片描述

6. 优点

  • 简化开发

    Spring Data JPA 提供了 Repository 接口和方法命名规则,开发者无需手动实现常见的 CRUD 操作,大大简化了数据访问层的开发。

  • 自动化查询生成

    Spring Data JPA 根据方法名命名规则自动生成查询语句,减少了手动编写 SQL 或 JPQL 查询语句的工作量。

  • 支持动态查询

    提供了 Specification 对象,支持动态查询条件的构建,使得动态查询变得更加灵活。

  • 内置分页和排序

    Spring Data JPA 内置了分页和排序的支持,通过 Pageable 对象进行传递,方便进行分页查询。

  • 事务管理

    Spring Data JPA 自动为 Repository 方法添加了事务管理,确保数据库操作是原子的,同时与 Spring 的声明式事务管理集成良好。

  • 支持多种数据源

    Spring Data JPA 支持多种数据源,包括关系型数据库和 NoSQL 数据库,提供了一致的数据访问抽象。

  • 强大的关联关系支持

    支持 JPA 注解,轻松实现实体类之间的关联关系,包括一对一、一对多、多对多等。

  • 集成 Spring 生态

    作为 Spring 生态的一部分,与其他 Spring 组件(如 Spring Boot)集成良好,使用方便。

7. 缺点

  • 学习曲线

    尽管 Spring Data JPA 简化了数据访问层的开发,但对于初学者来说,仍然需要理解 JPA 规范和 Spring Data JPA 的一些特性,学习曲线较陡。

  • 不适合复杂查询

    对于一些复杂的查询需求,特别是涉及多表联合查询和复杂逻辑的情况,自动生成的查询语句可能无法满足需求,需要手动编写 JPQL 或者原生 SQL。

  • 不适用于所有数据库

    尽管 Spring Data JPA 提供了一致的数据访问抽象,但并不是所有数据库都能完全支持 JPA 规范,某些数据库可能需要特定的配置和调整。

  • 性能考虑

    自动生成的查询语句可能不是最优化的,需要开发者关注和优化查询性能。

  • 不支持部分更新

    Spring Data JPA 在执行更新操作时通常是整个实体对象更新,不支持部分字段的更新。

  • 强依赖于 JPA 规范

    如果需要使用非 JPA 规范的数据库特性,可能需要绕过 Spring Data JPA 直接使用原生的 JDBC 或其他持久化框架。

8. 详细代码

https://github.com/cheney09/spring-practical-combat/tree/main/07/demo

在这里插入图片描述

总结

本文从 Spring Data JPA 出现的原因来出发,通过添加进行依赖并通过几个例子讲解了基础CRUD方法和自定义方法,从而使得可以更加清楚的了解它为我们提供了什么便利。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1337139.html

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

相关文章

C# 编写简单二维码条形码工具

C# 二维码条形码工具 该工具简单实现了二维码条形码生成与识别功能&#xff0c;识别方式&#xff1a;通过摄像头实时识别或通过图片文件识别。 using AForge.Genetic; using AForge.Video.DirectShow; using System; using System.Collections.Generic; using System.Component…

实习知识整理6:前后端利用jQuery $.ajax数据传输的四种方式

方式1&#xff1a;前端发送key/value(String字符串)&#xff0c;后台返回文本 前端&#xff1a; <input id"test1" type"button" value"前端发送key/value(String字符串)&#xff0c;后台返回文本"/> $(function() {$("#test1&quo…

YHZ001 Python 简介

配套视频链接: YHZ001 Python 简介 目录 &#x1f649; Python的历史&#x1fab1; Python的作者&#x1f98a; Python 的优缺点&#x1f417; Python 的应用领域&#x1f41e; Python 哲学&#x1f430; Python 解释器 &#x1f649; Python的历史 1989年圣诞节&#xff1a; …

数据智慧:C#中编程实现自定义计算的Excel数据透视表

前言 数据透视表&#xff08;Pivot Table&#xff09;是一种数据分析工具&#xff0c;通常用于对大量数据进行汇总、分析和展示。它可以帮助用户从原始数据中提取关键信息、发现模式和趋势&#xff0c;并以可视化的方式呈现。 在数据透视表中&#xff0c;数据分析师通常希望进…

Redis Streams在Spring Boot中的应用:构建可靠的消息队列解决方案【redis实战 二】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Redis Streams在Spring Boot中的应用&#xff1a;构建可靠的消息队列解决方案 引言前言Redis Streams的基本概念和特性1. 日志数据结构2. 消息和字段3. 消费者组4. 消息ID5. 实时和历史数据处理6. 性能…

1.决策树

目录 1. 什么是决策树? 2. 决策树的原理 2.1 如何构建决策树&#xff1f; 2.2 构建决策树的数据算法 2.2.1 信息熵 2.2.2 ID3算法 2.2.2.1 信息的定义 2.2.2.2 信息增益 2.2.2.3 ID3算法举例 2.2.2.4 ID3算法优缺点 2.2.3 C4.5算法 2.2.3.1 C4.5算法举例 2.2.4 CART算法 2.2.4…

智能优化算法应用:基于孔雀算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于孔雀算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于孔雀算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.孔雀算法4.实验参数设定5.算法结果6.参考文献7.MA…

机械革命极光Pro重装Win10系统图解

机械革命极光Pro是性能优秀的笔记本电脑&#xff0c;深受广大用户的喜欢&#xff0c;现在用户想给笔记本电脑重新安装一下操作系统&#xff0c;但不知道重装系统的详细步骤。下面小编将带来机械革命极光Pro笔记本电脑重装系统Win10版本的步骤介绍&#xff0c;帮助更多的用户完成…

Python 基础面试第三弹

1. 获取当前目录下所有文件名 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import os def get_all_files(directory): file_list []<br> # <code>os.walk</code>返回一个生成器&#xff0c;每次迭代时返回当前目录路径、子目录列表和文件列表 for…

【Kafka】Kafka客户端认证失败:Cluster authorization failed.

背景 kafka客户端是公司内部基于spring-kafka封装的spring-boot版本&#xff1a;3.xspring-kafka版本&#xff1a;2.1.11.RELEASE集群认证方式&#xff1a;SASL_PLAINTEXT/SCRAM-SHA-512经过多年的经验&#xff0c;以及实际验证&#xff0c;配置是没问题的&#xff0c;但是业务…

数据结构:图文详解 树与二叉树(树与二叉树的概念和性质,存储,遍历)

目录 一.树的概念 二.树中重要的概念 三.二叉树的概念 满二叉树 完全二叉树 四.二叉树的性质 五.二叉树的存储 六.二叉树的遍历 前序遍历 中序遍历 后序遍历 一.树的概念 树是一种非线性数据结构&#xff0c;它由节点和边组成。树的每个节点可以有零个或多个子节点…

113基于matlab的PSO-SVM多输入单输出预测程序

基于matlab的PSO-SVM多输入单输出预测程序。PSO对SVM的两个参数进行优化得到最佳参数值进行预测。并输出预测误差等相应结果。程序已调通&#xff0c;可直接运行。 113matlabPSO-SVM多输入单输出 (xiaohongshu.com)

普中STM32-PZ6806L开发板(STM32CubeMX创建项目并点亮LED灯)

简介 搭建一个用于驱动 STM32F103ZET6 GPIO点亮LED灯的任务;电路原理图 LED电路原理图 芯片引脚连接LED驱动引脚原理图 创建一个点亮LED灯的Keil 5项目 创建STM32CubeMX项目 New Project -> 单击 -> 芯片搜索STM32F103ZET6->双击创建 初始化时钟 初始化LED G…

基于双闭环PI的SMO无速度控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于双闭环PI的SMO无速度控制系统simulink建模与仿真&#xff0c;基于双闭环PI的SMO无速度控制系统主要由两个闭环组成&#xff1a;一个是电流环&#xff0c;另一个是速度环。…

Flink CDC 1.0至3.0回忆录

Flink CDC 1.0至3.0回忆录 一、引言二、CDC概述三、Flink CDC 1.0&#xff1a;扬帆起航3.1 架构设计3.2 版本痛点 四、Flink CDC 2.0&#xff1a;成长突破4.1 DBlog 无锁算法4.2 FLIP-27 架构实现4.3 整体流程 五、Flink CDC 3.0&#xff1a;应运而生六、Flink CDC 的影响和价值…

数据库原理及应用·数据库保护

7.1 事务 7.1.1 事务定义 1.事务是用户定义的一个数据操作序列&#xff0c;这些操作要么全部执行、要么全部不执行&#xff0c;是一个不可分割的工作单元。 事务是恢复和并发控制的基本单位 事务的两种方式&#xff1a; 7.1.2 事务处理模型 1.ISO事务处理模型&#xff1a…

隐私第一:在几分钟内部署本地大语言模型!

彻底改变您的数据安全游戏&#xff1a;快速无缝部署本地大语言模型&#xff0c;实现无与伦比的隐私! 2023年是人工智能领域加速发展的一年。除了健壮的商业上可用的大型语言模型之外&#xff0c;还出现了许多值得称赞的开源方案&#xff0c;例如Llama2、Codellama、Mistral和Vi…

鸿蒙开发中的坑(持续更新……)

最近在使用鸿蒙开发时&#xff0c;碰到了一些坑&#xff0c;特做记录&#xff0c;如&#xff1a;鸿蒙的preview不能预览&#xff0c;轮播图组件Swiper使用时的问题&#xff0c;console.log() 打印的内容 一、鸿蒙的preview不能预览 首先&#xff0c;只有 ets文件才能预览。 其…

HarmonyOS应用抓包实战

Charles抓包原理 Charles是一个HTTP代理服务器,HTTP监视器,反转代理服务器&#xff0c;当浏览器连接Charles的代理访问互联网时&#xff0c;Charles可以监控浏览器发送和接收的所有数据。 在开发OpenHarmony/HarmonyOS应用开发时&#xff0c;我们使用的是ohos/axios来进行网络…

2023.12.25 关于 Redis 数据类型 Hash 常用命令、内部编码、应用场景

目录 Hash 数据类型 Hash 操作命令 HSET HGET HEXISTS HDEL HKEYS HVALS HGETALL HMGET HLEN HSETNX HINCRBY HINCRBYFLOAT HSTRLEN Hash 编码方式 理解什么是压缩 Hash 实际应用 Cache 缓存 Hash 数据类型 整体上来说 Redis 是键值对结构&#xff0c;其中 …