Spring Data JPA使用基础教程

news2025/1/23 23:50:22

文章目录

  • Spring Data JPA使用基础教程
    • 一、引言
    • 二、环境搭建
      • 1、添加依赖
      • 2、配置数据库
    • 三、核心组件
      • 1、实体类
      • 2、Repository 接口
    • 四、使用示例
      • 1、基本操作
        • 1.1、保存数据
        • 1.2、查询数据
        • 1.3、更新数据
        • 1.4、删除数据
      • 2、自定义查询
    • 五、最佳实践
        • 1. **合理使用懒加载与急加载**
        • 2. **优化查询性能**
        • 3. **使用缓存提升性能**
        • 4. **批量处理数据**
        • 5. **正确管理事务**
        • 6. **避免N+1查询问题**
        • 7. **启用日志记录和监控**
        • 8. **使用投影减少数据传输**
        • 9. **合理配置主键生成策略**
        • 10. **使用视图简化复杂查询**
    • 六、总结

Spring Data JPA使用基础教程

在这里插入图片描述

一、引言

Spring Data JPA 是 Spring 基于 JPA 规范封装的一套数据访问框架,底层使用了 Hibernate 的 JPA 实现。它极大地简化了数据访问层的开发工作,通过接口继承和方法命名规则,可以自动实现增删改查等常见操作。本教程将介绍 Spring Data JPA 的基本使用方法,帮助开发者快速上手。

二、环境搭建

1、添加依赖

在 Spring Boot 项目中,使用 Spring Data JPA 需要引入以下依赖:

xml复制

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

这些依赖会自动配置 JPA 和数据库连接。

2、配置数据库

application.properties 文件中配置数据库连接信息:

properties复制

spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

spring.jpa.hibernate.ddl-auto=update 会根据实体类自动更新数据库表结构。

三、核心组件

1、实体类

实体类是与数据库表对应的 Java 类,使用 @Entity 注解标记。例如:

java复制

@Entity
@Table(name = "t_user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private String password;

    // Getters and Setters
}

这里定义了一个 User 实体,对应数据库中的 t_user 表。

2、Repository 接口

Spring Data JPA 的核心是 Repository 接口。开发者只需要定义接口,继承 JpaRepository,即可获得基本的 CRUD 操作。例如:

java复制

public interface UserRepository extends JpaRepository<User, Long> {
}

JpaRepository 提供了如 findAll()save()deleteById() 等方法。

四、使用示例

1、基本操作

1.1、保存数据

java复制

User user = new User();
user.setName("John");
user.setPassword("123456");
User savedUser = userRepository.save(user);
1.2、查询数据

java复制

List<User> users = userRepository.findAll();
User user = userRepository.findById(1L).orElse(null);
1.3、更新数据

java复制

User user = userRepository.findById(1L).orElse(null);
user.setPassword("newPassword");
userRepository.save(user);
1.4、删除数据

java复制

userRepository.deleteById(1L);

2、自定义查询

Spring Data JPA 支持通过方法命名规则定义查询。例如:

java复制

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByName(String name);
}

调用 userRepository.findByName("John") 将根据用户名查询用户。

五、最佳实践

在使用Spring Data JPA时,遵循一些最佳实践可以帮助我们更好地利用其功能,同时避免常见的性能问题和陷阱。以下是一些推荐的最佳实践:

1. 合理使用懒加载与急加载
  • **懒加载(Lazy Loading)**是JPA的默认加载策略,适用于大型或不常访问的关系字段。它仅在需要时才加载相关实体,从而节省资源。
  • **急加载(Eager Loading)**适用于频繁访问的关系字段。可以通过@OneToMany(fetch = FetchType.EAGER)@ManyToOne(fetch = FetchType.EAGER)显式指定。
  • 注意:过度使用急加载可能导致性能问题,如加载过多不必要的数据。
2. 优化查询性能
  • 避免在可以通过单个查询完成的任务中运行多个查询。可以使用JPQL、Criteria API或原生查询来优化性能。

  • 使用JOIN FETCH来解决N+1查询问题。例如:

    java复制

    @Query("SELECT e FROM MyEntity e JOIN FETCH e.relatedEntities WHERE e.name = :name")
    List<MyEntity> findByNameWithRelatedEntities(@Param("name") String name);
    

    这样可以减少数据库的查询次数。

3. 使用缓存提升性能
  • 缓存可以显著减少数据库的访问次数,从而提升性能。Spring Data JPA支持与Ehcache、Hazelcast等缓存框架集成。

  • 示例:

    java复制

    @Cacheable("myEntities")
    public List<MyEntity> findAll() {
        return myEntityRepository.findAll();
    }
    

    缓存适用于不经常变化且频繁访问的数据。

4. 批量处理数据
  • 在插入或删除大量数据时,使用批量处理可以减少数据库的往返次数。例如:

    java复制

    public void saveEntities(List<MyEntity> entities) {
        myEntityRepository.saveAll(entities);
    }
    public void deleteEntities(List<MyEntity> entities) {
        myEntityRepository.deleteInBatch(entities);
    }
    

    这样可以显著提升性能。

