Spring從入門到入土——Spring整合JPA

1、jpa入門

Java持久層api,替代jdbc,Java持久化規範。JPA是Hibernate的一個抽象,是一種ORM規範,是Hibernate功能的一個子集,Hibernate是JPA的一個實現

jpa和jdbc優缺點:

jdbc:

本質:處理Java對象和關係型數據庫表之間的轉化

優點:性能最高,操作數據庫最底層

缺點:

1.使用複雜(重複代碼很多),移植數據庫很麻煩

​ 2.性能優化需要自己處理,沒有提供數據緩存,需要自己實現。

​ 3.面向的是sql語句操作,不是面向對象的。

jpa:

本質:只是對於jdbc再次做了一層封裝

優點:

1.程序員操作很簡單,代碼簡單。

​ 2.直接面向持久對象操作

​ 3.提供世界級數據緩存(一級緩存,二級緩存,查詢緩存)

​ 4.數據庫移植性很強,很少的修改(通過配置方言):把各種數據庫抽取了一個方言接口,不同的數據庫實現類一個方言接口,需要換數據庫,只需要修改方言實現,驅動jar文件,連接數據庫信息(4個:驅動,url地址,用戶名,密碼)

缺點:

1.不能干預sql語句的生成。find方法默認查詢表的所有字段

2.一個項目中如果對sql語句的優化比較高,不適用jpa(不過jpa中有對原生sql的支持)

​ 3.如果一個表中有上億的數據,也不適合用jpa和jdbc(可以使用數據庫讀寫分析,分庫分表方案解決)

適用的項目規模:中小型,jpa在性能優化上比較喫力,超大型還是推薦使用MyBatis.

ORM框架:就是把數據保存到可掉電式存儲設備中,持久層就是dao層,

ORM是對象關係映射框架,就是通過Java對象映射到數據庫表,通過操作Java對象,就可以完成對數據庫表的操作,

面向對象概念面向關係概念

類表

對象實體表的行(記錄)

屬性,對象粒度表的列(字段)

2、JPA基本註解

@Entity:用於實體類聲明語句之前,指出該Java類爲實體類,將映射到指定的數據庫表。

@Table:當實體類與其映射的數據庫表名不同名時使用,該標註於@Entity並列使用,置於實體類聲明語句之前,可寫於單獨語句行,也可與聲明語句同行。

name用於指明數據庫的表名

catalog和schema用於設置表所屬的數據庫目錄或模式,通常爲數據庫名

uniqueConstraints用於設置約束條件,通常不設置

@Id聲明一個實體類的屬性映射爲數據庫的主鍵列。通常位置聲明語句之前或者同行,也可以置於屬性的getter方法之前。、

@GeneratedValue用於標註主鍵的生成策略,通過strategy屬性指定。默認情況下,jpa自動選擇一個適合底層數據庫的主鍵生成策略:SqlServer對應identity,MySQL對應auto increment。

IDENTITY:採用數據庫ID自增長方式來自增主鍵字段,但是Oracle不支持這種方式

AUTO:JPA自動選擇合適的策略,是默認選項:

SEQUENCE:通過序列產生主鍵,通過@SequenceGenerator註解指定序列名,但是MySql不支持這種方式

TABLE:通過表產生主鍵,便於數據庫的移植

@Basic表示一個簡單的屬性到數據庫表的字段的映射對於沒有任何標註的get()方法。默認即爲@Basic

fetch:表示該屬性的讀取策略,有EAGER和LAZY兩種,表示主支抓取和延遲加載,默認爲true

optional:表示該屬性是否允許爲null默認爲true

Column:當實體屬性與其映射的數據庫表的類不同名時需要使用

Transient:表示該屬性並非到數據庫表的字段的映射,ORM框架將忽略該屬性。必須標註

Temporal:調整精度

3、JPA的API

Persistence:用於獲取EntiryManagerFactory的實例

常用方法:Persistence.createEntityManagerFactory(persistenceUnitName)方法

EntiryManagerFactory

獲取EntiryManager

close()方法,關閉自身

EntityManager的常用API

find()方法,在執行find方法時就發送SQL語句(類似於Hibernate中的Session的get()方法)

getReference()方法,若不適用查詢的對象則返回一個代理對象,到真正使用的時候才發送SQL語句chax(類似於Hibernate的Session的load()方法)

persistence()方法,類似於 Hibernate 的 save() 方法,與 Hibernate 的 save() 方法不同的是其不能插入一個有 id 屬性的對象

remove() 方法,類似於 Hibernate 中 Session 的 delete 方法,但是其不能刪除 遊離化對象(僅有 id)

merge() 方法,類似於 Hibernate 中 Session 的 saveOrUpdate() 方法

EntityTransaction:JPA中的事務操作

常用API:begin();commit();rollback()

4、JPA中映射關聯關係

映射單向多對一的關聯關係,many的一方作爲關係的維護段,one的一方作爲被維護端,one方指定@OneToMany註釋並設置mappedBy屬性,以指定他是被維護端,many方指定@ManyToOne註解,並使用@JoinColumn指點外鍵名稱

創建Order實體類:標註註解生成數據表,使用@ManyToOne映射多對一的關聯關係,使用@JoinColumn來標註外鍵。

單向多對一的保存:保存多對一是,建議先保存1的一段,這樣不會多出額外的update語句

獲取操作(find):默認情況下使用左外連接的方式來獲取n的一端的對象和其關聯的1的一端的對象。可以使用@ManyToOne的fetch屬性來修改默認的關聯屬性的加載策略

刪除操作(remove):不能直接刪除1的一端,因爲有外鍵約束

修改操作:可以根據n的一端對1的一端鏡像修改操作。

