重学SpringBoot3-Spring Data JPA简介

news2025/1/13 17:32:42

更多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-shardingsphere
  datasource:
    url: jdbc:mysql://localhost:3306/master_db?useSSL=false&serverTimezone=UTC
    username: root
    password: root123
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    database-platform: org.hibernate.dialect.MySQL8Dialect
    generateDdl: 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 {

    @Autowired
    private 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 {

    @Autowired
    private UserService userService;

    @PostMapping
    public 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());
    }

    @GetMapping
    public 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;

    @Version
    private 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 {

    @Autowired
    private 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 {

    @Autowired
    private ProductService productService;

    @Test
    void 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.coloradmin.cn/o/2215091.html

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

相关文章

若依前后端框架学习——新建模块(图文详解)

若依框架—新建模块 一、项目地址1、后端启动2、前端启动 二、生成代码1、添加菜单2、创建表结构3、生成代码2、编辑一些基本信息&#xff0c;然后点击提交3、生成代码&#xff0c;压缩包里有前端和后端代码 三、配置后端模块1、新建模块2. 修改pom.xlm2.1 修改第一个pom.xml 2…

关于jmeter设置为中文问题之后无法保存设置的若干问题

1、jemeter如何设置中文模式 Options--->Choose Language--->Chinese(Simplifies), 如此设置后就可显示中文模式(缺点&#xff1a;下次打开还是英文)&#xff1b;如下图所示&#xff1a; 操作完成之后&#xff1a; 但是下次重启之后依旧是英文&#xff1b; 2、在jmeter.…

探索 Jupyter 笔记本转换的无限可能:nbconvert 库的神秘面纱

文章目录 探索 Jupyter 笔记本转换的无限可能&#xff1a;nbconvert 库的神秘面纱背景&#xff1a;为何选择 nbconvert&#xff1f;库简介&#xff1a;nbconvert 是什么&#xff1f;安装指南&#xff1a;如何安装 nbconvert&#xff1f;函数用法&#xff1a;简单函数示例应用场…

18-基于双TMS320C6678 DSP的3U VPX的信号处理平台

一、板卡概述 该板卡是由我公司自主研发的基于3U VPX架构的信号处理板&#xff0c;该处理板包含2片TI的TMS320C6678 DSP芯片&#xff0c;1片Xilinx公司的Spartan-3系列XC3S200AN配置芯片&#xff0c;两片DSP分别有1路RapidIO x4连接至VPX背板&#xff0c;两片DSP之间通过Hyperl…

scratch机器人捡垃圾 2024年9月scratch二级真题 中国电子学会 图形化编程 scratch二级真题和答案解析

目录 scratch机器人捡垃圾 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 …

N-MOS 和 P-MOS,增强型和耗尽型

本文主要叙述N沟道MOS管&#xff08;N-MOS&#xff09;和P沟道MOS管&#xff08;P-MOS&#xff09;的区别&#xff0c;以及的增强型和耗尽型的区别。 一、N-MOS和P-MOS的区别 N沟道MOS管在栅极上施加正向偏压&#xff08;Vgs>0&#xff09;&#xff0c;且只有栅源电压&…

Redis学习笔记:简单动态字符串

简单动态字符串 C语言传统的字符串是使用字符数组表示的&#xff0c;Redis没有直接使用C语言传统的字符串表示&#xff0c;而是构建了一种名为简单动态字符串&#xff08;simple dynamic string&#xff0c;SDS&#xff09;的抽象类型&#xff0c;并将SDS作为Redis的默认字符串…

助力语音技术发展,景联文科技提供语音数据采集服务

语音数据采集是语音识别技术、语音合成技术以及其他语音相关应用的重要基础。采集高质量的语音数据有助于提高语音识别的准确性&#xff0c;同时也能够促进语音技术的发展。 景联文科技作为专业的数据采集标注公司&#xff0c;支持语音数据采集。可通过手机、专业麦克风阵列、专…

极米智驾仪表盘(开源!!)

1.演示&#xff1a; 驾驶界面图 有图无真相&#xff0c;下面视频展示&#xff1a; 汽车仪表盘展示 整个汽车中控仪表盘界面展示&#xff1a; 极米智驾仪表盘中控 极米智驾仪表盘在arm开发板上运行的效果: &#xff08;因为CSDN只能上传到2M多的视频大小&#xff0c;所以视频只…

C++笔记之类三种的继承方式

C++笔记之类三种的继承方式 code review! 文章目录 C++笔记之类三种的继承方式1.《C++ Primer Plus》(第6版)中文版Page 5502.C++类继承方式与能否隐式向上转换的关系1.《C++ Primer Plus》(第6版)中文版Page 550 除基类私有成员变量外(基类公有成员变量和保护成员变量):…

Golang | Leetcode Golang题解之第479题最大回文数乘积

题目&#xff1a; 题解&#xff1a; func largestPalindrome(n int) int {if n 1 {return 9}upper : int(math.Pow10(n)) - 1for left : upper; ; left-- { // 枚举回文数的左半部分p : leftfor x : left; x > 0; x / 10 {p p*10 x%10 // 翻转左半部分到其自身末尾&…

【火山引擎】 Chat实践 | 大模型调用实践 | python

目录 一 前期工作 二 Doubao-pro-4k_test实践 一 前期工作 1 已在火山方舟控制台在线推理页面创建了推理接入点 ,接入大语言模型并获取接入点 ID。 2 已参考安装与初始化中的步骤完成 SDK 安装和访问凭证配置

初级网络工程师之从入门到入狱(四)

本文是我在学习过程中记录学习的点点滴滴&#xff0c;目的是为了学完之后巩固一下顺便也和大家分享一下&#xff0c;日后忘记了也可以方便快速的复习。 网络工程师从入门到入狱 前言一、Wlan应用实战1.1、拓扑图详解1.2、LSW11.3、AC11.4、抓包1.5、Tunnel隧道模式解析1.6、AP、…

Golang | Leetcode Golang题解之第473题火柴拼正方形

题目&#xff1a; 题解&#xff1a; func makesquare(matchsticks []int) bool {totalLen : 0for _, l : range matchsticks {totalLen l}if totalLen%4 ! 0 {return false}tLen : totalLen / 4dp : make([]int, 1<<len(matchsticks))for i : 1; i < len(dp); i {dp…

pymobiledevice3使用介绍(安装、常用命令、访问iOS沙盒目录)

项目地址&#xff1a;https://github.com/doronz88/pymobiledevice3 首先先介绍一下pymobiledevice3&#xff0c; pymobiledevice3是用Python3 实现的&#xff0c;用于处理 iDevices&#xff08;iPhone 等&#xff09;。它可以跨平台使用&#xff0c;支持&#xff1a;windows…

如何启动hive

检查mysql是否启动 通过Navicat测试mysql是否可以连接 找打hive配置文件所在目录 检查连接mysql的账号密码是否正确,如果不正确就要修改为正确的 初始化hive元数据存储的库:schematool -dbType <database_type> -initSchema 检查mysql中是否创建hive数据库,这里看到hive数…

Windows11远程桌面连接的详细步骤

1、打开设置 2、关闭被控电脑的防火墙 设置中搜索“防火墙” 关闭防火墙 最好三个防火墙都关上 3、打开被控电脑的远程桌面允许 设置中搜索“远程桌面” 打开远程桌面 4、查询电脑输入IP地址 Windows键R键打开CMD&#xff0c;输入ipconfig查询IP地址 5、查询电脑用户名 设置…

入门CCRC数据安全评估师认证要学习哪些内容?

CCRC-DSA&#xff08;中国网络安全审查认证和市场监管大数据中心-数据安全评估师&#xff09;认证&#xff0c;作为国内数据安全领域的权威认证之一&#xff0c;对于从事数据安全工作的专业人士来说&#xff0c;具有极高的含金量。 那么&#xff0c;想要考取这一认证&#xff…

鸿蒙开发 四十一 ArkTs 模块化实战

实际开发中&#xff0c;可能有些工具类或者一些公共代码&#xff0c;用的地方比较多&#xff0c;这时候就可以封装成一个模块 在tools目录下新建了一个module1.ets文件&#xff0c;定义了一个变量name1&#xff0c;定义好之后&#xff0c;另外起一行用export default 修饰name…

面对配分函数 - 随机最大似然和对比散度篇

序言 在统计学和机器学习的领域中&#xff0c;随机最大似然&#xff08; Stochastic Maximum Likelihood \text{Stochastic Maximum Likelihood} Stochastic Maximum Likelihood&#xff09;和对比散度&#xff08; Contrastive Divergence \text{Contrastive Divergence} Con…