【Spring Boot】Java 持久层 API:JPA

Java 持久层 API:JPA

  • 1.Spring Data
    • 1.1 主要模块
    • 1.2 社区模块
  • 2.JPA
  • 3.使用 JPA
    • 3.1 添加 JPA 和 MySQL 数据库的依赖
    • 3.2 配置数据库连接信息
  • 4.了解 JPA 注解和属性
    • 4.1 常用注解
    • 4.2 映射关系的注解
    • 4.3 映射关系的属性
  • 5.用 JPA 构建实体数据表

1.Spring Data

Spring Data 是 Spring 的一个子项目,旨在统一和简化各类型数据的持久化存储方式,而不拘泥于是关系型数据库还是 NoSQL 数据库。

无论是哪种持久化存储方式,数据访问对象Data Access ObjectsDAO)都会提供对对象的增加、删除、修改和查询的方法,以及排序和分页方法等。

Spring Data 提供了基于这些层面的统一接口(如:CrudRepository、PagingAndSortingRepository),以实现持久化的存储。

Spring Data 包含多个子模块,主要分为主模块和社区模块。

1.1 主要模块

模块名称
作用
Spring Data Commons提供共享的基础框架,适合各个子项目使用,支持跨数据库持久化。
Spring Data JDBC提供了对 JDBC 的支持,其中封装了 JDBCTemplate。
Spring Data JDBC Ext提供了对 JDBC 的支持,并扩展了标准的 JDBC,支持 Oracle RAD、高级队列和高级数据类型。
Spring Data JPA简化创建 JPA 数据访问层和跨存储的持久层功能。
Spring Data KeyValue集成了 Redis 和 Riak,提供多个常用场景下的简单封装,便于构建 key-value 模块。
Spring Data LDAP集成了 Spring Data repository 对 Spring LDAP 的支持。
Spring Data MongoDB集成了对数据库 MongoDB 支持。
Spring Data Redis集成了对 Redis 的支持。
Spring Data REST集成了对 RESTful 资源的支持。
Spring Data for Apache Cassandra集成了对大规模、高可用数据源 Apache Cassandra 的支持。
Spring Data for Apace Geode集成了对 Apache Geode 的支持。
Spring Data for Apache Solr集成了对 Apache Solr 的支持。
Spring Data for Pivotal GemFire集成了对 Pivotal GemFire 的支持。

1.2 社区模块

模块名称
作用
Spring Data Aerospike集成了对 Aerospike 的支持
Spring Data ArangoDB集成了对 ArangoDB 的支持。
Spring Data Couchbase集成了对 Couchbase 的支持。
Spring Data Azure Cosmos DB集成了对 Azure Cosmos 的支持。
Spring Data Cloud Datastore集成了对 Google Datastore 的支持
Spring Data Cloud Spanner集成了对 Google Spanner 的支持。
Spring Data DynamoDB集成了对 DynamoDB 的支持。
Spring Data Elasticsearch集成了对搜索引擎框架 Elasticsearch 的支持。
Spring Data Hazelcast集成了对 Hazelcast 的支持。
Spring Data Jest集成了对基于 Jest REST client 的 Elasticsearch 的支持。
Spring Data Neo4j集成了对 Neo4j 数据库的支持。
Spring Data Vault集成了对 Vault 的支持。

2.JPA

JPA(Java Persistence APl)是 Java 的持久化 API,用于对象的持久化。它是一个非常强大的 ORM 持久化的解决方案,免去了使用 JDBCTemplate 开发的编写脚本工作。JPA 通过简单约定好接口方法的规则自动生成相应的 JPQL 语句,然后映射成 POJO 对象。

JPA 是一个规范化接口,封装了 Hibernate 的操作作为默认实现,让用户不通过任何配置即可完成数据库的操作。JPA、Spring Data 和 Hibernate 的关系如下图所示。
在这里插入图片描述
Hibernate 主要通过 hibernate-annotationhibernate-entitymanagerhibernate-core 三个组件来操作数据。

  • hibernate-annotation:是 Hibernate 支持 annotation 方式配置的基础,它包括标准的 JPAannotation、Hibernate 自身特殊功能的 annotation。
  • hibernate-core:是 Hibernate 的核心实现,提供了 Hibernate 所有的核心功能。
  • hibernate-entitymanager:实现了标准的 JPA,它是 hibernate-core 和 JPA 之间的适配器,它不直接提供 ORM 的功能,而是对 hibernate-core 进行封装,使得 Hibernate 符合 JPA 的规范。

