成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

使用WebRowSet完成JDBC的大部分任務(wù)

瀏覽:130日期:2024-06-05 18:18:22
內(nèi)容: 任何現(xiàn)實(shí)世界中的企業(yè)級(jí)應(yīng)用都需要訪問持久化存儲(chǔ)。關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)是使用最廣泛的持久化存儲(chǔ)機(jī)制,它支持使用SQL進(jìn)行數(shù)據(jù)查詢和更新。JDBC(Java DataBase Connectivity)是一系列的API,這些API為Java程序提供了一個(gè)使用SQL查詢和更新RDBMS的框架。通過(guò)Java程序從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)或者更新數(shù)據(jù)庫(kù)的過(guò)程包含了多個(gè)步驟。首先,程序需要建立一個(gè)連接,它可以和目標(biāo)數(shù)據(jù)庫(kù)進(jìn)行通信。我們可以通過(guò)幾種不同的方法建立數(shù)據(jù)庫(kù)連接。傳統(tǒng)的方式是,Java程序在裝載了制造商提供的JDBC驅(qū)動(dòng)后,調(diào)用java.sql.DriverManager類中適當(dāng)?shù)膅etConnection()方法獲得連接。另外一個(gè)(也是首選的)方式是,使用制造商提供的實(shí)現(xiàn)或者編寫一個(gè)針對(duì)目標(biāo)數(shù)據(jù)庫(kù)的實(shí)現(xiàn)了javax.sql.Connection接口的自定義類進(jìn)行連接對(duì)象的初始化。在更多的受約束環(huán)境中,例如Java EE容器,提供了使用JNDI(Java Naming and Directory Interface)查找獲得數(shù)據(jù)庫(kù)連接的方式。無(wú)論程序使用哪一種方式建立數(shù)據(jù)庫(kù)連接,如果連接成功,它應(yīng)該有一個(gè)對(duì)java.sql.Connection接口實(shí)例的引用。通過(guò)連接,程序創(chuàng)建一個(gè)java.sql.Statement實(shí)例,或者一個(gè)包含數(shù)據(jù)庫(kù)查詢的子接口。最后,程序執(zhí)行這個(gè)語(yǔ)句,獲得一個(gè)java.sql.ResultSet實(shí)例,它表示從數(shù)據(jù)庫(kù)中獲得的滿足查詢的實(shí)際數(shù)據(jù)。在寫這篇文章時(shí),JDK5.0是支持JDBC3.0的Java最新版本。JDBC3.0提供了一些特征,增加了數(shù)據(jù)操作和轉(zhuǎn)換的易用性和適應(yīng)性。在這篇文章中,我首先將簡(jiǎn)要解釋它的繼承層次結(jié)構(gòu),緊接著,我會(huì)使用一個(gè)例子演示如何利用javax.sql.rowset.WebRowSet接口的特征非常容易地將數(shù)據(jù)庫(kù)中的數(shù)據(jù)轉(zhuǎn)化為XML文件,或者相反操作。然后我會(huì)討論這個(gè)接口的利弊。在以上解釋的基礎(chǔ)上,我會(huì)總結(jié)一些首選這個(gè)接口的情況。版權(quán)聲明:任何獲得Matrix授權(quán)的網(wǎng)站,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必保留以下作者信息和鏈接作者:Sharad Acharya;mydeman原文:http://www.onjava.com/pub/a/onjava/2006/06/21/making-most-of-jdbc-with-webrowset.htmlMatrix:http://www.matrix.org.cn/resource/article/44/44626_WebRowSet.html關(guān)鍵字:WebRowSet;JDBCWebRowSet層次結(jié)構(gòu)我們開始先對(duì)WebRowSet接口的繼承層次結(jié)構(gòu)作一個(gè)簡(jiǎn)要的解釋。圖1顯示了相關(guān)的Java元素(包、接口和類),它們也是討論的一部分。 圖1 WebRowSet的繼承層次結(jié)構(gòu)繼承層次結(jié)構(gòu)的根部是java.sql.ResultSet接口。這個(gè)接口的實(shí)例代表表格式的數(shù)據(jù),這些數(shù)據(jù)通過(guò)執(zhí)行包含對(duì)底層數(shù)據(jù)庫(kù)查詢的java.sql.Statement獲取。默認(rèn)的結(jié)果集只能前向遍歷,并且不能更新。你不可能通過(guò)遍歷默認(rèn)結(jié)果集的方式進(jìn)行精確的控制。那么,你有哪些選擇呢?這就依賴于你要對(duì)結(jié)果集進(jìn)行什么操作。例如,如果你想結(jié)果集支持適合于JavaBeans組件模型的JDBC API,就需要使用java.sql.ResultSet的子接口javax.sql.RowSet。因?yàn)镴ava程序訪問數(shù)據(jù)庫(kù)是一個(gè)重量級(jí)操作,所以內(nèi)存中的數(shù)據(jù)高速緩存就是一個(gè)關(guān)系應(yīng)用程序性能的關(guān)鍵因素。如果你想結(jié)果集作為一個(gè)行數(shù)據(jù)的容器緩存在內(nèi)存中,那么你可以使用javax.sql.rowset.CachedRowSet,它是javax.sql.RowSet的子接口。這個(gè)接口的實(shí)例提供了不用一直保持連接數(shù)據(jù)源而操作數(shù)據(jù)的能力。更進(jìn)一步,它是可滾動(dòng)、可更新和可序列化的。除數(shù)據(jù)庫(kù)以外,它可以對(duì)其它表格式結(jié)構(gòu)的數(shù)據(jù)源起作用,如電子數(shù)據(jù)表。如果除了迄今為止提到的所有特征,你還要將結(jié)果集輸出到XML和使用有效的XML作為輸入,請(qǐng)選擇javax.sql.rowset.WebRowSet.。在Sun的參考實(shí)現(xiàn)類中已經(jīng)提供了它的實(shí)例的一個(gè)實(shí)現(xiàn),com.sun.rowset.WebRowSetImpl,并作為JDK5.0的一部分發(fā)行。在層次結(jié)構(gòu)的底部是javax.sql.rowset.JoinRowSet,javax.sql.rowset.WebRowSet的子接口,它提供了聯(lián)合多個(gè)相關(guān)結(jié)果集對(duì)象的方式,就像對(duì)底層數(shù)據(jù)庫(kù)表構(gòu)造的SQL JOIN。使用簡(jiǎn)單結(jié)果集伴隨上面的介紹給你留下的印象,我向你展示一個(gè)簡(jiǎn)單的例子。這篇文章的所有例子開發(fā)環(huán)境都是Eclipse3.1.0,JDK5.0、Windows XP上的Oracle10.2。示例代碼和輸出文件參見資源部分。我們考慮一個(gè)簡(jiǎn)單的student表,它定義了四列來(lái)存儲(chǔ)信息。接下來(lái)的表格顯示了查詢?cè)摫慝@得的結(jié)果。SQL>select * from student;ID FNAME LNAME AGE200 Jack Dakota 21100 John Doe 26首先,我們編寫一個(gè)Java類,它連接到包含student表的數(shù)據(jù)庫(kù),并且獲取它的紀(jì)錄。public class DatasourceConnector { public static void main(String[] args) { Connection con =null; OracleDataSource ds =null; try { ds = new OracleDataSource(); ds.setUser(''); ds.setPassword(''); ds.setURL( 'jdbc:oracle:thin:@localhost:1521:'); } catch (SQLException e) { e.printStackTrace(); } try { con = ds.getConnection(); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery( 'select * from student '); for (int j=0; jjavac DatasourceConnector.java>java DatasourceConnector應(yīng)該一切正常,你應(yīng)該可以看到類似下面的結(jié)果:ID FNAME LNAME AGE200 Jack Dakota 21100 John Doe 26導(dǎo)出結(jié)果集現(xiàn)在我把這個(gè)例子更進(jìn)一步,假定這個(gè)程序是一個(gè)應(yīng)用的一部分,應(yīng)用要求數(shù)據(jù)從數(shù)據(jù)庫(kù)轉(zhuǎn)化為XML以進(jìn)行更進(jìn)一步地處理。我將使用實(shí)現(xiàn)類com.sun.rowset.WebRowSetImpl來(lái)完成這個(gè)任務(wù)。為了實(shí)際看到這個(gè)結(jié)果,我加入一些代碼構(gòu)造一個(gè)javax.sql.rowset.WebRowSet的實(shí)例,并且導(dǎo)出結(jié)果集到XML文件。如下所示:... ... ... ResultSet rs = stmt.executeQuery('select * from student');WebRowSet wrs = new WebRowSetImpl();wrs.populate(rs);try { wrs.writeXml( new FileOutputStream('student.xml'));} catch (FileNotFoundException e) { e.printStackTrace();} catch (IOException e) { e.printStackTrace();}... ... ...從wrs.writeXML()輸出的結(jié)果形成一個(gè)符合WebRowSet schema定義的XML文檔。它包含了三部分:屬性、元數(shù)據(jù)和數(shù)據(jù)。大致的布局如下所示,完整的輸出文件參見資源部分。<?xml version='1.0'?> < properties> ... ... ... ... ... ... ... ... ... 標(biāo)簽提供了同步提供者的細(xì)節(jié),例如隔離級(jí)別(isolation level)、RowSet類型等等。標(biāo)簽提供了底層數(shù)據(jù)庫(kù)表的信息,例如紀(jì)錄數(shù)、名稱和列的類型等等。標(biāo)簽包含了實(shí)際數(shù)據(jù),上面的表如下所示: 200 < /columnValue> Jack Dakota 21 100 John Doe 26 上例中的標(biāo)簽顯示了WebRowSet對(duì)象值,當(dāng)前可以不用任何更改地映射到底層數(shù)據(jù)源中。任何數(shù)據(jù)處理操作如插入、更新或刪除都可以在輸出的XML中被恰當(dāng)?shù)臉?biāo)記出來(lái),我將會(huì)在接下來(lái)的部分解釋。操作結(jié)果集你可以刪除一行數(shù)據(jù),先移動(dòng)指針到這一行的位置上,然后調(diào)用WebRowSet實(shí)例的deleteRow()方法。同樣,你可以更新一個(gè)或者多個(gè)值,先移動(dòng)指針到這個(gè)行的位置,然后調(diào)用合適的更新方法。下面的代碼同時(shí)完成了刪除和更新:... ... ...ResultSet rs = stmt.executeQuery('select * from student ');WebRowSet wrs = new WebRowSetImpl();wrs.populate(rs);wrs.absolute(1); //move to first rowwrs.deleteRow(); //delete current rowwrs.absolute(2); //move to second rowwrs.updateInt(4,20);//update current row... ... ...前四行代碼片斷的作用是很明顯的:初始化對(duì)象并且轉(zhuǎn)化結(jié)果集。接下來(lái)的兩行嘗試刪除第一行。最后兩行試圖把第二行紀(jì)錄的第四列的值更新為20。輸出這個(gè)WebRowSet對(duì)象會(huì)產(chǎn)生如下的元素: 200 Jack Dakota 21 100 John Doe 26 20 這個(gè)XML片斷顯示了第一行被標(biāo)簽標(biāo)記為刪除。第二行第四列的值被標(biāo)記出從當(dāng)前值26更新為一個(gè)新值20。提交更改迄今為止,我僅僅是操作結(jié)果。這些變化并不會(huì)反映到底層的數(shù)據(jù)庫(kù)中,除非我進(jìn)行了提交。下面代碼,如果執(zhí)行成功,將會(huì)通過(guò)提交是改變持久。... ... ...wrs.acceptChanges();... ... ...從XML讀取WebRowSet也提供了一些readXML()方法,通過(guò)使用java.io.InputStream或者java.io.Reader實(shí)例從有效的XML文件中讀取數(shù)據(jù)。如果你的輸入數(shù)據(jù)是有效的XML形式,在進(jìn)行其他處理之前需要將它們持久化到底層的數(shù)據(jù)庫(kù)中,你就會(huì)發(fā)現(xiàn)這個(gè)選項(xiàng)非常有用。使用WebRowSet的利弊在展示了WebRowSet的基礎(chǔ)操作之后,我們總結(jié)以下使用這種方式操作數(shù)據(jù)的利弊。利+標(biāo)準(zhǔn)方案使它從不同的應(yīng)用中生成和處理XML數(shù)據(jù)而不需要轉(zhuǎn)化成為可能。+數(shù)據(jù)操作的易用性——它支持滾動(dòng)、更新、緩存和離線編輯。+數(shù)據(jù)和XML簡(jiǎn)單轉(zhuǎn)化使相關(guān)代碼減少。較少的代碼意味著較少的錯(cuò)誤,也就意味著更加健壯的代碼。+較少的數(shù)據(jù)庫(kù)更新可以幫助減少并發(fā)問題。弊+性能和吞吐量可能會(huì)因?yàn)楦郊拥男畔⑷鐚傩院驮獢?shù)據(jù)受到負(fù)面影響。在分布式應(yīng)用中這可能是一個(gè)尤為突出的問題,因?yàn)榫薮蟮腦ML文件需要在網(wǎng)絡(luò)上傳輸以充分減少數(shù)據(jù)的數(shù)量。+新的JDK版本,因?yàn)檫@個(gè)特征在1.4或者更老一些的JDK上并不可用。適用性WebRowSet接口適合在下面情形中使用:1、使用XML消息的應(yīng)用集成,XML消息是當(dāng)前頂級(jí)架構(gòu)的選擇之一。Java EE應(yīng)用可以使用基于JMS的集成和其他外部通信,而使用JDBC保存自己的事務(wù)狀態(tài)。在這樣一個(gè)情形下,WebRowSet API減少了編程的復(fù)雜性,也降低需要編寫的代碼量。2、來(lái)自持久性數(shù)據(jù)源的內(nèi)容展示通常通過(guò)獲取數(shù)據(jù)集并把它傳遞到視圖組件(如JSP)中來(lái)完成。一個(gè)可用的方式就是在應(yīng)用XSLT之前把數(shù)據(jù)集轉(zhuǎn)化為XML,然后產(chǎn)生展示的內(nèi)容。這種選擇提供了更好的可維護(hù)性,因?yàn)樗鼫p少來(lái)自展示內(nèi)容的組件的格式化。總結(jié)直到最近,在數(shù)據(jù)庫(kù)和XML之間來(lái)回的數(shù)據(jù)轉(zhuǎn)化請(qǐng)求曾經(jīng)是大部分應(yīng)用開發(fā)和測(cè)試資源中一項(xiàng)主要任務(wù)。幸運(yùn)的是,最新的JDBC API包含了一些特點(diǎn)例如數(shù)據(jù)集的精確導(dǎo)航、數(shù)據(jù)集的高速緩存、把數(shù)據(jù)集寫入到XML中等等。對(duì)于企業(yè)級(jí)程序員RDBMS的重要性以及隨著當(dāng)前不斷增長(zhǎng)的Java和XML應(yīng)用的普及度,像WebRowSet這樣的接口提供的特征將會(huì)更加有用。那么,現(xiàn)在是時(shí)候重新考慮一下了,在下一個(gè)使用RDBMS作為數(shù)據(jù)持久化的Java/XML應(yīng)用中,你是否仍然采用傳統(tǒng)的數(shù)據(jù)訪問方式;WebRowSet也許可以讓你耳目一新。資源Matrix:http://www.matrix.org.cn本文的示例代碼Sun’s WebRowSet API文檔頁(yè)面Sharad Acharya在物流、保險(xiǎn)、銀行和抵押等多行業(yè)范圍的軟件工程領(lǐng)域有超過(guò)8年的經(jīng)驗(yàn)。 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd 任何現(xiàn)實(shí)世界中的企業(yè)級(jí)應(yīng)用都需要訪問持久化存儲(chǔ)。關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)是使用最廣泛的持久化存儲(chǔ)機(jī)制,它支持使用SQL進(jìn)行數(shù)據(jù)查詢和更新。JDBC(Java DataBase Connectivity)是一系列的API,這些API為Java程序提供了一個(gè)使用SQL查詢和更新RDBMS的框架。通過(guò)Java程序從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)或者更新數(shù)據(jù)庫(kù)的過(guò)程
標(biāo)簽: JDBC
相關(guān)文章: