重学SpringBoot3-Spring Data JPA简介

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

重学SpringBoot3-Spring Data JPA简介

  • 1. 什么是 Spring Data JPA?
  • 2. Spring Data JPA 的核心概念
    • 2.1. 实体(Entity)
    • 2.2. Repository(仓库)
    • 2.3. 查询生成策略
  • 3. Spring Boot 3 集成 Spring Data JPA
    • 3.1. 引入依赖
    • 3.2. 数据源配置
    • 3.3. 创建实体类
    • 3.4. 创建 Repository 接口
    • 3.5. 编写服务层
    • 3.6. 编写控制器
    • 3.7. 运行应用
    • 3.8. 测试
      • 3.8.1 新增用户
      • 3.8.2 查询用户
      • 3.8.3 查询所有
      • 3.8.4 删除用户
  • 4. 高级功能
    • 4.1. 分页与排序
    • 4.2. 自定义查询
    • 4.3. 乐观锁与悲观锁
  • 5. 总结

在现代 Java 应用开发中,数据持久化层是非常重要的组成部分。Spring Boot 3 和 Spring Data JPA 的结合为我们提供了一个简洁、高效的解决方案,可以快速实现数据访问层逻辑,减少冗余代码。本文将详细介绍如何在 Spring Boot 3 中集成 Spring Data JPA,并展示一些常见的用法和最佳实践。

1. 什么是 Spring Data JPA?

Spring Data JPA 是 Spring 提供的一个模块,基于 Java Persistence API (JPA) 规范,简化了数据访问层的开发。通过它,我们可以通过少量的配置和代码完成大多数的数据持久化操作。它帮助我们避免了繁琐的 DAO 层代码,实现了一种声明式的数据访问方式。

Spring Data JPA 能够自动生成常见的增删改查方法,并提供了强大的查询生成机制,允许根据方法名自动生成 SQL 语句。

2. Spring Data JPA 的核心概念

2.1. 实体(Entity)

JPA 中的实体是与数据库表对应的 Java 类。每个实体对象都代表数据库表中的一行记录,实体中的每个字段对应表中的一列。

package com.coderjia.boot315shardingsphere.bean;import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Data;@Data
@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false, unique = true)private String username;@Column(nullable = false)private String password;
}

2.2. Repository(仓库)

Spring Data JPA 中的 Repository 是一个接口层,它通过接口方法帮助我们简化与数据库的交互。JpaRepository 是 Spring Data JPA 提供的最重要的接口之一,它包含了常用的 CRUD 操作,并且可以通过命名规则实现动态查询。

public interface UserRepository extends JpaRepository<User, Long> {Optional<User> findByUsername(String username);
}

JpaRepository 继承了哪些接口?

  • CrudRepository:提供基础的增删改查方法(save, findById, delete 等)。
  • PagingAndSortingRepository:提供分页和排序功能。
  • QueryByExampleExecutor:提供查询范例(Query by Example)的能力。

2.3. 查询生成策略

Spring Data JPA 根据方法名称自动生成查询。比如 findByUsername 将自动生成类似于 SELECT * FROM users WHERE username = ? 的 SQL 语句。开发者只需定义方法名称,无需手动编写 SQL。

3. Spring Boot 3 集成 Spring Data JPA

3.1. 引入依赖

首先,在 Spring Boot 3 项目中,需要引入 spring-boot-starter-data-jpa 依赖,同时配置数据库驱动依赖。例如,使用 MySQL 的话,可以这样配置:

<dependencies><!-- Spring Data JPA 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- MySQL 数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>
</dependencies>

3.2. 数据源配置

application.yml 中配置数据库连接:

JPA 可用配置项见 org.springframework.boot.autoconfigure.orm.jpa.JpaProperties

spring:application:name: spring-boot3-15-shardingspheredatasource:url: jdbc:mysql://localhost:3306/master_db?useSSL=false&serverTimezone=UTCusername: rootpassword: root123driver-class-name: com.mysql.cj.jdbc.Driverjpa:database-platform: org.hibernate.dialect.MySQL8DialectgenerateDdl: true   # 自动更新数据库表结构show-sql: true        # 是否显示 SQL 语句

3.3. 创建实体类

接下来,我们创建一个简单的 User 实体:

package com.coderjia.boot315shardingsphere.bean;import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Data;/*** @author CoderJia* @create 2024/10/14 下午 07:52* @Description**/
@Data
@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false, unique = true)private String username;@Column(nullable = false)private String password;
}