如果要 JPA 创建《Java 的数据库连接模板:JDBCTemplate》中 “2.2 新建实体类” 里的实体,可使用以下代码来实现。

@Data
@Entity
public class User {private int id;@Id// id 的自增由数据库自动管理@GeneratedValue(strategy = GenerationType.IDENTITY)private String username;private String password;
}

对比 JPA 与 JDBCTemplate 创建实体的方式可以看出:JPA 的实现方式简单明了,不需要写映射(支持自定义映射),只需要设置好属性即可。id 的自增由数据库自动管理,也可以由程序管理,其他的工作 JPA 自动处理好了。

3.使用 JPA

要使用 JPA,只要加入它的 Starter 依赖,然后配置数据库连接信息。

3.1 添加 JPA 和 MySQL 数据库的依赖

下面以配置 JPA 和 MySQL 数据库的依赖为例,具体配置见以下代码:

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

3.2 配置数据库连接信息

Spring Boot 项目使用 MySQL 等关系型数据库,需要配置连接信息,可以在 application.properties 文件中进行配置。以下代码配置了与 MySQL 数据库的连接信息:

spring.datasource.url=jdbc:mysql://127.0.0.1/book?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql= true
  • spring.datasource.username:要填写的数据库用户名。
  • spring.datasource.password:要填写的数据库密码。
  • spring.jpa.show-sql:开发工具的控制台是否显示 SQL语句,建议打开。
  • spring.jpa.properties.hibernate.hbm2ddl.auto:hibernate 的配置属性,其主要作用是自动创建、更新、验证数据库表结构。该参数的几种配置如下表所示。
属性
说明
create每次加载 Hibernate 时都会删除上一次生成的表,然后根据 Model 类再重新生成新表,哪怕没有任何改变也会这样执行,这会导致数据库数据的丢失。
create-drop每次加载 Hibernate 时会根据 Model 类生成表,但是 sessionFactory 一旦关闭,表就会自动被删除。
update最常用的属性。第一次加载 Hibernate 时会根据 Model 类自动建立表的结构(前提是先建立好数据库)。以后加载 Hibernate 时,会根据 Model 类自动更新表结构,即使表结构改变了,但表中的数据仍然存在,不会被删除。要注意的是,当部署到服务器后,表结构是不会被马上建立起来的,要等应用程序第一次运行起来后才会建立。Update 表示如果 Entity 实体的字段发生了变化,那么直接在数据库中进行更新。
validate每次加载 Hibernate 时,会验证数据库的表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

4.了解 JPA 注解和属性

4.1 常用注解

注解
说明
@Entity声明类为实体
@Table声明表名,@Entity 和 @Table 注解一般一块使用,如果表名和实体类名相同,那么 @Table 可以省略
@Basic指定非约束明确的各个字段
@Embedded用于注释属性,表示该属性的类是嵌入类(@embeddable 用于注释 Java 类的,表示类是嵌入类)
@Id指定的类的属性,一个表中的主键
@GeneratedValue指定如何标识属性可以被初始化,如 @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="repair_seq"),表示主键生成策略是 sequence,还有 Auto、Identity、Native 等
@Transient表示该属性并非一个数据库表的字段的映射,ORM 框架将忽略该属性。如果一个属性并非数据库表的字段映射,就务必将其标示为 @Transient,即它是不持久的,为虚拟字段
@Column指定持久属性,即字段名。如果字段名与列名相同,则可以省略。使用方法,如 @Column(length=11, name="phone", nullable=false, columnDefinition="varchar(11) unique comment '电话号码'")
@SequenceGenerator指定在 @GeneratedValue 注解中指定的属性的值。它创建一个序列
@TableGenerator在数据库生成一张表来管理主键生成策略
@AccessType这种类型的注释用于设置访问类型。如果设置 @AccessType(FIELD),则可以直接访问变量,并且不需要使用 Getter 和 Setter 方法,但必须为 public 属性。如果设置 @AccessType(PROPERTY),则通过 Getter 和 Setter 方法访问 Entity 的变量
@UniqueConstraint指定的字段和用于主要或辅助表的唯一约束
@ColumnResult可以参考使用 select 子句的 SQL 查询中的列名
@NamedQueries指定命名查询的列表
@NamedQuery指定使用静态名称的查询
@Basic指定实体属性的加载方式,如 @Basic(fetch=FetchType.LAZY)
@Jsonignore作用是 JSON 序列化时将 Java Bean 中的一些属性忽略掉,序列化和反序列化都受影响