5. 正确管理事务
  • 确保数据库操作正确地包裹在事务中,以维护数据的完整性。推荐在服务层使用@Transactional注解。

  • 示例:

    java复制

    @Service
    public class MyEntityService {
        @Transactional
        public void updateEntities(List<MyEntity> entities) {
            for (MyEntity entity : entities) {
                myEntityRepository.save(entity);
            }
        }
    }
    
6. 避免N+1查询问题
  • N+1查询问题是指在查询N个实体时,每个实体都触发额外的查询,导致性能下降。可以通过JOIN FETCH解决这个问题。

  • 示例:

    java复制

    @Query("SELECT e FROM MyEntity e JOIN FETCH e.relatedEntities WHERE e.status = :status")
    List<MyEntity> findByStatusWithRelatedEntities(@Param("status") String status);
    
7. 启用日志记录和监控
  • 在开发阶段,启用SQL日志记录可以帮助识别和优化低效的查询。

  • 示例:

    properties复制

    spring.jpa.show-sql=true
    spring.jpa.properties.hibernate.format_sql=true
    
8. 使用投影减少数据传输
  • 如果只需要部分字段,而不是整个实体,可以使用投影来减少从数据库传输的数据量。

  • 示例:

    java复制

    public interface MyEntityProjection {
        String getName();
        String getStatus();
    }
    @Query("SELECT e.name AS name, e.status AS status FROM MyEntity e WHERE e.age > :age")
    List<MyEntityProjection> findNamesAndStatusesByAge(@Param("age") int age);
    
9. 合理配置主键生成策略
  • 明确指定主键生成策略,避免因未设置而导致的插入错误。

  • 示例:

    java复制

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
10. 使用视图简化复杂查询
  • 对于复杂的查询,可以使用数据库视图来简化查询逻辑,减少代码复杂性。

六、总结

Spring Data JPA 是一个强大的数据访问框架,它通过简洁的接口和方法命名规则,极大地简化了数据库操作。通过本教程,读者可以快速掌握 Spring Data JPA 的基本使用方法,并应用于实际项目中。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章

  • [Spring Data JPA使用:看这一篇就够了 - SegmentFault 思否]
  • [Spring Data JPA 的应用(基于案例)]

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

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

相关文章

到华为考场考HCIE的注意事项和考试流程

大家好&#xff0c;我是张同学&#xff0c;来自成都职业技术学院2021级计算机网络专业。最近成功通过了 Datacom HCIE 考试&#xff0c;在这里和大家分享一下我的经验。 考证契机 在母校的培养下&#xff0c;我接触到ICT这个行业&#xff0c;打好了基础&#xff0c;开始了成…

STM32 ST7735 128*160

ST7735 接口和 STM32 SPI 引脚连接 ST7735 引脚功能描述STM32 引脚连接&#xff08;示例&#xff0c;使用 SPI1&#xff09;SCLSPI 时钟信号 (SCK)PA0(SPI1_SCK)SDASPI 数据信号 (MOSI)PA1 (SPI1_MOSI)RST复位信号 (Reset)PA2(GPIO 手动控制)DC数据/命令选择 (D/C)PA3 (GPIO 手…

大华相机DH-IPC-HFW3237M支持的ONVIF协议

使用libONVIF C库。 先发现相机。 配置 lib目录 包含 编译提示缺的文件&#xff0c;到libonvif里面拷贝过来。 改UDP端口 代码 使用msvc 2022的向导生成空项目&#xff0c;从项目的main示例拷贝过来。 CameraOnvif.h #pragma once#include <QObject> #include &l…

JavaWeb过滤器和监听器实现网页计数功能

过滤器用于在请求到达Servlet之前或响应返回给客户端之前对请求或响应进行预处理或后处理操作&#xff0c;监听器用于监听Web应用中的事件。 实现网页计数功能。要完成两项计数&#xff1a; 第一&#xff0c;本网页历史访问人数&#xff1b; 第二&#xff0c;本站当前在线用户…

AIGC视频生成明星——Emu Video模型

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍Meta的视频生成模型Emu Video&#xff0c;作为Meta发布的第二款视频生成模型&#xff0c;在视频生成领域发挥关键作用。 &#x1f33a;优质专栏回顾&am…

Genetic Prompt Search via Exploiting Language Model Probabilities

题目 利用语言模型概率的遗传提示搜索 论文地址&#xff1a;https://www.ijcai.org/proceedings/2023/0588.pdf 项目地址&#xff1a;https://github.com/zjjhit/gap3 摘要 针对大规模预训练语言模型(PLMs)的即时调优已经显示出显著的潜力&#xff0c;尤其是在诸如fewshot学习…

NavVis手持激光扫描帮助舍弗勒快速打造“数字孪生”工厂-沪敖3D

在全球拥有近100家工厂的舍弗勒&#xff0c;从2016年开启数字化运营进程&#xff0c;而当前制造、库存、劳动力和物流的数字化&#xff0c;已无法支持其进一步简化工作流程&#xff0c;亟需数字化物理制造环境&#xff0c;打造“数字孪生”工厂。 NavVis为其提供NavVis VLX 3…

