JPA相關知識

1、jpa入門

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

  • jpa和jdbc優缺點:

    • jdbc:

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

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

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

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

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

    • jpa:

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

      優點:1.程序員操作很簡單,代碼簡單。(例:entityMAnager.persist(employee))

      ​ 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 等等。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章