4.2 映射关系的注解

注解
说明
@JoinColumn指定一个实体组织或实体集合。用在 多对一一对多 的关联中
@OneToOne定义表之间 一对一 的关系
@OneToMany定义表之间 一对多 的关系
@ManyToOne定义表之间 多对一 的关系
@ManyToMany定义表之间 多对多 的关系

4.3 映射关系的属性

属性名
说明
targetEntity表示默认关联的实体类型,默认为当前标注的实体类。
cascade表示与此实体一对一关联的实体的级联样式类型,以及当对实体进行操作时的策略。在定义关系时经常会涉及是否定义 Cascade(级联处理)属性,如果担心级联处理容易造成负面影响,则可以不定义。它的类型包括 CascadeType.PERSIST(级联新建)、CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新)、CascadeType.ALL(级联新建、更新、删除、刷新)。
fetch该实体的加载方式,包含 LAZY 和 EAGER。
optional表示关联的实体是否能够存在 null 值。默认为 true,表示可以存在 null 值。如果为 false,则要同时配合使用 @JoinColumn 标记。
mappedBy双向关联实体时使用,标注在不保存关系的实体中。
JoinColumn关联指定列。该属性值可接收多个 @JoinColumn。用于配置连接表中外键列的信息。@JoinColumn 配置的外键列参照当前实体对应表的主键列。
JoinTable两张表通过中间的关联表建立联系时使用,即多对多关系。
PrimaryKeyJoinColumn主键关联。在关联的两个实体中直接使用注解 @PrimaryKeyJoinColumn 注释。

懒加载 LAZY 和实时加载 EAGER 的目的是,实现关联数据的选择性加载。

  • 懒加载 是一种延迟加载策略,即在真正需要访问对象的属性时,才从数据库中加载数据。当 Hibernate 在查询数据库时遇到关联对象(如一对多、多对一、多对多等关系),并不会立即加载关联对象的数据,而只会加载主键 ID。只有当程序真正需要访问关联对象的属性时,Hibernate 才会发出 SQL 语句去加载数据。这种策略的优点在于,如果程序并不需要访问关联对象的所有属性,那么就可以节省数据库访问的开销,提高程序性能。但是,如果在使用懒加载的对象后关闭了 Session,那么在访问其关联对象的属性时,就会抛出 LazyInitializationException 异常,因为 Hibernate 需要在 Session 的作用范围内才能发出 SQL 语句加载数据。
  • 实时加载 是一种积极加载策略,即在加载一个对象时,会立即加载与其关联的所有对象。当 Hibernate 在查询数据库时遇到关联对象,会立即发出 SQL 语句加载关联对象的数据,并将其全部加载到内存中。这种策略的优点在于,程序可以随时访问关联对象的属性,而无需担心 Session 是否已经关闭。但是,如果关联对象的数据量很大,那么就会消耗大量的内存,并可能导致性能下降。