映射單項一對多的關聯關係Customer:Order 1:n,Customer中有Order的Set稽覈屬性,Order中沒有Customer的屬性

在Customer中添加Order的Set集合屬性,並映射1-n關聯關係,重新生成數據表

保存操作(persist):總會多出UPDATE語句,n的一端在插入式不會同時插入外鍵列

查詢操作(find)默認使用懶加載

刪除操作(remove):默認情況下刪除1的一端,會先把關聯的n的一端的外鍵置空,然後再刪除,可以通過@OneToMany的cascade屬性

映射雙向多對一的關聯關係(注:雙向多對一通雙向一對多)

實體:Customer中有Order的Set集合屬性,Order中有Customer的屬性,兩個實體映射的外鍵列必須一致,都爲CUSTOMER_ID

保存操作(persist):

映射雙向一對一的關聯關係

映射雙向多對多的關聯關係

5、JPA的二級緩存

若JPA實現支持二級緩存,該節點可以配置在當前的持久化單位中是否啓用二級換竄,可配置如下值:

ALL:所有實體類都被緩存

NONE:所有實體類都不能被緩存

ENABLE_SELECTIVE:表示@Cacheable(true)註解的實體類將被緩存

DISABLE_SELECTIVE:換竄除表示@Cacheable(false)依賴的所有實體類

UNSPECIFIED:默認值,JPA產品默認值將被使用

6、JPQL

JPQL語言的語句是select語句,update語句或delete語句,他們都通過Query接口封裝執行

Query接口封裝了執行數據庫查詢的相關方法。調用 EntityManager的createQuery、createNamedQuery及createNativeQuery方法可以獲得查詢對象,進而可調用Query接口的相關方法來執行查詢操作。

Query接口的主要方法:

int executeUpdate()

用於執行update或delete語句

List getResultList()

用於執行select語句並返回結果集實體列表

Object getSingleResult()

用於執行只返回單個結果實體的select語句。

Query setFirstResult(int startPosition)

用於設置從哪個實體記錄開始返回查詢結果

Query setMaxResults(int maxResult)

用於設置返回結果實體的最大數。與setFirstResult結合使用可實現分頁查詢

Query setFlushMode(FlushModeType flushMode)

設置查詢對象的Flush模式。參數可以取兩個枚舉值:FlushModeType.AUTO爲自動更新數據庫記錄,FlushMode Type。COMMIT爲直到提交事務時才更新數據庫記錄

setHint(String hintName, Object value)

設置與查詢對象相關的特定供應商參數或提示信息。參數名及其取值需要參考特定 JPA 實現庫提供商的文檔。如果第二個參數無效將拋出IllegalArgumentException異常。

setParameter(int position, Object value)

爲查詢語句的指定位置參數賦值。Position 指定參數序號,value 爲賦給參數的值。

setParameter(int position, Date d, TemporalType type)

爲查詢語句的指定位置參數賦 Date 值。Position 指定參數序號,value 爲賦給參數的值,temporalType 取 TemporalType 的枚舉常量,包括 DATE、TIME 及 TIMESTAMP 三個,,用於將 Java 的 Date 型值臨時轉換爲數據庫支持的日期時間類型(java.sql.Date、java.sql.Time及java.sql.Timestamp)

–setParameter(int position, Calendar c, TemporalType type)

爲查詢語句的指定位置參數賦 Calenda r值。position 指定參數序號,value 爲賦給參數的值,temporalType 的含義及取捨同前。

setParameter(String name, Object value)

爲查詢語句的指定名稱參數賦值。

setParameter(String name, Date d, TemporalType type)

爲查詢語句的指定名稱參數賦 Date 值。用法同前

setParameter(String name, Calendar c, TemporalType type)

爲查詢語句的指定名稱參數設置CalendarnameIllegalArgumentException異常。

Select語句:

from是必選子句,如果不想返回重複實體,可以使用關鍵字distinct來進行修飾

查詢所有實體:select o from Order o

調用 EntityManager的createQuery()方法可創建查詢對象,接着調用Query接口的getResultList()方法就可獲得查詢結果集

where子句用於指定查詢條件,也支持包含參數的查詢,但是參數名前必須冠以冒號。同樣也可以使用參數序號

order by子句,可以對查詢結果鏡像排序,默認爲升序,asc(升序)desc(降序)

group by子句與聚合查詢,通常的聚合函數:AVG,COUNT,MAX,MIN

having子句用於對group by分組設置約束條件,用法與where子句基本相同,having子句作用於分組,用於選擇滿足條件的組,其條件表單時中通常會使用聚合函數

關聯查詢。默認左關聯,

子查詢:常出現在any,all,exist s表達式中用於集合匹配查詢

JPQL函數:字符串處理函數,算術函數和日期函數

UPDATE語句:用於執行數據更新操作,主要用於針對單個實體類的批量更新

DELETE語句:用於執行數據更新操作

7、整合Spring

三種整合方式

LocalEntityManagerFactoryBean:適用於那些僅使用 JPA 進行數據訪問的項目,該 FactoryBean 將根據JPA PersistenceProvider 自動檢測配置文件進行工作,一般從“META-INF/persistence.xml”讀取配置信息,這種方式最簡單,但不能設置Spring 中定義的DataSource,且不支持 Spring管理的全局事務

從JNDI中獲取:用於從 Java EE 服務器獲取指定的EntityManagerFactory,這種方式在進行 Spring 事務管理時一般要使用 JTA 事務管理

LocalContainerEntityManagerFactoryBean**:適用於所有環境的 FactoryBean,能全面控制 EntityManagerFactory 配置,如指定 Spring 定義的 DataSource 等等。

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