学习笔记085——Spring Data JPA笔记

news2025/6/6 15:58:27

1、什么是Spring Data JPA?

Spring Data JPA 是 Spring 框架的一个子项目,它简化了基于 JPA (Java Persistence API) 的数据访问层的实现。它通过减少样板代码和提供默认实现,让开发者能够更快速地构建数据访问层。

1.1、主要特点

  1. 减少样板代码:自动生成常见的 CRUD 操作实现
  2. 方法名查询:通过方法命名约定自动生成查询
  3. 自定义查询:支持 JPQL 和原生 SQL 查询
  4. 分页和排序:内置支持分页和排序功能
  5. 审计支持:自动记录创建时间、修改时间等
  6. 与 Spring 生态集成:无缝集成 Spring 事务管理等

1.2、核心接口

  • Repository:标记接口,顶级接口
  • CrudRepository:提供基本的 CRUD 操作
  • PagingAndSortingRepository:扩展 CrudRepository,添加分页和排序功能
  • JpaRepository:JPA 特定扩展,提供 flush、批量删除等功能

2、常用的注解

2.1、实体类相关注解

@Entity

  • 作用:将一个类声明为JPA实体,对应数据库中的表。

  • 属性:指定实体名称,默认为类名

@Table

  • 作用:指定实体对应的数据库表信息。
  • 属性
    • name:表名(默认与实体类名相同)
    • schema:数据库schema
    • catalog:数据库catalog
    • uniqueConstraints:唯一约束

@Id

  • 作用:该注解表明该属性字段是一个主键,该属性必须具备,不可缺少。

@GeneratedValue

  • 作用:指定主键生成策略。

  • 属性

    • strategy:生成策略(GenerationType.AUTO/IDENTITY/SEQUENCE/TABLE)

      1、GenerationType.IDENTITY 该注解由数据库自动生成,主键自增型,在 mysql 数据库中使用最频繁,oracle 不支持。

      2、GenerationType.AUTO 主键由程序控制,默认的主键生成策略,oracle 默认是序列化的方式,mysql 默认是主键自增的方式。

      3、GenerationType.SEQUENCE 根据底层数据库的序列来生成主键,条件是数据库支持序列,Oracle支持,Mysql不支持。

      4、GenerationType.TABLE 使用一个特定的数据库表格来保存主键,较少使用。

    • generator:生成器名称

@Column

  • 作用:定义字段与列的映射关系。
  • 属性
    • name:列名
    • nullable:是否允许为null
    • unique:是否唯一
    • length:长度(String类型)
    • precision:精度(BigDecimal)
    • scale:小数位数
    • columnDefinition:列定义SQL片段

@Transient

  • 作用:标记字段不持久化到数据库

  • 示例

    @Transient
    private String tempValue;
    

@Enumerated

  • 作用:定义枚举类型的存储方式

  • 属性

    • value:EnumType.ORDINAL(存储序号)或STRING(存储名称)
  • 示例

    @Enumerated(EnumType.STRING)
    private UserStatus status;
    

@CreatedDate

  • 作用:自动记录创建时间(每次insert的时候,会添加时间进去)

  • 示例

    @CreatedDate
    @Column(name = "create_time")
    private LocalDateTime createTime;
    

@LastModifiedDate

  • 作用:自动记录最后修改时间(每次update的时候,会添加时间进去)

  • 示例

    @LastModifiedDate
    @Column(name = "update_time")
    private LocalDateTime updateTime;
    

@CreatedBy

  • 作用:自动记录创建人

  • 示例

    @CreatedBy
    @Column(name = "created_by")
    private String createdBy;
    

@LastModifiedBy

  • 作用:自动记录最后修改人

  • 示例

    @LastModifiedBy
    @Column(name = "modified_by")
    private String modifiedBy;
    

2.2、关联关系注解

@OneToOne

  • 作用:定义一对一关系
  • 属性
    • mappedBy:指定关系的维护方
    • cascade:级联操作类型
    • fetch:加载策略(FetchType.EAGER/LAZY)

@OneToMany

  • 作用:定义一对多关系
  • 属性
    • mappedBy:指定关系的维护方
    • cascade:级联操作类型
    • fetch:加载策略(FetchType.EAGER/LAZY)

@ManyToOne

  • 作用:定义多对一关系
  • 属性
    • mappedBy:指定关系的维护方
    • cascade:级联操作类型
    • fetch:加载策略(FetchType.EAGER/LAZY)

@ManyToMany

  • 作用:定义多对多关系
  • 属性
    • mappedBy:指定关系的维护方
    • cascade:级联操作类型
    • fetch:加载策略(FetchType.EAGER/LAZY)

2.3、查询方法注解

@Query

  • 作用:定义自定义JPQL或原生SQL查询

  • 属性

    • value:JPQL/SQL查询语句
    • nativeQuery:是否为原生SQL(默认false)
    • countQuery:分页查询时统计总数的查询
  • 示例

    @Query("SELECT u FROM User u WHERE u.email = ?1")
    User findByEmail(String email);
    

