連接數據庫使用JDBC為什麼又提供了JPA?Hibernate與JPA的關系?
什麼是JPA
Java?Persistence?API
JPA通過JDK?注解或XML描述對象-關系表的映射關系並將運行期的實體對象持久化到數據庫中
Sun引入新的JPA?ORM規范出於兩個原因其一簡化現有Java?EE和Java?SE應用的對象持久化的開發工作其二Sun希望整合對ORM技術實現天下歸一
JPA由EJB?軟件專家組開發作為JSR實現的一部分但它不囿於EJB?你可以在Web應用甚至桌面應用中使用JPA的宗旨是為POJO提供持久化標准規范由此可見經過這幾年的實踐探索能夠脫離容器獨立運行方便開發和測試的理念已經深入人心了目前Hibernate?TopLink?以及OpenJPA都提供了JPA的實現
JPA的總體思想和現有HibernateTopLinkJDO等ORM框架大體一致總的來說JPA包括以下方面的技術
ORM映射元數據JPA支持XML和JDK?注解兩種元數據的形式元數據描述對象和表之間的映射關系框架據此將實體對象持久化到數據庫表中
JPA?的API用來操作實體對象執行CRUD操作框架在後台替我們完成所有的事情開發者從繁瑣的JDBC和SQL代碼中解脫出來
查詢語言這是持久化操作中很重要的一個方面通過面向對象而非面向數據庫的查詢語言查詢數據避免程序的SQL語句緊密耦合
三JPA的優勢
?標准化
JPA?是?JCP?組織發布的?Java?EE?標准之一因此任何聲稱符合?JPA?標准的框架都遵循同樣的架構提供相同的訪問?API這保證了基於JPA開發的企業應用能夠經過少量的修改就能夠在不同的JPA框架下運行
?對容器級特性的支持
JPA?框架中支持大數據集事務並發等容器級事務這使得?JPA?超越了簡單持久化框架的局限在企業應用發揮更大的作用
?簡單易用集成方便
JPA的主要目標之一就是提供更加簡單的編程模型在JPA框架下創建實體和創建Java?類一樣簡單沒有任何的約束和限制只需要使用?javaxpersistenceEntity進行注釋JPA的框架和接口也都非常簡單沒有太多特別的規則和設計模式的要求開發者可以很容易的掌握JPA基於非侵入式原則設計因此可以很容易的和其它框架或者容器集成
?可媲美JDBC的查詢能力
JPA的查詢語言是面向對象而非面向數據庫的它以面向對象的自然語法構造查詢語句可以看成是Hibernate?HQL的等價物JPA定義了獨特的JPQL(Java?Persistence?Query?Language)JPQL是EJB?QL的一種擴展它是針對實體的一種查詢語言操作對象是實體而不是關系數據庫的表而且能夠支持批量更新和修改JOINGROUP?BYHAVING?等通常只有?SQL?才能夠提供的高級查詢特性甚至還能夠支持子查詢
?支持面向對象的高級特性
JPA?中能夠支持面向對象的高級特性如類之間的繼承多態和類之間的復雜關系這樣的支持能夠讓開發者最大限度的使用面向對象的模型設計企業應用而不需要自行處理這些特性在關系數據庫的持久化
四JPA的供應商
JPA?的目標之一是制定一個可以由很多供應商實現的API並且開發人員可以編碼來實現該API而不是使用私有供應商特有的API因此開發人員只需使用供應商特有的API來獲得JPA規范沒有解決但應用程序中需要的功能盡可能地使用JPA?API但是當需要供應商公開但是規范中沒有提供的功能時則使用供應商特有的API
?Hibernate
JPA是需要Provider來實現其功能的Hibernate就是JPA?Provider中很強的一個目前來說應該無人能出其右從功能上來說JPA現在就是Hibernate功能的一個子集Hibernate?從開始就開始兼容JPAHibernate獲得了Sun?TCK的JPA(Java?Persistence?API)?兼容認證
只要熟悉Hibernate或者其他ORM框架在使用JPA時會發現其實非常容易上手例如實體對象的狀態在Hibernate有自由持久游離三種JPA裡有newmanageddetachedremoved明眼人一看就知道這些狀態都是一一對應的再如flush方法都是對應的而其他的再如說Query?query?=?managercreateQuery(sql)它在Hibernate裡寫法上是session而在JPA中變成了manager所以從Hibernate到JPA的代價應該是非常小的
同樣JDO也開始兼容JPA在ORM的領域中看來JPA已經是王道規范就是規范在各大廠商的支持下JPA的使用開始變得廣泛
?Spring
Spring?+?Hibernate?常常被稱為?Java?Web?應用人氣最旺的框架組合而在?JCP?通過的?Web?Beans?JSR?卻欲將JSF?+?EJB?+?JPA?來自?JBoss?Seam(Spring?除外)的一些組件和EJB?(目前能夠提供有基本攔截和依賴注入功能的簡化?Session?Bean?框架)的一個?Web?組合進行標准化如今的?Spring??為?JPA?提供了完整的?EJB?容器契約允許?JPA在任何環境內可以在?Spring?管理的服務層使用(包括?Spring?的所有?AOP?和?DI?增強)同時關於下一個Web應用組合會是?EJBSpring?+?Hibernate?還是?Spring?+?JPA?的論戰早已充斥於耳
在Spring?中正式提供對JPA的支持這也促成了JPA的發展要知道JPA的好處在於可以分離於容器運行變得更加的簡潔
?OpenJPA
OpenJPA?是?Apache?組織提供的開源項目它實現了?EJB??中的?JPA?標准為開發者提供功能強大使用簡單的持久化數據管理框架OpenJPA?封裝了和關系型數據庫交互的操作讓開發者把注意力集中在編寫業務邏輯上OpenJPA?可以作為獨立的持久層框架發揮作用也可以輕松的與其它?Java?EE?應用框架或者符合?EJB??標准的容器集成
?其它
目前支持的實現包括ToplinkHibernate?Entitymanager等TopLink以前需要收費如今開源了OpenJPA雖然免費但功能性能普及性等方面更加需要加大力度
對於EJB來說實體Bean一直是被批評的對象由於其太復雜和龐大JPA的出現很大程度的分離了復雜性這讓EJB的推廣也變得容易
總而言之JPA規范主要關注的僅是API的行為方面而由各種實現完成大多數性能有關的調優盡管如此所有可靠的實現都應該擁有某種數據緩存以作為選擇但願不久的將來JPA能成為真正的標准
五小結
EJB?和JPA?毫無疑問將是Java?EE?的主要賣點在某些領域中它們給Java社區帶來了競爭優勢並使Java?在其他領域與競爭對手不分伯仲(因為不可否認目前某些領域尚不存在基於標准的方法)
過去數年來Spring?Framework一直是EJB在企業領域的主要競爭對手EJB規范解決了很多促進Spring興起的問題隨著它的出現EJB毫無疑問比Spring提供了更好的開發體驗——最引人注目的優勢是它不需要配置文件
JPA提供一種標准的OR映射解決方案該解決方案完全集成到EJB兼容的容器中JPA的前輩將會繼續穩定發展但是業務應用程序中的?raw?使用將可能會減少實現?JPA?兼容的實體管理器似乎很可能是此類技術的發展方向
Java?EE系列規范的較大問題與JPA沒有任何關系Java?EE?系列規范的問題涉及到?Web和EJB容器之間的集成Spring在此領域仍然具有主要競爭優勢JBoss的Seam項目嘗試使用自定義的方法來解決這一問題Caucho?Resin應用服務器試圖擴展容器邊界並支持在Web容器中使用@EJB注釋我們希望Java?EE?將解決層集成的問題為我們提供一個全面而標准的依賴性注入方法
在不久的將來Sun可能會將JPA作為一個單獨的JSR對待同時JPA還可能作為Java?SE的一部分不過這些都不太重要重要的是我們現在已經可以在脫離容器的情況下在Java?SE應用中使用JPA了?
JPA已經作為一項對象持久化的標准不但可以獲得Java?EE應用服務器的支持還可以直接在Java?SE中使用開發者將無需在現有多種ORM框架中艱難地選擇按照Sun的預想現有ORM框架頭頂的光環將漸漸暗淡不再具有以往的吸引力
簡述struts它有什麼優缺點??談一下MVC
Vector與ArrayList的區別interface與abstract?class的區別
JavaScript有什麼作用?什麼是Ajax Ajax與JavaScript的聯系
html通過什麼element把數據提交到WebApp?有幾種方式?這幾種方式的區別?
表格DEPARTMENT
ID
DEPTNAME
SUPERID
John
Peter
Rose
Martin
Michel
Tom
使用代碼將其顯示為
import?orgdomjDocument;
import?orgdomjDocumentHelper;
import?orgdomjDocumentException;
import?orgdomjElement;
import?javautil*;
/**
*?Created?by?IntelliJ?IDEA<br>
*?<b>User</b>:?leizhimin<br>
*?<b>Date</b>:??::<br>
*?<b>Note</b>:?Java遞歸遍歷XML所有元素
*/
public?class?XmlTest?{
// private?static?Map<String?String>?xmlmap?=?new?HashMap<String?String>();
//存儲xml元素信息的容器
private?static?List<Leaf>?elemList?=?new?ArrayList<Leaf>();
//要測試的xml對象
private?static?String?srcXml?=?;<?xml?version=\;\;?encoding=\;GBK\;?>\n;?+
;<doc>\n;?+
; <person>\n;?+
; <name>某人</name>\n;?+
; <adds> \n;?+
; <add?ID=\;\;>\n;?+
; <BS></BS>\n;?+
; <note>西安市太白路</note>\n;?+
; </add>\n;?+
; <add?ID=\;\;>\n;?+
; <BS></BS>\n;?+
; <note>空ID節點啊</note>\n;?+
; </add>\n;?+
; <add>\n;?+
; <BS></BS>\n;?+
; <note>空ID節點啊</note>\n;?+
; </add>\n;?+
;\t\t\t<add?ID=\;\;>\n;?+
;\t\t\t\t<BS?xmlns=\;\;/>\n;?+
; <note>西安市太白路</note>\n;?+
; </add>\n;?+
;\t\t</adds>\n;?+
; </person>\n;?+
; <other>\n;?+
; <name?ID=\;HEHE\;>ASDF</name>\n;?+
; </other>\n;?+
;</doc>;;
public?static?void?main(String?args[])?throws?DocumentException?{
XmlTest?test?=?new?XmlTest();
Element?root?=?testgetRootElement();
testgetElementList(root);
String?x?=?testgetListString(elemList);
Systemoutprintln(;;;;;原xml內容;;;;;);
Systemoutprintln(srcXml);
Systemoutprintln(;;;;;解析結果;;;;;);
Systemoutprintln(x);
}
/**
*?獲取根元素
*
*?@return
*?@throws?DocumentException
*/
public?Element?getRootElement()?throws?DocumentException?{
Document?srcdoc?=?DocumentHelperparseText(srcXml);
Element?elem?=?srcdocgetRootElement();
return?elem;
}
/**
*?遞歸遍歷方法
*
*?@param?element
*/
public?void?getElementList(Element?element)?{
List?elements?=?elementelements();
if?(elementssize()?==?)?{
//沒有子元素
String?xpath?=?elementgetPath();
String?value?=?elementgetTextTrim();
elemListadd(new?Leaf(xpath?value));
}?else?{
//有子元素
for?(Iterator?it?=?elementsiterator();?ithasNext();)?{
Element?elem?=?(Element)?itnext();
//遞歸遍歷
getElementList(elem);
}
}
}
public?String?getListString(List<Leaf>?elemList)?{
StringBuffer?sb?=?new?StringBuffer();
for?(Iterator<Leaf>?it?=?elemListiterator();?ithasNext();)?{
Leaf?leaf?=?itnext();
sbappend(leafgetXpath())append(;?=?;)append(leafgetValue())append(;\n;);
}
return?sbtoString();
}
}
/**
*?xml節點數據結構
*/
class?Leaf?{
private?String?xpath; ?//
private?String?value;
public?Leaf(String?xpath?String?value)?{
thisxpath?=?xpath;
thisvalue?=?value;
}
public?String?getXpath()?{
return?xpath;
}
public?void?setXpath(String?xpath)?{
thisxpath?=?xpath;
}
public?String?getValue()?{
return?value;
}
public?void?setValue(String?value)?{
thisvalue?=?value;
}
}
提示遞歸?XML DOM
JSP文件中有如下代碼
<html>
……
<%!?int?a?=?initia(A)
int?b?=?initia(B);
%>
<%
a?++;
b?++;
%>
<%
Systemoutprintln(a);
Systemoutprintln(b);
%>
請寫出代碼運行第一次與第二次分別的值是什麼?並用html表格進行表示
.在投資萬元以下開發一個訪問人數小於人的發布與管理系統
請寫出相關的需求分析及采用方式(大致這意思)
.寫一個你了解的開源的項目並說下自己的理解
.使用過什麼應用服務器並且說出他們的差別
什麼是應用服務器
應用服務器(無論是什麼功能的應用服務器)在數據庫服務器和終端用戶之間占有很大一部分計算領地這個領域有一個廣為人知名字這個名字就是中間件這個名字也告訴了你應用服務器都做什麼事情
首先也是最重要應用服務器把數據庫信息(通常來源於一個數據庫服務器)與終端用戶或者客戶端程序(常常在Web浏覽器裡運行)連接在一起在這個連接中存在一個中間層很多理由這些理由包括減少客戶端程序的大小和復雜性緩存和更好的控制數據流以提供更好的性能以及為數據通信和用戶通信提供安全保障
然而這並不是應用服務器功能的全部在應用服務器早期應用的時候人們就發現應用軟件本身(人們用來完成工作的程序)正變得越來越大並且越來越復雜無論應用程序的編寫和維護都是如此
與此同時應用程序共享數據和有時候共享功能的壓力也越來越大更多的應用程序被放在網絡上或使用報網絡擴展功能讓某些類型的應用程序在網絡上運行似乎是合乎邏輯的:這有助於以有組織和有效率地方式共享應用程序的功能使應用程序更容易編寫管理和維護
From:http://tw.wingwit.com/Article/program/Java/JSP/201405/30754.html