【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.pswp.cn/web/38709.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38709.shtml
英文地址,請注明出處:http://en.pswp.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;曾經想幫助全世界的人卸載掉…

歸并排序——有序序列的合并

目錄 1、簡述 2、復雜度 3、穩定性 4、例子 1、簡述 有序序列的合并&#xff08;Merge of Sorted Sequences&#xff09;是歸并排序的核心步驟之一。其目的是將兩個已經排序的序列合并成一個新的有序序列。這個過程在歸并排序中非常重要&#xff0c;因為歸并排序通過遞歸地…

技術職務管理助力智慧校園建設:深入解讀人事系統

智慧校園人事系統中的技術職務管理模塊&#xff0c;專注于高校及教育機構內技術人員及科研人員的職務管理&#xff0c;涵蓋職稱評審、技術職務任命、項目參與記錄、科研成果跟蹤及技術能力評估等多個方面&#xff0c;旨在通過信息化手段提升技術人才管理的效率與科學性。 在這一…

Windows如何安裝并啟動Nginx

0、前言 Nginx 是一款高性能、輕量級的Web服務器和反向代理服務器&#xff0c;廣泛應用于互聯網領域。它以其高效穩定、內存占用少和豐富的模塊化設計而受到開發者們的青睞。 在實際使用過程中&#xff0c;我們多數時候會在Linux系統上運行Nginx&#xff0c;但實際上&#xff…

單目行車測距攝像系統(單目測距-行車)

單目行車測距攝像系統是一種利用單個攝像頭實現車輛行駛中前方障礙物距離測量的技術。該系統通過計算機視覺算法&#xff0c;能夠實時分析攝像頭捕捉的圖像&#xff0c;精確計算出車輛與前方物體之間的距離&#xff0c;對于自動駕駛、高級駕駛輔助系統&#xff08;ADAS&#xf…

PMP考試沒通過別擔心,補救辦法來了

2024年6月PMP考試成績正在陸續分批次發布。沒有考試通過的同學就會疑問&#xff0c;考試沒考過怎么辦&#xff1f;可不可以補考&#xff1f;面對PMP考試沒通過的情況&#xff0c;我們應該如何應對呢&#xff1f; 首先要告訴大家一個好消息&#xff01;6月考試不通過的考生可以…

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;…

PIL,OpenCV,Pytorch處理圖像時的通道順序(顏色,長寬深)

項目顏色通道順序長寬通道順序數據類型取值范圍PILRGBHWCndarray0-255 (byte)OpenCVBGRHWCndarray0-255 (byte)PyTorchRGB/BGR (取決于如何讀取)(N)CHWtensor0-1 (float, 標準化后); 0-255 (int, 未標準化) 注意以下幾點&#xff1a; 顏色通道順序&#xff1a;PIL默認使用RGB順…

圖像增強方法匯總OpenCV+python實現【第二部分:高級圖像增強方法】

圖像增強方法匯總OpenCV+python實現【第二部分:高級圖像增強方法】 前言高級圖像增強方法1. 隨機高斯模糊(Random Gaussian Blur)2. 隨機灰度(Random Grayscale)3. 隨機通道交換(Random Channel Swap)4. 隨機伽馬校正(Random Gamma Correction)5. 隨機透視變換(Rando…

監控易在某市電子政務外網的運維應用案例

隨著信息技術的飛速發展&#xff0c;電子政務已經成為政府提升服務效率、增強公眾滿意度的重要途徑。某市電子政務外網作為該市政府部門與外界交互的主要平臺&#xff0c;承載著大量關鍵業務與數據交互&#xff0c;其網絡環境的復雜性、應用特點的多樣性以及運維需求的挑戰性&a…

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;不…

Nginx Http緩存的必要性!啟發式緩存有什么弊端?

&#x1f440; Nginx Http緩存的必要性&#xff01;啟發式緩存有什么弊端&#xff1f; 簡介啟發式緩存引發的問題nginx緩存配置 簡介 我們在使用React或者Vue開發項目中會使用hash、chunkhash、contenthash來給靜態資源文件進行命名。這帶來的好處便是當我們部署完項目后&…

安卓微商大師V3.4.0/高級版一鍵群發僵尸粉檢測

一款高效獲取客源&#xff0c;備受好評的微商工具&#xff0c;資源豐富&#xff0c;秒速獲得客源&#xff0c;大量群客源&#xff0c;都是散客&#xff0c;攜手創業&#xff0c;是做微商生意的首選工具。打開即是黑鉆高級會員 趕快體驗吧 很強大 鏈接&#xff1a;https://pan.…

2023ICPC亞洲區域賽(合肥)VP補題題解(48th)

2023ICPC亞洲區域賽(合肥)VP補題題解記錄 文章目錄 2023ICPC亞洲區域賽(合肥)VP補題題解記錄寫在前面已更新 E F G J&#xff0c;待更新 B I C F and E(簽到題和簡單題)G. Streak Manipulation題目大意題目分析ac代碼參考 J. Takeout Delivering題目大意題目分析ac代碼參考 寫在…