@Modifying

  • 作用:标识修改数据的查询(UPDATE/DELETE) 自定义修改数据时,返回值必须为 void 或者 int/Integer!

  • 属性

    • clearAutomatically:执行后是否自动清除持久化上下文
    • flushAutomatically:执行前是否自动flush
  • 示例

    @Modifying
    @Query("UPDATE User u SET u.status = ?2 WHERE u.id = ?1")
    int updateUserStatus(Long id, String status);
    

@EntityGraph

  • 作用:定义实体图的加载策略,解决N+1查询问题
  • 属性
    • attributePaths:要立即加载的属性路径
    • type:加载类型(EntityGraphType.FETCH/LOAD)

3、简单的Demo创建

3.1、引入依赖

<!-- 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>
    <version>8.0.30</version>
</dependency>

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

<!-- 实体类插件 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

3.2、配置文件

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/springbootjpa?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
   username: root
    password: ys_nj_sst!
  jpa:
    hibernate:
      # 控制是否可以基于程序中Entity的定义自动创建或者修改DB中表结构
      ddl-auto: update
    # 是否打印运行时的sql
    show-sql: true

3.3、实体映射Entity

@Entity
@Data
@Table(name = "user")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false,unique = true,length = 20)
    private String username;

    @Column(nullable = false,length = 20)
    private String password;

    @Column(nullable = false)
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")//返回格式化
    private Date regdate;

    @Transient
    private String remark;

}

3.4、定义Dao层

public interface UserRepository extends JpaRepository<User,Long> {
    
    @Query(value = "select * from user u where u.id = ?1",nativeQuery = true)
    User findUserById(@Param("id") Long id);

    /*
    *  注意:jpa手写更新语句时,返回值必须为void 或者 int/Integer
    */
    @Transactional
    @Modifying
    @Query(value = "update user set username = ?2,password = ?3 where id = ?1",nativeQuery = true)
    Integer update(Long id,String username,String password);

    /*
    *  不使用本地查询
    */
    @Query(value = "select u from User u where u.username like %:username%")
    List<User> findByNameMatch(@Param("username") String username);
}

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

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

相关文章

简数采集技巧之快速获取特殊链接网址URL方法

简数采集器列表页提取器的默认配置规则&#xff1a;获取a标签的href属性值作为采集的链接网址&#xff0c;对于大部分网站都是适用的&#xff1b; 但有些网站不使用a标签作为链接跳转&#xff0c;而用javascript的onclick事件替代&#xff0c;那列表页提取器的默认规则将无法获…

AI 如何改变软件文档生产方式?

现代软件工程中的文档革命&#xff1a;从附属品到核心组件的范式升级 在数字化转型浪潮席卷全球的当下&#xff0c;软件系统的复杂度与规模呈现指数级增长。据Gartner最新研究显示&#xff0c;超过67%的企业软件项目延期或超预算的根本原因可追溯至文档系统的缺陷。这一现象在…

激光干涉仪:解锁协作机器人DD马达的精度密码

在工业4.0的浪潮中&#xff0c;协作机器人正以惊人的灵活性重塑生产线——它们与工人并肩作业&#xff0c;精准搬运零件&#xff0c;完成精密装配。还能协同医生完成手术&#xff0c;甚至制作咖啡。 标准的协作机器人关节模组由角度编码器、直驱电机(DD马达)、驱动器、谐波减速…

HOPE800系列变频器安装到快速调试的详细操作说明

以下是HOPE800系列变频器从安装到调试的详细操作说明及重要参数设置&#xff0c;适用于工程技术人员或具备电气基础的操作人员。请严格遵循安全规范操作。 以下面电机铭牌为例&#xff1a; HOPE800变频器安装与调试指南** &#xff08;安全第一&#xff01;操作前务必断电并确…

vCenter与ESXi主机每分钟周期性断连修复

问题概述 最近我的测试服务器借给客户用作临时中转&#xff0c;仅更改了ESXi的管理IP&#xff0c;设备拿回来改回原来IP&#xff0c;vCenter开启后重新接收证书&#xff0c;主机和所有VM管理运行正常&#xff0c;跑着跑着发现主机和vCenter会频繁断开连接后又马上自动恢复&…

web3-区块链困境破解指南:从数字化签名到Rollup 到分片

web3-区块链三难困境破解指南&#xff1a;从数字化签名到Rollup 到分片 数字化签名 实体的签名&#xff1a;将交易和签名者绑定在一起 在数字世界的问题是&#xff1a; 任何人都可以从任一文档复制Bob的签名放到自己想放的地方。 解决方案&#xff1a;让签名由文件来决定 b…

李飞飞World Labs开源革命性Web端3D渲染器Forge!3D高斯溅射技术首次实现全平台流畅运行

在AI与3D技术深度融合的今天&#xff0c;李飞飞领衔的World Labs团队再次成为行业焦点。今日&#xff0c;他们正式开源了Forge——一款专为Web端设计的3D高斯溅射&#xff08;3D Gaussian Splatting&#xff09;渲染器&#xff0c;不仅支持THREE.js生态&#xff0c;更能在手机、…

小鹏汽车5月交付新车33525台 同比增长230%

