認識 Spring Data JPA

### JPA 簡介

 

JPA (``Java Persistence API``) ,Java持久層API,是JDK 5.0註解或XML描述對象-關係表的映射關係,並將運行期的實體對象持久化到數據庫中的持久化模型。

JPA 爲對象關係映射提供了一種基於 POJO 的持久化模型 :

 

**JPA 包括以下3方面的內容**:

 

- 一套 API 標準。在 javax.persistence 的包下面,用來操作實體對象,執行 CRUD 操作,框架在後臺替代我們完成所有的事情,開發者從煩瑣的 JDBC 和 SQL 代碼中解脫出來。

 

- 面向對象的查詢語言:Java Persistence QueryLanguage(JPQL)。通過面向對象而非面向數據庫的查詢語言查詢數據,避免程序的SQL語句緊密耦合

 

- ORM(object/relational metadata)元數據的映射。JPA 支持 XML 和 JDK5.0注 解兩種元數據的形式,元數據描述對象和表之間的映射關係,框架據此將實體對象持久化到數據庫表中。

 

### Spring Data 

Spring Data 提供一個大家熟悉的、一致的、基於Spring的數據訪問編程模型,同時仍然保留底層數據存儲的特殊特性。它可以輕鬆地讓開發者使用數據訪問技術,包括關係數據庫、非關係數據庫(NoSQL)和基於雲的數據服務。

 

Spring Data JPA 是 Spring Data 項目中的一個模塊,可以理解爲 JPA 規範的再次封裝抽象。

 

## 2.2.JPA 中常用註解

 

### java 對象與數據庫字段轉化

- @Entity:標識實體類是 JPA 實體,告訴 JPA 在程序運行時生成實體類對應表

 

- @Table:設置實體類在數據庫所對應的表名

 

- @Id:標識類裏所在變量爲主鍵

 

- @GeneratedValue:設置主鍵生成策略(依賴於具體的數據庫)

 

- @Column:表示屬性所對應字段名進行個性化設置

 

- @Transient:表示屬性並非數據庫表字段的映射,ORM框架將忽略該屬性

 

- @Temporal:將日期字段轉化成 java.util 包中的時間日期類型。注入數據庫的類型有三種:

    - TemporalType.DATE(2008-08-08)

    - TemporalType.TIME(20:00:00)

    - TemporalType.TIMESTAMP(2008-08-08 20:00:00.000000001)

 

- @Enumerated:使用此註解映射枚舉字段,以String類型存入數據庫。注入數據庫的類型有兩種:EnumType.ORDINAL(Interger)、EnumType.STRING(String)

 

- @Embeddable、@Embedded: 當一個實體類要在多個不同的實體類中進行使用,而其不需要生成數據庫表。

    - @Embeddable:註解在類上,表示此類是可以被其他類嵌套

    - @Embedded:註解在屬性上,表示嵌套被@Embeddable註解的同類型類

 

- @ElementCollection:集合映射

 

- @CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy:表示字段爲創建時間字段(insert自動設置)、創建用戶字段(insert自動設置)、最後修改時間字段(update自定設置)、最後修改用戶字段(update自定設置)

 

- @MappedSuperclass:註解的類繼承另一個實體類 或 標註@MappedSuperclass類,他可使用@AttributeOverride 或 @AttributeOverrides註解重定義其父類屬性映射到數據庫表中字段。

 

### java對象與json轉化

- @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8"):將Date屬性轉換爲String類型, timezone解決(相差8小時)

 

- @JsonSerialize:作用在類或字段上,轉化java對象到json格式(需自定義轉化類繼承JsonSerializer<T>)

 

- @JsonDeserialize:作用在類或字段上,轉化json格式到java對象(需自定義轉化類繼承JsonDeserializer<T>)

 

- @JsonProperty:作用在屬性上,把屬性名稱序列化爲另一個名稱(trueName屬性序列化爲name)

 

- @JsonIgnoreProperties(ignoreUnknown = true):作用在類上,忽略掉json數據裏包含了實體類沒有的字段

 

- @JsonIgnore:在json序列化時將java bean中的一些屬性忽略掉,序列化和反序列化都受影響

 

## 2.2.Spring Data JPA 中常用註解

通過簡單註解來實現精簡代碼來達到消除冗長代碼的目的。

 

### 常用註解

 

- ``val``:用在局部變量前面,相當於將變量聲明爲 final

- ``@NonNull``:給方法參數增加這個註解會自動在方法內對該參數進行是否爲空的校驗,如果爲空,則拋出 NPE(NullPointerException)

- ``@Cleanup``:自動管理資源,用在局部變量之前,在當前變量範圍內即將執行完畢退出之前會自動清理資源,自動生成 try-finally 這樣的代碼來關閉流

- ``@Getter/@Setter``:用在屬性上,再也不用自己手寫 setter 和 getter 方法了,還可以指定訪問範圍

- ``@ToString``:用在類上,可以自動覆寫 toString 方法,當然還可以加其他參數,例如 @ToString(exclude=”id”) 排除 id 屬性,或者 @ToString(callSuper=true, includeFieldNames=true) 調用父類的 toString 方法,包含所有屬性

- ``@EqualsAndHashCode``:用在類上,自動生成 equals 方法和 hashCode 方法

- ``@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor``:用在類上,自動生成無參構造和使用所有參數的構造函數以及把所有 @NonNull 屬性作爲參數的構造函數,如果指定 staticName = “of” 參數,同時還會生成一個返回類對象的靜態工廠方法,比使用構造函數方便很多

- ``@Data``:註解在類上,相當於同時使用了 @ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstrutor 這些註解,對於 POJO 類十分有用

- ``@Value``:用在類上,是 @Data 的不可變形式,相當於爲屬性添加 final 聲明,只提供 getter 方法,而不提供 setter 方法

- ``@Builder``:用在類、構造器、方法上,爲你提供複雜的 builder APIs,讓你可以像如下方式一樣調用 Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build(); 更多說明參考 Builder

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章