Java JPA快速入門介紹
JPA快速入門介紹
一:什么是JPA
JPA的英文全稱是Java PersistenceAPI, 目的是給Java開發者提供對象關系映射工具用于在
Java應用程序開發中來管理關系數據(RDBMS)。JavaPersistence 包含下面三個部分:
a. Java持久化API
b. JPA查詢語言
c. 對象關系映射元數據
二:JPA有哪些框架提供了的實現
當前JPA提供廠商有Hibernate, Apache, Eclipse Link等,Google云計算平臺 AppEngine也使
用了JPA作為持久層。JPA作為持久層框架有如下優點:
1. 簡單易用,幫助開發者提供了生產率
2. 便于維護,減低了維護成本
3. 學習成本相對比較低。
但是JPA的缺點也是顯而易見,JPA作為持久層有如下缺點:
1. 將語言與數據庫混在一起,導致數據改動以后,配置文件必須更新
2. 對與多數據與大數據量處理很容易產生性能問題。
3. 過度封裝,導致錯誤查找相對與JDBC等傳統開發技術而言更加困難
三:標準的JPA規范JSR粗略解讀
JPA的最新規范為JSR Java PersistenceAPI Version 2.0
Entity Class – 實體類,必須使用注解@entity標明,同時必須有一個無參數的構造函數,而
且無參數構造函數必須為public或者protected,如果一個entity class被標記為final將導致
出錯。
EntityManager – 實體管理者,管理Entity實例的整個生命周期,而且使用Query API來查詢
實體與他們的persist狀態。
Query Language – 基于字符串的查詢語句,用來查詢實體(Entity)與他們的狀態。
MetaModel API – 通過EntityManagerFactory或者EntityManager的getMetamodel()方法獲取,
查看persistence-unit的信息。
實體管理者與持久化上下文(Entity Manager and Persistence contexts)
Persistence Contexts – 一個被管理的實體的實例集合,在一個持久化上下文中的所有實例都
由Entity Manager來管理它們整個生命周期。
持久化單元(Persistence-Unit) – 一個持久化單元是個邏輯分組包括以下部分:
- 一個實體管理者工廠及它的實體管理者
- 被管理的class集合,在persistence unit配置文件中定義
- 映射元數據– 注解定義或者xml定義匹配的類
-
ORM元數據(MetaData forObject/Relational Mapping) – 坦白的說就annotation的各種解釋與
使用。
詳細了解請閱讀Oracle官方文檔 - 《persistence-2_0-final-spec》PDF文檔。
四:JPA簡單實例說明
1. 使用ObjectDB作為數據庫,關于ObjectDB請參考http://www.objectdb.com/
2. 參考了objectDB的例子,代碼幾乎沒有改動,文檔說明參見這里:
http://www.objectdb.com/tutorial/jpa/eclipse/web
3. 一個可運行的JPA實例源代碼:
entity class:
package com.gloomyfish.jpa.tutorial;
import java.io.Serializable;
import javax.persistence.*;
@Entity
public class Point implements Serializable {
private static final long serialVersionUID = 1L;
@Id @GeneratedValue
private long id;
private int x;
private int y;
public Point() {
}
Point(int x, int y) {
this.x = x;
this.y = y;
}
public Long getId() {
return id;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
@Override
public String toString() {
return String.format("(%d, %d)", this.x, this.y);
}
}Main Test JPA;
package com.gloomyfish.jpa.tutorial;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
public class JPAMain {
public static void main(String[] args) {
// Open a database connection
// (create a new database if it doesn't exist yet):
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("$objectdb/db/points.odb");
EntityManager em = emf.createEntityManager();
// Store 1000 Point objects in the database:
long startTime = System.currentTimeMillis();
em.getTransaction().begin();
for (int i = 0; i < 10; i++) {
Point p = new Point(i, i);
em.persist(p);
}
em.getTransaction().commit();
long endTime = System.currentTimeMillis();
System.out.println("save time = " + (endTime - startTime));
// Find the number of Point objects in the database:
Query q1 = em.createQuery("SELECT COUNT(p) FROM Point p");
System.out.println("Total Points: " + q1.getSingleResult());
// Find the average X value:
Query q2 = em.createQuery("SELECT AVG(p.x) FROM Point p");
System.out.println("Average X: " + q2.getSingleResult());
// Retrieve all the Point objects from the database:
TypedQuery<Point> query =
em.createQuery("SELECT p FROM Point p", Point.class);
List<Point> results = query.getResultList();
for (Point p : results) {
System.out.println(p);
}
// Close the database connection:
em.close();
emf.close();
}
}