6月1日&#xff0c;小鹏汽车公布5月交付数据&#xff0c;5月小鹏交付新车33,525台&#xff0c;同比增长230%&#xff0c;与4月交付35,045台相比下降4.3%&#xff0c;已连续7个月交付量突破30,000台。2025年1-5月&#xff0c;小鹏汽车累计交付新车162,578台&#xff0c;同比增长…

OpenCV——Mat类及常用数据结构

Mat类及常用数据结构 一、Mat类简介1.1、矩阵头1.2、矩阵的数据类型1.3、Mat的子类 二、矩阵数据的存储2.1、单通道2.2、多通道 三、创建矩阵的方法3.1、静态方法创建3.2、构造方法创建3.3、读取图像文件创建3.4、克隆创建 四、获取矩阵信息五、矩阵相关操作5.1、获取/修改像素…

每天总结一个html标签——Audio音频标签

Audio标签 文章目录 Audio标签一、audio标签的定义与介绍1. 定义介绍2. 语法3. 支持的格式4.文本提示 二、audio标签的HTML属性1. autoplay2. loop3. muted4. preload 三、audio标签的常用DOM属性四、audio标签的常用事件四、默认样式五、自定义样式1. 示例2. 代码 六、播放 m3…

web3-Remix部署智能合约到“荷兰式”拍卖及以太坊gas费机制细讲

web3-Remix部署智能合约到“荷兰式”拍卖及以太坊gas费机制细讲 一、使用Remix演示智能合约部署 智能合约的代码编写一般都是在Remix上&#xff0c;Remix的好处的话就是可以在浏览器中快速开发和部署合约&#xff0c;无需在本地安装任何程序&#xff0c;十分适合新手。 对应…

网络编程及原理(一)

目录 一 . 独立模式与网络互联 二 . 局域网 —— LAN &#xff08;1&#xff09;基于网线直连 &#xff08;2&#xff09;基于集线器组建 &#xff08;3&#xff09;基于交换机组建 &#xff08;4&#xff09;基于交换机和路由器组建 三 . 广域网 —— WAN 四 …

【Linux】进程 信号保存 信号处理 OS用户态/内核态

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;Linux 目录 一、信号保存 ✨进程如何完成对信号的保存&#xff1f; ✨在内核中的表示 ✨sigset_t ✨信号操作函数 &#x1fa84;sigprocmask --- 获取或设置当前进程的 block表 &#x1fa84;s…

[ Qt ] | 与系统相关的操作(一):鼠标相关事件

目录 信号和事件的关系 (leaveEvent和enterEvent) 实现通过事件获取鼠标进入和鼠标离开 (mousePressEvent) 实现通过事件获得鼠标点击的位置 (mouseReleaseEvent) 前一个的基础上添加鼠标释放事件 (mouseDoubleClickEvent) 鼠标双击事件 鼠标移动事件 鼠标滚轮事件 …

stm32使用hal库模拟spi模式3

因为网上模拟spi模拟的都是模式0&#xff0c;很少有模式3的。 模式3的时序图&#xff0c;在clk的下降沿切换电平状态&#xff0c;在上升沿采样&#xff0c; SCK空闲为高电平 初始化cs&#xff0c;clk&#xff0c;miso&#xff0c;mosi四个io。miso配置为输入&#xff0c;cs、c…

OurBMC技术委员会2025年二季度例会顺利召开

5月28日&#xff0c;OurBMC社区技术委员会二季度例会顺利召开。本次会议采用线上线下结合的方式&#xff0c;各委员在会上听取了OurBMC社区二季度工作总结汇报&#xff0c;规划了2025年三季度的重点工作。 会上&#xff0c;技术委员会主席李煜汇报了社区2025年二季度主要工作及…

postman自动化测试

目录 一、相关知识 1.网络协议 2.接口测试 3.编写测试用例 4.系统架构 二、如何请求 1.get请求 ​编辑2.post请求 3.用环境变量请求 4.Postman测试沙箱 一、相关知识 1.网络协议 规定数据信息发送与解析的方式。 网络传输协议 https相比http&#xff0c;信息在网…

力扣热题100之二叉树的直径

题目 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 代码 方法&#xff1a;递归 计算二叉树的直径可以理解…

数字人技术的核心:AI与动作捕捉的双引擎驱动(210)

**摘要&#xff1a;**数字人技术从静态建模迈向动态交互&#xff0c;AI与动作捕捉技术的深度融合推动其智能化发展。尽管面临表情僵硬、动作脱节、交互机械等技术瓶颈&#xff0c;但通过多模态融合技术、轻量化动捕方案等创新&#xff0c;数字人正逐步实现自然交互与情感表达。…

针对KG的神经符号集成综述 两篇

帖子最后有五篇综述的总结。 综述1 24年TKDD 系统性地概述了神经符号知识图谱推理领域的进展、技术和挑战。首先介绍了知识图谱&#xff08;KGs&#xff09;和符号逻辑的基本概念&#xff0c;知识图谱被视为表示、存储和有效管理知识的关键工具&#xff0c;它将现实世界的知识…