在 Spring Data JPA 中,要控制 Session 的生命周期,否则会出现 could not initialize proxy [xxxx#18] - no Session 错误。可以在配置文件中配置以下代码来控制 Session 的生命周期:

spring.jpa.open-in-view=true
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

5.用 JPA 构建实体数据表

下面通过实例来体验如何通过 JPA 构建对象/关系映射的实体模型。

package com.example.demo.entity;import lombok.Data;import javax.persistence.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;@Entity
@Data
public class Article implements Serializable {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private long id;@Column(nullable = false, unique = true)@NotEmpty(message = "标题不能为空")private String title;@Column(columnDefinition = "enum('图','图文','文')")private String type;private Boolean available = Boolean.FALSE;@Size(min = 0, max = 20)private String keyword;@Size(max = 255)private String description;@Column(nullable = false)private String body;@Transientprivate List keywordlists;public List getKeywordlists() {return Arrays.asList(this.keyword.trim().split("|"));}public void setKeywordlists(List keywordlists) {this.keywordlists = keywordlists;}
}

如果想创建虚拟字段,则通过在属性上加注解 @Transient 来解决。

运行项目后会自动生成数据表。完成后的数据表如下图所示。

在这里插入图片描述

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

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

相关文章

Redis基础教程(十):HyperLogLog

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

Linux爱好者能对Linux痴迷到什么程度?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;曾经想帮助全世界的人卸载掉…

技术职务管理助力智慧校园建设:深入解读人事系统

智慧校园人事系统中的技术职务管理模块&#xff0c;专注于高校及教育机构内技术人员及科研人员的职务管理&#xff0c;涵盖职称评审、技术职务任命、项目参与记录、科研成果跟踪及技术能力评估等多个方面&#xff0c;旨在通过信息化手段提升技术人才管理的效率与科学性。 在这一…

Windows如何安装并启动Nginx

0、前言 Nginx 是一款高性能、轻量级的Web服务器和反向代理服务器&#xff0c;广泛应用于互联网领域。它以其高效稳定、内存占用少和丰富的模块化设计而受到开发者们的青睐。 在实际使用过程中&#xff0c;我们多数时候会在Linux系统上运行Nginx&#xff0c;但实际上&#xff…

单目行车测距摄像系统(单目测距-行车)

单目行车测距摄像系统是一种利用单个摄像头实现车辆行驶中前方障碍物距离测量的技术。该系统通过计算机视觉算法&#xff0c;能够实时分析摄像头捕捉的图像&#xff0c;精确计算出车辆与前方物体之间的距离&#xff0c;对于自动驾驶、高级驾驶辅助系统&#xff08;ADAS&#xf…

24年hvv不要掉进秘网了,特别别被反制了

这两年的hvv&#xff0c;防守方已经不单单是每天坐那看监控、封ip了&#xff0c;越来越多的大佬投身防守工作中&#xff0c;让防守从被动变成了一个主动的活了。 目前最常见的主动防守有2种&#xff0c;1、长时间的蜜罐运营。2、蜜罐反制。 01-蜜罐运营 蜜罐这个词干安全的都…

七、函数练习

目录 1. 写一个函数可以判断一个数是不是素数。&#xff08;素数只能被1或其本身整除的数&#xff09; 2. 一个函数判断一年是不是闰年。 3.写一个函数&#xff0c;实现一个整形有序数组的二分查找。 4. 写一个函数&#xff0c;每调用一次这个函数&#xff0c;使得num每次增…

基于PHP花涧订购系统的设计与实现00332

摘 要 近年来&#xff0c;电子商务的快速发展引起了行业和学术界的高度关注。花涧订购系统旨在为用户提供一个简单、高效、便捷的花卉购物体验&#xff0c;它不仅要求用户清晰地查看所需信息&#xff0c;而且还要求界面设计精美&#xff0c;使得功能与页面完美融合&#xff0c;…

AI程序员还是代替不了程序员,震撼硅谷的Devin-ai程序员,再度震撼硅谷——但这次是被打假

文章目录 主要疑点包括但不限于&#xff1a;35年从业者逐帧验证 AI程序员还是代替不了程序员&#xff0c;震撼硅谷的Devin-ai程序员&#xff0c;再度震撼硅谷——但这次是被打假 一位油管程序员博主Internet of Bugs对Devin发布的视频进行了逐帧分析&#xff0c;逐一举证说明了…

【C语言】register 关键字

在C语言中&#xff0c;register关键字用于提示编译器将变量尽量存储在CPU的寄存器中&#xff0c;而不是在内存中。这是为了提高访问速度&#xff0c;因为寄存器的访问速度比内存快得多。使用register关键字的变量通常是频繁使用的局部变量。 基本用法 void example() {regist…

猫头虎分享[可灵AI」官方推荐的驯服指南-V1.0

猫头虎分享[可灵AI」官方推荐的驯服指南-V1.0 猫头虎是谁&#xff1f; 大家好&#xff0c;我是 猫头虎&#xff0c;别名猫头虎博主&#xff0c;擅长的技术领域包括云原生、前端、后端、运维和AI。我的博客主要分享技术教程、bug解决思路、开发工具教程、前沿科技资讯、产品评…

Git 基础-创建版本库 git init、添加到暂存区git add、查看状态git status、查看改动git diff

目录 1.创建版本库 git init 1.创建版本库 git init 在目录中创建新的 Git 仓库。 你可以在任何时候、任何目录中这么做&#xff0c;完全是本地化的。 在目录中执行 git init&#xff0c;就可以创建一个 Git 仓库了。 注意: 没事不要手动修改 .git 目录里面的文件&#xff0c;不…

安卓微商大师V3.4.0/高级版一键群发僵尸粉检测

一款高效获取客源&#xff0c;备受好评的微商工具&#xff0c;资源丰富&#xff0c;秒速获得客源&#xff0c;大量群客源&#xff0c;都是散客&#xff0c;携手创业&#xff0c;是做微商生意的首选工具。打开即是黑钻高级会员 赶快体验吧 很强大 链接&#xff1a;https://pan.…

Java程序设计课后习题(答案版) 期末复习

第一章 Java语言概述 一、选择题 下面哪种类型的文件可以在Java虚拟机中运行?( A ) A. class B. Java C. jre D. exe 如果JDK 的安装路径为“d:\jdk”&#xff0c;若想在命令窗口中任何当前路径下&#xff0c;都可以直接使用javac和java命令&#xff0c;需要将环境变量path设…

携手共筑爱的桥梁:引导接纳自闭症同学

在孩子的班级中&#xff0c;当自闭症儿童成为我们共同的一员时&#xff0c;作为老师和家长&#xff0c;我们肩负着特别的责任——引导孩子们以开放的心态接纳、善待并关爱他们。 首先&#xff0c;我们要以身作则&#xff0c;展现接纳与尊重。无论是老师还是家长&#xff0c;都…

笔记:Git学习之应用场景和使用经验

目标&#xff1a;整理Git工具的应用场景和使用经验 一、开发环境 Git是代码版本控制工具&#xff1b;Github是代码托管平台。 工具组合&#xff1a;VSCode Git 需要安装的软件&#xff1a;vscode、Git 其中vscode需要安装的插件&#xff1a;GitLens、Git History 二、应用…

仓库货物管理系统

摘 要 随着信息技术的迅猛发展&#xff0c;大数据已经成为推动各行各业变革的重要力量。特别是在物流仓储领域&#xff0c;大数据技术的应用不仅能够显著提升仓库货物管理的效率&#xff0c;还能够优化库存管理、减少成本、提高客户满意度。因此&#xff0c;基于大数据的仓库货…

webstorm 高效查看不同分支差异 摒弃你的git diff手动操作

背景 每次代码冲突或者版本发生异常时&#xff0c;排查不同版本时就是一个头大的问题&#xff0c;头大的点在于用 vscode 的 git diff 一点点地排查和比较&#xff0c;耗时耗力&#xff0c;版面展不开&#xff0c;commit 差异看不出来&#xff0c;每个页面的代码不同也不能快速…

2007-2023年36家商业银行绿色信贷、期末贷款总额、银行总资产等相关指标数据(2023年无缺失)

2007-2023年36家商业银行绿色信贷数据&#xff08;2023年无缺失&#xff09; 1.时间&#xff1a;2007-2023年&#xff0c;2023年无缺失 2.来源&#xff1a;银行年报和社会责任报告 3.指标:绿色信贷余额、期末贷款总额、绿色信贷比率、总资产收益率、流动性比率、拨备覆盖率、…

2002-2022年各省老年人口抚养比(人口抽样调查)数据

2002-2022年各省老年人口抚养比(人口抽样调查)数据 1、时间&#xff1a;2002-2022年 2、指标&#xff1a;老年人口抚养比 3、来源&#xff1a;国家统计局、统计年鉴 4、范围&#xff1a;31省&#xff0c; 5、缺失情况&#xff1a;无缺失&#xff0c;其中2010年的值取2009、…