3.4. 创建 Repository 接口

接着,我们为 User 实体创建一个 UserRepository 接口,继承 JpaRepository,它会自动为我们生成常见的增删改查方法。

package com.coderjia.boot315shardingsphere.dao;import com.coderjia.boot315shardingsphere.bean.User;
import org.springframework.data.jpa.repository.JpaRepository;import java.util.Optional;/*** @author CoderJia* @create 2024/10/14 下午 07:54* @Description**/
public interface UserRepository extends JpaRepository<User, Long> {Optional<User> findByUsername(String username);
}

3.5. 编写服务层

服务层封装了业务逻辑,依赖于 UserRepository 实现用户相关的操作。

package com.coderjia.boot315shardingsphere.service;import com.coderjia.boot315shardingsphere.bean.User;
import com.coderjia.boot315shardingsphere.dao.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.Optional;/*** @author CoderJia* @create 2024/10/14 下午 07:56* @Description**/
@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public User createUser(User user) {return userRepository.save(user);}public Optional<User> getUserByUsername(String username) {return userRepository.findByUsername(username);}public List<User> getAllUsers() {return userRepository.findAll();}public void deleteUser(Long id) {userRepository.deleteById(id);}}

3.6. 编写控制器

控制器层暴露了 REST API 接口,用户可以通过这些接口与应用进行交互。

package com.coderjia.boot315shardingsphere.controller;import com.coderjia.boot315shardingsphere.bean.User;
import com.coderjia.boot315shardingsphere.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** @author CoderJia* @create 2024/10/14 下午 07:57* @Description**/
@RestController
@RequestMapping("/api/users")
public class UserController {@Autowiredprivate UserService userService;@PostMappingpublic User createUser(@RequestBody User user) {return userService.createUser(user);}@GetMapping("/{username}")public ResponseEntity<User> getUserByUsername(@PathVariable("username") String username) {return userService.getUserByUsername(username).map(ResponseEntity::ok).orElse(ResponseEntity.notFound().build());}@GetMappingpublic List<User> getAllUsers() {return userService.getAllUsers();}@DeleteMapping("/{id}")public void deleteUser(@PathVariable("id") Long id) {userService.deleteUser(id);}
}

3.7. 运行应用

至此,我们已经完成了 Spring Boot 3 集成 Spring Data JPA 的基本配置和功能实现。运行应用后,Spring Data JPA 会自动创建数据库表,并处理数据库的 CRUD 操作。

自动创建数据库表

3.8. 测试

3.8.1 新增用户

新增

3.8.2 查询用户

查询

3.8.3 查询所有

查询所有

3.8.4 删除用户

删除

4. 高级功能

除了基本的增删改查功能,Spring Data JPA 还提供了许多高级功能,例如分页、排序和自定义查询。

4.1. 分页与排序

Spring Data JPA 提供了分页与排序的功能,利用 Pageable 接口,我们可以轻松实现数据的分页查询。

    public Page<User> getUsersPaged(Pageable pageable) {return userRepository.findAll(pageable);}

在控制器中使用分页查询时,可以通过请求参数传递分页信息:

    @GetMapping("/paged")public Page<User> getUsersPaged(@RequestParam("page") int page, @RequestParam("size") int size) {Pageable pageable = PageRequest.of(page, size);return userService.getUsersPaged(pageable);}

分页

4.2. 自定义查询

除了通过方法名称生成查询,Spring Data JPA 还允许我们使用 @Query 注解编写自定义的 JPQL 或原生 SQL 查询。

public interface UserRepository extends JpaRepository<User, Long> {@Query("SELECT u FROM User u WHERE u.username = ?1")Optional<User> findUserByUsername(String username);
}

4.3. 乐观锁与悲观锁

通过 Spring Data JPA,可以使用 JPA 提供的乐观锁和悲观锁机制,确保在并发环境下的数据一致性。

@Data
@Entity
public class Product {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private Integer stock;@Versionprivate Integer version;  // 乐观锁版本字段
}

创建 ProductRepository

import org.springframework.data.jpa.repository.JpaRepository;public interface ProductRepository extends JpaRepository<Product, Long> {
}

创建 ProductService