最新-CentOS 7安装1 Panel Linux 服务器运维管理面板

CentOS 7安装1 Panel Linux 服务器运维管理面板 一、前言二、环境要求三、在线安装四、离线安装1.点击下面1 Panel官网链接访问下载&#xff0c;如未登录或注册&#xff0c;请登录/注册后下载2.使用将离线安装包上传至目标终端/tem目录下3.进入到/tem目录下解压离线安装包4.执行…

vscode环境中用仓颉语言开发时调出覆盖率的方法

在vscode中仓颉语言想得到在idea中利用junit和jacoco的覆盖率&#xff0c;需要如下几个步骤&#xff1a; 1.在vscode中搭建仓颉语言开发环境&#xff1b; 2.在源代码中右键运行[cangjie]coverage. 思路1&#xff1a;编写了测试代码的情况&#xff08;包管理工具&#xff09; …

MySQL、HBase、ES的特点和区别

MySQL&#xff1a;关系型数据库&#xff0c;主要面向OLTP&#xff0c;支持事务&#xff0c;支持二级索引&#xff0c;支持sql&#xff0c;支持主从、Group Replication架构模型&#xff08;本文全部以Innodb为例&#xff0c;不涉及别的存储引擎&#xff09;。 HBase&#xff1…

10倍数据交付提升 | 通过逻辑数据仓库和数据编织高效管理和利用大数据

数据已经成为企业核心竞争力的关键要素。随着大数据技术的发展&#xff0c;如何高效管理和利用海量的数据&#xff0c;已成为企业在数字化转型过程中面临的重要课题。传统的数据仓库已经不能满足当今企业对数据处理的高效性、灵活性和实时性的需求。在这种背景下&#xff0c;逻…

【数据分享】1929-2024年全球站点的逐年最低气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff01;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2024年全球气象站点…

Hadoop•搭建完全分布式集群

听说这里是目录哦 一、安装Hadoop&#x1f955;二、配置Hadoop系统环境变量&#x1f96e;三、验证Hadoop系统环境变量是否配置成功&#x1f9c1;四、修改Hadoop配置文件&#x1f36d;五、分发Hadoop安装目录&#x1f9cb;六、分发系统环境变量文件&#x1f368;七、格式化HDFS文…

Java复习第四天

一、代码题 1.相同的树 (1)题目 给你两棵二叉树的根节点p和q&#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1: 输入:p[1,2,3]&#xff0c;q[1,2,3] 输出:true示例 2: 输…

修改word的作者 最后一次保存者 总编辑时间 创建时间 最后一次保存的日期

作者&#xff1a; 1.打开word文件 2.点击左上角的文件 3.选项 4.用户信息 5.将用户信息中的 姓名改为你需要的名字 最后一次保存者 1.word重命名为.zip文件 2.docProps中有个core.xml 3.用记事本打开有个lastModifiedBy标签&#xff0c;将里面内容改为你需要的名字 总编辑时…

C++之初识模版

目录 1.关于模版的介绍 2.函数模版 2.1函数模板概念 2.2函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5模板参数的匹配原则 3.类模版 3.1类模板的定义格式 3.2 类模板的实例化 1.关于模版的介绍 C中的模板是一种通用编程工具&#xff0c;它允许程序员编…

题解 CodeForces 131D Subway BFS C++

题目传送门 Problem - 131D - Codeforceshttps://codeforces.com/problemset/problem/131/Dhttps://codeforces.com/problemset/problem/131/Dhttps://codeforces.com/problemset/problem/131/D 翻译 地铁方案&#xff0c;对于Berland城市来说是一种经典的表示&#xff0c;由…

【STM32】-TTP223B触摸开关

前言 本文章旨在记录博主STM32的学习经验&#xff0c;我自身也在不断的学习当中&#xff0c;如果文章有写的不对的地方&#xff0c;欢迎各位大佬批评指正。 准备工作 今天这篇文章介绍的是触摸开关这一外围硬件。 ST-link调试器STM32最小系统板单路TTP223B触摸传感器模块LE…

ceph基本概念,架构,部署(一)

一、分布式存储概述 1.存储分类 存储分为封闭系统的存储和开放系统的存储&#xff0c;而对于开放系统的存储又被分为内置存储和外挂存储。 外挂存储又被细分为直连式存储(DAS)和网络存储(FAS)&#xff0c;而网络存储又被细分网络接入存储(NAS)和存储区域网络(SAN)等。 DAS(D…

Apache Hive3定位表并更改其位置

Apache Hive3表 1、Apache Hive3表概述2、Hive3表存储格式3、Hive3事务表4、Hive3外部表5、定位Hive3表并更改位置6、使用点表示法引用表7、理解CREATE TABLE行为 1、Apache Hive3表概述 Apache Hive3表类型的定义和表类型与ACID属性的关系图使得Hive表变得清晰。表的位置取决于…