【Spring实战】07 JPA

文章目录

    • 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方法和自定义方法,从而使得可以更加清楚的了解它为我们提供了什么便利。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IP 地址归属地查询

IP 地址归属地查询 1. IP 地址归属地查询2. IP 地址归属地查询References 1. IP 地址归属地查询 https://tool.lu/ip/index.html 2. IP 地址归属地查询 https://www.ip.cn/ip/.html References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

OpenAI GPT 模型 API 接口新增参数 top_logprobs 和 logprobs

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 在最新的 OpenAI 官方 APIs 文档中&#xff0c;Create chat completion 中新增了 top_logprobs 和 logprobs 这两个关键参数。 官方文档地址&#xff…

掌握ElasticSearch(一):Elasticsearch安装与配置、Kibana安装

文章目录 〇、简介1.Elasticsearch简介2.典型业务场景3.数据采集工具4.名词解释 一、安装1.使用docker(1)创建虚拟网络(2)Elasticsearch安装步骤 2.使用压缩包 二、配置1.目录介绍2.配置文件介绍3.elasticsearch.yml节点配置4.jvm.options堆配置 二、可视化工具Kibana1.介绍2.安…

MuJava提供的方法级别的7类变异算子总结

MuJava简洁 Java (muJava) 是 Java 程序的变异系统。 它自动生成用于传统突变测试和类级别突变测试的突变体。 Java 可以测试单个类和多个类的包。 用户以对封装在单独 JUnit 类的方法中的被测类的方法调用序列的形式提供测试。 官网地址&#xff1a;Java Home Page 归档表格…

计算机网络面试题目

概述&#xff1a; 1、协议和服务之间的区别&#xff08;协议是水平的&#xff0c;服务是垂直的&#xff09; 2、计算机网络有那些层 应用层通过主机中进程的交互完成特定的网络应用。运输层提供两台主机间的进程之间的通信。网络层对传输层传下来的数据包封装&#xff0c;通过路…

使用 GPT4V+AI Agent 做自动 UI 测试的探索

一、背景 从 Web 诞生之日起&#xff0c;UI 自动化就成了测试的难点&#xff0c;到现在近 30 年&#xff0c;一直没有有效的手段解决Web UI测试的问题&#xff0c;尽管发展了很多的 webdriver 驱动&#xff0c;图片 diff 驱动的工具&#xff0c;但是这些工具的投入产出比一直被…

VMware虚拟机的安装配置

目录 一. VMware虚拟机的安装 二. VMware配置虚拟机 三. VMware安装windows server 2012 一. VMware虚拟机的安装 1. 双击安装&#xff0c;点击下一步 2. 勾选接受许可&#xff0c;点击下一步 3. 选择安装位置&#xff0c;点击下一步 4. 用户体验设置&#xff08;可选&#…

【三维目标检测】【自动驾驶】IA-BEV:基于结构先验和自增强学习的实例感知三维目标检测(AAAI 2024)

系列文章目录 论文&#xff1a;Instance-aware Multi-Camera 3D Object Detection with Structural Priors Mining and Self-Boosting Learning 地址&#xff1a;https://arxiv.org/pdf/2312.08004.pdf 来源&#xff1a;复旦大学 英特尔Shanghai Key Lab /美团 文章目录 系列文…

张江智荟毁约offer

毕业8年后&#xff0c;找工作被国企歧视学历&#xff01;已经收到了offer&#xff0c;在入职前一周被通知要撤回offer&#xff0c;拒绝录用&#xff0c;理由居然是他们只要本科211以上的人 这是我今天&#xff08;2023-12-26&#xff09;亲身经历的事&#xff0c;听说过面试前…

string类的函数讲解

标准库中的string类 首先关于string类的了解&#xff0c;我先给出官方的string类的讲解&#xff0c;以便于大家的学习&#xff1a;链接: http://www.cplusplus.com/reference/string/string/?kwstring 这个网站是C官方网站&#xff0c;里面对于各个关键字和库函数的讲解都是很…

鸿蒙开发中的一些小问题

这是我在学习鸿蒙开发中遇见的小问题 Q1&#xff1a;This custom component must have a build function. <etsLint>Q2&#xff1a;page_title is not translated into en_US(American English)Q3&#xff1a;Module "../CustomComponent/CustomButton" declar…

【论文解读】Learning based fast H.264 to H.265 transcoding

时间&#xff1a; 2015 年 级别&#xff1a; APSIPA 机构&#xff1a; 上海电力大学 摘要 新提出的视频编码标准HEVC (High Efficiency video coding)以其比H.264/AVC更好的编码效率&#xff0c;被工业界和学术界广泛接受和采用。在HEVC实现了约40%的编码效率提升的同时&…

CP2102 驱动安装指南

现在的电脑上已经很少有串口了&#xff0c;在嵌入式开发中经常使用 USB 转串口芯片作为电脑与嵌入式板卡通信的桥梁&#xff0c;CP2102 是一款常见的高端 USB 转串口芯片&#xff0c;要在电脑上使用该芯片功能需要安装驱动程序。 驱动下载 从 官网下载&#xff1a; 驱动安装 安…

HTML5+CSS3+JS小实例:网页手电筒

实例:网页手电筒 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><m…

DBAPI个人版如何升级到企业版

安装好企业版软件&#xff0c;并启动 注意要新建mysql数据库&#xff0c;执行新版本的ddl_mysql.sql脚本 在旧版本系统中分别导出数据源、分组、API&#xff0c;得到3个json文件 注意全选所有的数据导出 在新版本系统中导入数据源 在新版本系统中导入分组 进入分组管理菜单&…

ioDraw AI:思维导图、流程图、序列图、类图、饼图,一应俱全

前言 在信息爆炸的时代&#xff0c;我们每天接收着大量的信息&#xff0c;如何高效地整理和呈现这些信息成为了一项重要的挑战。思维导图作为一种可视化思维工具&#xff0c;能够帮助我们快速构建和整理复杂的信息结构&#xff0c;便于我们理解和记忆。ioDraw AI绘图工具正是基…

跟着LearnOpenGL学习12--光照贴图

文章目录 一、前言二、漫反射贴图三、镜面光贴图3.1、采样镜面光贴图 一、前言 在跟着LearnOpenGL学习11–材质中&#xff0c;我们讨论了让每个物体都拥有自己独特的材质从而对光照做出不同的反应的方法。这样子能够很容易在一个光照的场景中给每个物体一个独特的外观&#xf…

Java学习:多线程编程

一、概念 进程&#xff1a;它是运行中的程序。有的程序启动后可能有多个进程。Java程序的执行时&#xff0c;首先启动一个独立的JVM进程。该进程任务是解析并执行Java字节码。进程各有独立地址空间&#xff0c;JVM进程间不能访问对方所拥有内存空间。 线程&#xff1a;一个进程…

ros2中ros_gz_bridge/gazebo安装的注意事项

这个搞错了&#xff1a;这个是安装ros_gz_bridge的&#xff0c;不是安装gazebo的 AT:如果是安装的Harmonic&#xff0c;在安装ros_gz_bridge的时候要从源码编译 ros2完整版里面好像已经包含了gazebo的一个版本 包名应该就是叫ros-humble-ros-ign-gazebo 所以gazebo是作为一个普…

IRIS、Cache系统类汉化

文章目录 系统类汉化简介标签说明汉化系统包说明效果展示类分类%Library包下的类重点类非重点类弃用类数据类型类工具类 使用说明 系统类汉化 简介 帮助小伙伴更加容易理解后台系统程序方法使用&#xff0c;降低代码的难度。符合本土化中文环境的开发和维护&#xff0c;有助于…