import jakarta.persistence.OptimisticLockException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class ProductService {@Autowiredprivate ProductRepository productRepository;public void updateProductStock(Long productId, int quantity) {try {Product product = productRepository.findById(productId).orElseThrow();product.setStock(product.getStock() - quantity);productRepository.save(product);  // 触发乐观锁机制} catch (OptimisticLockException e) {System.out.println("OptimisticLockException: Data has been modified by another transaction.");}}
}

测试乐观锁

@SpringBootTest
class OptimisticLockTest {@Autowiredprivate ProductService productService;@Testvoid testOptimisticLocking() throws InterruptedException {// 启动两个线程同时修改同一条记录Thread thread1 = new Thread(() -> productService.updateProductStock(1L, 1));Thread thread2 = new Thread(() -> productService.updateProductStock(1L, 1));thread1.start();thread2.start();thread1.join();thread2.join();}
}

测试乐观锁

5. 总结

Spring Boot 3 + Spring Data JPA 提供了一个强大且易用的数据访问层解决方案。它大大减少了数据访问层的样板代码,使我们能够专注于业务逻辑的开发。通过 JPA 的实体映射、动态查询、分页排序、乐观锁等特性,我们可以非常高效地开发应用程序。

集成 Spring Data JPA 后,我们可以快速上手,构建面向数据库的应用程序,同时保留灵活的扩展能力和强大的功能支持。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot整合mybatisPlus实现批量插入并获取ID

背景&#xff1a;需要实现批量插入并且得到插入后的ID。 使用for循环进行insert这里就不说了&#xff0c;在海量数据下其性能是最慢的。数据量小的情况下&#xff0c;没什么区别。 【1】saveBatch(一万条数据总耗时&#xff1a;2478ms) mybatisplus扩展包提供的&#xff1a;…

吴恩达深度学习(9)

经典的神经网络&#xff1a; 残差网络&#xff08;ResNet&#xff09; 太深的神经网络容易出现梯度消失与梯度爆炸等问题。 跳跃连接&#xff0c;能从一层中得到激活并将其传递给下一层&#xff0c;甚至更深的网络层。利用这个可以训练网络层很深很深的残差网络&#xff08;R…

Go 1.19.4 命令调用、日志、包管理、反射-Day 17

1. 系统命令调用 所谓的命令调用&#xff0c;就是通过os&#xff0c;找到系统中编译好的可执行文件&#xff0c;然后加载到内存中&#xff0c;变成进程。 1.1 exec.LookPath&#xff08;寻找命令&#xff09; 作用&#xff1a; exec.LookPath 函数用于在系统的环境变量中搜索可…

海思hi3536c配置内核支持USB摄像头

linux内核版本&#xff1a;linux-3.18.20 配置步骤 进入Device Drivers 选择Multimedia support&#xff0c;并进入 选择Media USB Adapters&#xff0c;并进入 如下图&#xff0c;选择这几项&#xff1a; 保存退出&#xff0c;重新编译内核下载 内核更新后&#xff0c…

DIFFEDIT: DIFFUSION-BASED SEMANTIC IMAGE EDIT- ING WITH MASK GUIDANCE

https://arxiv.org/pdf/2210.11427 问题引入 针对的问题是输入text prompt完成对图片的编辑&#xff0c;基于的是T2I model&#xff1b;本文的方法不需要额外提供mask来将任务变为inpaint任务&#xff0c;而是可以自动的根据text prompt来提取出需要编辑区域的mask methods

支付域——支付背景

摘要 支付体系作为现代金融的重要组成部分,承担着资金流转与经济交易的关键职能。随着科技的发展,全球支付方式迅速演变,尤其是在中国,移动支付、互联网支付等新兴方式已广泛应用。传统的现金、银行卡支付逐渐被数字支付所取代,支付宝、微信支付等第三方支付机构成为主流…

计算机网络:数据链路层 —— 扩展共享式以太网

文章目录 共享式以太网共享式以太网存在的问题在物理层扩展以太网扩展站点与集线器之间的距离扩展共享式以太网的覆盖范围和站点数量 在链路层扩展以太网网桥的主要结构网桥的基本工作原理透明网桥自学习和转发帧生成树协议STP 共享式以太网 共享式以太网是当今局域网中广泛采…

Leetcode|24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点 ● 面试题 02.07. 链表相交 ● 142.环形链表II

24. 注意&#xff1a;涉及头节点的修改或者删除时&#xff0c;最好设置一个虚拟的头结点&#xff0c;方便简化代码&#xff0c;不必进行是否为头节点的的判断&#xff0c;简化code class Solution { public:ListNode* swapPairs(ListNode* head) {ListNode* dummyHead new Li…

Adobe Acrobat DC 打印PDF文件,没有打印出注释的解决方法

adobe acrobat在打印的时候&#xff0c;打印不出来注释内容&#xff08;之前一直可以&#xff0c;突然就不行&#xff09;&#xff0c;升级版本、嵌入字体等等都试过&#xff0c;也在Google找了半天和问了GPT也么找着办法。 无奈之下&#xff0c;自己通过印前检查&#xff0c;…

ASP.NET Core8.0学习笔记(二十一)——EFCore关系配置API

一、关系配置API概述 当我们需要指定一个字段作为外键&#xff0c;而这个外键又不符合以上四种约定时&#xff0c;就需要在IEntityTypeConfiguration实现类&#xff08;对应的配置类&#xff09;中使用Fluent API直接配置外键。理论上可以通过API直接指定一个属性&#xff0c;…

HTTP快速入门

HTTP报文结构 HTTP 协议主要由三大部分组成&#xff1a; ● 起始行&#xff08;start line&#xff09;&#xff1a;描述请求或响应的基本信息&#xff1b; ● 头部字段&#xff08;header&#xff09;&#xff1a;使用 key-value 形式更详细地说明报文&#xff1b; ● 消息正…

vue 页面导出gif图片 img 导出gif 超简单~

1.首先需要新建一个文件件 新建gif文件夹。这两个文件在文章最后面需要可自提 2.出gif分为两种情况 第一种情况 页面是img标签&#xff0c;直接导出图片作为gif 第二种情况 页面是div标签&#xff0c;需要导出div里面的图片作为gif 2.1页面是img标签&#xff0c;直接导出图…

[论文阅读]Distilling ChatGPT for Explainable Automated Student Answer Assessment

Distilling ChatGPT for Explainable Automated Student Answer Assessment http://arxiv.org/abs/2305.12962 简要概述 文章的背景是 教育领域的学生答题评估&#xff0c;传统的评估需要高成本的人工&#xff0c;随着CHATGPT的发展&#xff0c;研究人员发现这种能够有效处理…

嵌入式QT中基本工程模板分析

大家好,今天主要来分享一下,如何分析一下QT的工程代码文件。 第一:QT工程分析

CentOS安装NVIDIA驱动、CUDA以及nvidia-container-toolkit

0.提前准备 0.1.更新yum源&#xff08;以阿里为例&#xff09; 0.1.1 备份当前的yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 0.1.2 下载新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5 wget -O /etc/yum.repos.d/CentOS-Base…

Xilinx UltraScale系列FPGA纯verilog图像缩放,工程项目解决方案,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明FPGA高端图像处理培训 2、相关方案推荐我这里已有的FPGA图像缩放方案本方案在Xilinx Artix7 系列FPGA上的应用本方案在Xilinx Kintex7 系列FPGA上的应用本方案在Xilinx Zynq7000 系列FPGA上的应用本方案在国产FPGA紫光同创系列上的应用本方案在国产…

Java爬虫API:获取商品详情数据的利器

为什么选择Java爬虫API 强大的库支持&#xff1a;Java拥有丰富的网络编程库&#xff0c;如Apache HttpClient、OkHttp等&#xff0c;这些库提供了强大的HTTP请求功能&#xff0c;使得发送请求和处理响应变得简单。高效的数据处理&#xff1a;Java的数据处理能力&#xff0c;结…

C语言:单链表(不带头节点)

目录 一、单链表概念 单链表的特点 二、单链表的实现 1、打印函数的实现 2、尾插函数的实现 3、全部函数的实现 总结&#xff1a; 一、单链表概念 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。…

沈阳乐晟睿浩科技有限公司:引领抖音小店迈向新纪元

在当今数字化浪潮汹涌的时代&#xff0c;电子商务以其独特的魅力和无限潜力&#xff0c;正深刻改变着人们的消费习惯与商业模式。在这场变革中&#xff0c;沈阳乐晟睿浩科技有限公司凭借其敏锐的市场洞察力和卓越的技术实力&#xff0c;成为了抖音小店领域的佼佼者&#xff0c;…

Maven与Gradle的区别

Maven与Gradle是两种流行的构建工具&#xff0c;广泛用于Java项目的管理和构建。以下是它们的对比&#xff0c;包括官网、Windows 11配置环境、在IDEA中的相同点和不同点&#xff0c;以及它们各自的优缺点。 官网 Maven官网: https://maven.apache.orgGradle官网: https://gr…