(1)、JPA介紹:
JPA全稱為Java Persistence API ,Java持久化API是Sun公司在Java EE 5規(guī)范中提出的Java持久化接口。JPA吸取了目前Java持久化技術(shù)的優(yōu)點(diǎn),旨在規(guī)范、簡(jiǎn)化Java對(duì)象的持久化工作。使用JPA持久化對(duì)象,并不是依賴于某一個(gè)ORM框架。
為什么要使用JAP?
在說(shuō)為什么要使用JPA之前,我們有必要了解為什么要使用ORM技術(shù)。
ORM 是Object-Relation-Mapping,即對(duì)象關(guān)系影射技術(shù),是對(duì)象持久化的核心。ORM是對(duì)JDBC的封裝,從而解決了JDBC的各種存在問(wèn)題:
a) 繁瑣的代碼問(wèn)題
用JDBC的API編程訪問(wèn)數(shù)據(jù)庫(kù),代碼量較大,特別是訪問(wèn)字段較多的表的時(shí)候,代碼顯得繁瑣、累贅,容易出錯(cuò)。例如:PreparedStatement pstmt=con.prepareStatment("insert into account value(?,?,?,?,?,?,?,?,?)");
ORM則建立了Java對(duì)象與數(shù)據(jù)庫(kù)對(duì)象之間的影射關(guān)系,程序員不需要編寫(xiě)復(fù)雜的SQL語(yǔ)句,直接操作Java對(duì)象即可,從而大大降低了代碼量,也使程序員更加專注于業(yè)務(wù)邏輯的實(shí)現(xiàn)。
b) 數(shù)據(jù)庫(kù)對(duì)象連接問(wèn)題
關(guān)系數(shù)據(jù)對(duì)象之間,存在各種關(guān)系,包括1對(duì)1、1對(duì)多、多對(duì)1、多對(duì)多、級(jí)聯(lián)等。在數(shù)據(jù)庫(kù)對(duì)象更新的時(shí)候,采用JDBC編程,必須十分小心處理這些關(guān)系,以保證維持這些關(guān)系不會(huì)出現(xiàn)錯(cuò)誤,而這個(gè)過(guò)程是一個(gè)很費(fèi)時(shí)費(fèi)力的過(guò)程。
ORM建立Java對(duì)象與數(shù)據(jù)庫(kù)對(duì)象關(guān)系影射的同時(shí),也自動(dòng)根據(jù)數(shù)據(jù)庫(kù)對(duì)象之間的關(guān)系創(chuàng)建Java對(duì)象的關(guān)系,并且提供了維持這些關(guān)系完整、有效的機(jī)制。
c) 系統(tǒng)架構(gòu)問(wèn)題
JDBC屬于數(shù)據(jù)訪問(wèn)層,但是使用JDBC編程時(shí),必須知道后臺(tái)是用什么數(shù)據(jù)庫(kù)、有哪些表、各個(gè)表有有哪些字段、各個(gè)字段的類型是什么、表與表之間什么關(guān)系、創(chuàng)建了什么索引等等與后臺(tái)數(shù)據(jù)庫(kù)相關(guān)的詳細(xì)信息。
使用ORM技術(shù),可以將數(shù)據(jù)庫(kù)層完全隱蔽,呈獻(xiàn)給程序員的只有Java的對(duì)象,程序員只需要根據(jù)業(yè)務(wù)邏輯的需要調(diào)用Java對(duì)象的Getter和 Setter方法,即可實(shí)現(xiàn)對(duì)后臺(tái)數(shù)據(jù)庫(kù)的操作,程序員不必知道后臺(tái)采用什么數(shù)據(jù)庫(kù)、有哪些表、有什么字段、表與表之間有什么關(guān)系。
d) 性能問(wèn)題
采用JDBC編程,在很多時(shí)候存在效率低下的問(wèn)題。
pstmt =conn.prepareStatement("insert into user_info values(?,?)");
for (int i=0; i<1000; i++) {
pstmt.setInt(1,i);
pstmt.setString(2,"User"+i.toString());
pstmt.executeUpdate();
}
以上程序?qū)⑾蚝笈_(tái)數(shù)據(jù)庫(kù)發(fā)送1000次SQL語(yǔ)句執(zhí)行請(qǐng)求,運(yùn)行效率較低。
采用ORM技術(shù),ORM框架將根據(jù)具體數(shù)據(jù)庫(kù)操作需要,會(huì)自動(dòng)延遲向后臺(tái)數(shù)據(jù)庫(kù)發(fā)送SQL請(qǐng)求,ORM也可以根據(jù)實(shí)際情況,將數(shù)據(jù)庫(kù)訪問(wèn)操作合成,盡量減少不必要的數(shù)據(jù)庫(kù)操作請(qǐng)求。
JPA是目前比較流行的一種ORM技術(shù)之一,所以他擁有ORM技術(shù)的各種特點(diǎn),當(dāng)然他還有自己的一些優(yōu)勢(shì):
1 標(biāo)準(zhǔn)化
JPA 是 JCP 組織發(fā)布的 Java EE 標(biāo)準(zhǔn)之一,因此任何聲稱符合 JPA 標(biāo)準(zhǔn)的框架都遵循同樣的架構(gòu),提供相同的訪問(wèn) API,這保證了基于JPA開(kāi)發(fā)的企業(yè)應(yīng)用能夠經(jīng)過(guò)少量的修改就能夠在不同的JPA框架下運(yùn)行。
2 對(duì)容器級(jí)特性的支持
JPA 框架中支持大數(shù)據(jù)集、事務(wù)、并發(fā)等容器級(jí)事務(wù),這使得 JPA 超越了簡(jiǎn)單持久化框架的局限,在企業(yè)應(yīng)用發(fā)揮更大的作用。
3 簡(jiǎn)單易用,集成方便
JPA的主要目標(biāo)之一就是提供更加簡(jiǎn)單的編程模型:在JPA框架下創(chuàng)建實(shí)體和創(chuàng)建Java 類一樣簡(jiǎn)單,沒(méi)有任何的約束和限制,只需要使用 javax.persistence.Entity進(jìn)行注釋;JPA的框架和接口也都非常簡(jiǎn)單,沒(méi)有太多特別的規(guī)則和設(shè)計(jì)模式的要求,開(kāi)發(fā)者可以很容易的掌握。JPA基于非侵入式原則設(shè)計(jì),因此可以很容易的和其它框架或者容器集成。
4 可媲美JDBC的查詢能力
JPA的查詢語(yǔ)言是面向?qū)ο蠖敲嫦驍?shù)據(jù)庫(kù)的,它以面向?qū)ο蟮淖匀徽Z(yǔ)法構(gòu)造查詢語(yǔ)句,可以看成是Hibernate HQL的等價(jià)物。JPA定義了獨(dú)特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一種擴(kuò)展,它是針對(duì)實(shí)體的一種查詢語(yǔ)言,操作對(duì)象是實(shí)體,而不是關(guān)系數(shù)據(jù)庫(kù)的表,而且能夠支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能夠提供的高級(jí)查詢特性,甚至還能夠支持子查詢。
5 支持面向?qū)ο蟮母呒?jí)特性
JPA 中能夠支持面向?qū)ο蟮母呒?jí)特性,如類之間的繼承、多態(tài)和類之間的復(fù)雜關(guān)系,這樣的支持能夠讓開(kāi)發(fā)者最大限度的使用面向?qū)ο蟮哪P驮O(shè)計(jì)企業(yè)應(yīng)用,而不需要自行處理這些特性在關(guān)系數(shù)據(jù)庫(kù)的持久化。
(2)、具體例子
完成工程后工程結(jié)構(gòu)如下圖:
(注意:persistence.xml文件的位置決定持久性的根(Persistence Root)。持久性的根為JAR文件或者包含META-INF目錄(前提是persistence.xml位于此)的目錄。一般將這個(gè)persistence.xml文件放在src下的META-INF中。命名及位置都不能變)
a)、導(dǎo)入相關(guān)jar包(見(jiàn)上圖)和創(chuàng)建META-INF和persistence.xml文件.
persistence.xml配置如下:(我用的數(shù)據(jù)為mysql,采用不同數(shù)據(jù)庫(kù)及JPA的不同實(shí)現(xiàn)版本會(huì)導(dǎo)致配置內(nèi)容不同)
b)、編寫(xiě)實(shí)體bean,如下:
c)、編寫(xiě)junit測(cè)試代碼,如下:
d)、運(yùn)行junit測(cè)試代碼里的相應(yīng)方法就行可以。
聯(lián)系客服