動(dòng)態(tài)Web數(shù)據(jù)庫技術(shù)基于JSP和XML技術(shù)實(shí)現(xiàn)xml與數(shù)據(jù)庫課件_第1頁
動(dòng)態(tài)Web數(shù)據(jù)庫技術(shù)基于JSP和XML技術(shù)實(shí)現(xiàn)xml與數(shù)據(jù)庫課件_第2頁
動(dòng)態(tài)Web數(shù)據(jù)庫技術(shù)基于JSP和XML技術(shù)實(shí)現(xiàn)xml與數(shù)據(jù)庫課件_第3頁
動(dòng)態(tài)Web數(shù)據(jù)庫技術(shù)基于JSP和XML技術(shù)實(shí)現(xiàn)xml與數(shù)據(jù)庫課件_第4頁
動(dòng)態(tài)Web數(shù)據(jù)庫技術(shù)基于JSP和XML技術(shù)實(shí)現(xiàn)xml與數(shù)據(jù)庫課件_第5頁
已閱讀5頁,還剩125頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

王紅第9章

XML與數(shù)據(jù)庫

2022/12/281王紅2022/12/281主要內(nèi)容第9章XML與數(shù)據(jù)庫9.1借助XML文檔實(shí)現(xiàn)數(shù)據(jù)庫之間數(shù)據(jù)互換

9.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射

9.3SQLServer對XML的支持

9.4XML數(shù)據(jù)庫

9.5小

結(jié)

2022/12/282主要內(nèi)容第9章XML與數(shù)據(jù)庫2022/12/282當(dāng)存在大量數(shù)據(jù)需要處理分析的話,最好是把這些數(shù)據(jù)放到數(shù)據(jù)庫中幾乎所有大型應(yīng)用系統(tǒng)都是和數(shù)據(jù)庫相關(guān)聯(lián)的,所以如果XML需要在這些領(lǐng)域大展宏圖的話,必須要和數(shù)據(jù)庫相聯(lián)系

2022/12/283當(dāng)存在大量數(shù)據(jù)需要處理分析的話,最好是把這些數(shù)據(jù)放到數(shù)據(jù)庫中9.1借助XML文檔實(shí)現(xiàn)數(shù)據(jù)庫之間數(shù)據(jù)互換

XML提供了一種連接關(guān)系數(shù)據(jù)庫和面向?qū)ο髷?shù)據(jù)庫以及其他數(shù)據(jù)庫管理系統(tǒng)之間的紐帶

關(guān)系數(shù)據(jù)庫和面向?qū)ο髷?shù)據(jù)庫首先需要將數(shù)據(jù)從數(shù)據(jù)庫中提取出來,經(jīng)過轉(zhuǎn)換或直接以XML數(shù)據(jù)形式發(fā)布到網(wǎng)上(局域網(wǎng)或Internet網(wǎng)),然后相互交換數(shù)據(jù),經(jīng)應(yīng)用層系統(tǒng)處理后在轉(zhuǎn)存入庫

開發(fā)一個(gè)訪問數(shù)據(jù)庫的XML應(yīng)用系統(tǒng)需要同時(shí)借助XML編程接口和數(shù)據(jù)庫編程接口,前者用于對XML文檔的解析、定位和查詢,后者則是用于訪問數(shù)據(jù)庫

2022/12/2849.1借助XML文檔實(shí)現(xiàn)數(shù)據(jù)庫之間數(shù)據(jù)互換XML提供了XML和數(shù)據(jù)庫XML文檔是一個(gè)數(shù)據(jù)集合優(yōu)點(diǎn)自我描述性可移植性以樹結(jié)構(gòu)描述數(shù)據(jù)提供部分?jǐn)?shù)據(jù)庫的功能缺點(diǎn)數(shù)據(jù)存取慢缺少數(shù)據(jù)庫的功能2022/12/285XML和數(shù)據(jù)庫XML文檔是一個(gè)數(shù)據(jù)集合2022/12/2XML和數(shù)據(jù)庫

XML文檔在數(shù)據(jù)量較小和用戶較少的環(huán)境中可以當(dāng)作數(shù)據(jù)庫使用本地XML數(shù)據(jù)庫專門設(shè)計(jì)用于存儲XML文檔的數(shù)據(jù)庫2022/12/286XML和數(shù)據(jù)庫XML文檔在數(shù)據(jù)量較小和用戶較少的環(huán)境中可9.1.1將XML數(shù)據(jù)插入數(shù)據(jù)庫

將XML數(shù)據(jù)插入數(shù)據(jù)庫的步驟:使用Class.forName()方法加載缺省驅(qū)動(dòng)器使用DriverManager對象的getConnection()方法建立數(shù)據(jù)庫連接使用Connection對象創(chuàng)建Statement對象將已解析的XML文檔放在Document對象中使用getElementsByTagName()方法檢索其元素使用Insert語句將數(shù)據(jù)插入數(shù)據(jù)庫2022/12/2879.1.1將XML數(shù)據(jù)插入數(shù)據(jù)庫將XML數(shù)據(jù)插入數(shù)將XML中的數(shù)據(jù)插入數(shù)據(jù)庫DocumentBuilderFactoryDocumentBuilder

DocumentNodeListElementNode2022/12/288將XML中的數(shù)據(jù)插入數(shù)據(jù)庫DocumentBuilderFa實(shí)例下面例xml2db.java,將candidate.xml文檔中的數(shù)據(jù)存儲到一個(gè)ACCESS數(shù)據(jù)庫people中表的結(jié)構(gòu)如圖9-1所示

2022/12/289實(shí)例下面例xml2db.java,將candidate.xm實(shí)例importjava.sql.*;importjavax.xml.parsers.*;importorg.w3c.dom.*;publicclassxml2db{staticConnectioncon;staticStringnm,add,tel,fax,email,sql;publicstaticvoidmain(Stringargs[]){try{

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");con=DriverManager.getConnection("jdbc:odbc:people","","");Statementstmt=con.createStatement();2022/12/2810實(shí)例importjava.sql.*;2022/12/28實(shí)例(續(xù))

DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=factory.newDocumentBuilder();Documentdoc=builder.parse("candidate.xml");NodeListnl=doc.getElementsByTagName("PERSON");for(inti=0;i<nl.getLength();i++){Elementnode=(Element)nl.item(i);Stringnm=node.getElementsByTagName(“NAME").item(0).

getFirstChild().getNodeValue();……sql="insertintopeoplevalues(\'"+nm+"\',\'"+add+"\',\'"+tel+"\',\'"+fax+"\',\'"+email+"\')";intret=stmt.executeUpdate(sql);}stmt.close();con.close();}catch(Exceptione){e.printStackTrace();}}}運(yùn)行結(jié)果如圖9-2所示2022/12/2811實(shí)例(續(xù))DocumentBuilderFactoryf圖9-2xml2db.java運(yùn)行結(jié)果2022/12/2812圖9-2xml2db.java運(yùn)行結(jié)果2022/12/9.1.2由數(shù)據(jù)庫中數(shù)據(jù)生成XML文檔

從數(shù)據(jù)庫檢索數(shù)據(jù)生成XML的步驟:將文件頭和根元素寫入文件使用Class.forName()方法加載缺省驅(qū)動(dòng)程序使用DriverManager對象的getConnection()方法建立數(shù)據(jù)庫連接使用Connection對象創(chuàng)建Statement對象使用Statement對象的executeQuery方法執(zhí)行查詢從數(shù)據(jù)庫提取數(shù)據(jù)并將其插入文件中將結(jié)束元素寫入文件2022/12/28139.1.2由數(shù)據(jù)庫中數(shù)據(jù)生成XML文檔從數(shù)據(jù)庫檢索數(shù)據(jù)生用數(shù)據(jù)庫中的數(shù)據(jù)生成XML文檔DocumentBuilderFactoryDocumentBuilder

DocumentNode2022/12/2814用數(shù)據(jù)庫中的數(shù)據(jù)生成XML文檔DocumentBuilder實(shí)例下面舉例Sdudents.java,將一個(gè)ACCESS數(shù)據(jù)庫students中數(shù)據(jù)存儲到students.xml文檔中表的內(nèi)容如圖9-3所示2022/12/2815實(shí)例下面舉例Sdudents.java,將一個(gè)ACCESS數(shù)實(shí)例importjava.sql.*;importjava.io.*;importjavax.xml.parsers.*;importjavax.xml.transform.dom.*;importjavax.xml.transform.stream.*;importjavax.xml.transform.*;importorg.w3c.dom.*;importorg.xml.sax.*; Filefl=newFile("students.xml"); fl.createNewFile(); FileWriterfw=newFileWriter(fl); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connectioncon=DriverManager.getConnection("jdbc:odbc:aaa","",""); Statementst=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSetrs=st.executeQuery("select*fromstudents");2022/12/2816實(shí)例importjava.sql.*;2022/12/28實(shí)例while(rs.next()) { fw.write("<student>"); fw.write("<stud_id>"); Stringstud_id=rs.getString("Stud_id"); fw.write(stud_id); fw.write("</stud_id>"); fw.write("<stud_namme>"); Stringstud_name=rs.getString("Stud_name"); fw.write(stud_name); fw.write("</stud_name>"); fw.write("</student>");}運(yùn)行結(jié)果如圖9-4所示2022/12/2817實(shí)例while(rs.next())2022/12/2817圖9-4Sdudents.java運(yùn)行結(jié)果

2022/12/2818圖9-4Sdudents.java運(yùn)行結(jié)果2022/12實(shí)例下面舉例db2xml.java,用org.apache.crimson.tree包中的XmlDocument類的write()方法將一個(gè)ACCESS數(shù)據(jù)庫people中數(shù)據(jù)存儲到candidate1.xml文檔中的表的內(nèi)容如圖9-2所示程序運(yùn)行結(jié)果使candidate1.xml與前面用到的candidate.xml完全相同2022/12/2819實(shí)例下面舉例db2xml.java,用org.apache.實(shí)例importjava.sql.*;importjavax.xml.parsers.*;importorg.apache.crimson.tree.*;importorg.w3c.dom.*;importjava.io.*;publicclassdb2xml{staticStringnm,add,tel,fax,email,sql;staticStringurl="jdbc:oracle:oci8:@oradb";publicstaticvoidmain(Stringargs[]){Elementpeople,person,name,address,tel,fax,email;try{

Class.forName("oracle.jdbc.driver.OracleDriver");Connectioncon=DriverManager.getConnection(url,"scott","tiger");Statementstmt=con.createStatement();ResultSetresults=stmt.executeQuery("SELECT*FROMpeople");DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=dbf.newDocumentBuilder();Documentdoc=builder.newDocument();people=doc.createElement("PEOPLE");2022/12/2820實(shí)例importjava.sql.*;2022/12/28實(shí)例(續(xù))

while(results.next()){person=doc.createElement("PERSON");people.appendChild(person);name=doc.createElement("NAME");name.appendChild(doc.createTextNode(results.getString("NAME")));person.appendChild(name);……}doc.appendChild(people);((XmlDocument)doc).write(System.out);}catch(Exceptione){e.printStackTrace();}}}2022/12/2821實(shí)例(續(xù))while(results.next()){9.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射把數(shù)據(jù)存儲到數(shù)據(jù)庫中的時(shí)候,需要拋棄一個(gè)文檔的很多信息比如它的名稱和DTD同樣,當(dāng)從數(shù)據(jù)庫中提取數(shù)據(jù)的時(shí)候,產(chǎn)生的XML文檔通常不包含CDATA或者是實(shí)體使用的說明,而且節(jié)點(diǎn)下元素的排列位置只和數(shù)據(jù)庫中記錄的順序位置一致一個(gè)XML文檔存儲到數(shù)據(jù)庫中,再由該數(shù)據(jù)庫生成此XML文檔,這前后兩個(gè)文檔格式幾乎不可能完全一樣2022/12/28229.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射把數(shù)據(jù)存儲到數(shù)據(jù)庫中的時(shí)9.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射為了在數(shù)據(jù)庫和XML文檔之間傳遞數(shù)據(jù),必須在數(shù)據(jù)庫數(shù)據(jù)模型和XML數(shù)據(jù)模型產(chǎn)生映射關(guān)系數(shù)據(jù)庫數(shù)據(jù)是結(jié)構(gòu)化數(shù)據(jù)XML文檔屬于半結(jié)構(gòu)化的數(shù)據(jù)將結(jié)構(gòu)化數(shù)據(jù)與非結(jié)構(gòu)化數(shù)據(jù)進(jìn)行轉(zhuǎn)換的時(shí)候,關(guān)鍵問題是建立不同結(jié)構(gòu)層次之間的映射關(guān)系,及如何保留他們的語義約束信息,即如何將關(guān)系數(shù)據(jù)庫表達(dá)的結(jié)構(gòu)與約束映射為XML。映射可以有兩類:模板驅(qū)動(dòng)和模型驅(qū)動(dòng)。2022/12/28239.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射為了在數(shù)據(jù)庫和XML文檔9.2.1基于模板驅(qū)動(dòng)的映射基于模板的映射方法并不事先定義好XML文檔與其他數(shù)據(jù)之間的映射關(guān)系,而是在XML文檔中嵌入帶參數(shù)的SQL命令。這些命令在轉(zhuǎn)換過程中被系統(tǒng)所識別和執(zhí)行,執(zhí)行的結(jié)果被替換到指令所在的位置,從而生成目標(biāo)XML文檔.并用數(shù)據(jù)傳輸諸如中間件等實(shí)體軟件進(jìn)行處理

2022/12/28249.2.1基于模板驅(qū)動(dòng)的映射基于模板的映射方法并不事先定9.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射比如,考慮下面的模板:<?xmlversion="1.0"?>

<FlightInfo>

<Intro>Thefollowingflightshaveavailableseats:</Intro>

<SelectStmt>SELECTAirline,FltNumber,Depart,ArriveFROMFlights</SelectStmt>

<Conclude>W(wǎng)ehopeoneofthesemeetsyourneeds</Conclude>

</FlightInfo>2022/12/28259.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射比如,考慮下面的模板:9.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射當(dāng)用數(shù)據(jù)傳輸中間件進(jìn)行處理的時(shí)候,每一個(gè)SELECT語句都會(huì)被它的結(jié)果所代替,用XML格式化形式表現(xiàn)為:<?xmlversion="1.0"?>

<FlightInfo>

<Intro>Thefollowingflightshaveavailableseats:</Intro>

<Flights>

<Row>

<Airline>ACME</Airline>

<FltNumber>123</FltNumber>

<Depart>Dec12,199813:43</Depart>

<Arrive>Dec13,199801:21</Arrive></Row>

</Flights>

<Conclude>W(wǎng)ehopeoneofthesemeetsyourneeds</Conclude>

</FlightInfo>2022/12/28269.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射當(dāng)用數(shù)據(jù)傳輸中間件進(jìn)行處9.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射基于模板轉(zhuǎn)換的流程圖:2022/12/28279.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射基于模板轉(zhuǎn)換的流程圖:9.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射優(yōu)點(diǎn):基于模板驅(qū)動(dòng)的映射可以是相當(dāng)靈活的允許你把結(jié)果集放到XML文檔的任何位置同時(shí)可以對SELECT語句設(shè)置參數(shù)并且可以使用for循環(huán)語句和if條件語句等。2022/12/28289.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射優(yōu)點(diǎn):2022/12/29.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射缺點(diǎn):基于模板驅(qū)動(dòng)的映射是一種淺層映射以XML內(nèi)嵌的SQL執(zhí)行的數(shù)據(jù)結(jié)果集為依據(jù),不涉及數(shù)據(jù)庫賴以存在的關(guān)系模式舍棄了關(guān)系模式的種種約束條件只適合于將關(guān)系數(shù)據(jù)庫的數(shù)據(jù)轉(zhuǎn)換為XML文檔2022/12/28299.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射缺點(diǎn):2022/12/29.2.2基于模型驅(qū)動(dòng)的映射就是把數(shù)據(jù)從數(shù)據(jù)庫傳送到XML文檔是用一個(gè)具體的模型實(shí)現(xiàn)的。這樣,用戶可以將相應(yīng)的格式直接映射到模型上,從而數(shù)據(jù)庫中數(shù)據(jù)以各種形式展示出來。在XML文檔中,兩種模型是很常見的:表格模型和數(shù)據(jù)專用對象模型。2022/12/28309.2.2基于模型驅(qū)動(dòng)的映射就是把數(shù)據(jù)從數(shù)據(jù)庫傳送到XM1.表格模型把XML文檔表示為一個(gè)單一的表格或者是表格的集合,這樣數(shù)據(jù)庫中數(shù)據(jù)都展示為固定模式。一般地,數(shù)據(jù)庫中數(shù)據(jù)可以用如下的形式表示:<database>

<table>

<row>

<column1>...</column1>

<column2>...</column2>

...

</row>

...

</table>

...

</database>2022/12/28311.表格模型把XML文檔表示為一個(gè)單一的表格或者是表格的集1.表格模型這里關(guān)鍵字“table”在把數(shù)據(jù)從數(shù)據(jù)庫傳遞到XML文檔的時(shí)候,表示一個(gè)單一的結(jié)果集。但是,當(dāng)結(jié)果集合不只一個(gè)的時(shí)候,或者當(dāng)XML文檔包括多個(gè)復(fù)雜嵌套的時(shí)候,這種傳遞方式就不能適應(yīng)了。2022/12/28321.表格模型這里關(guān)鍵字“table”在把數(shù)據(jù)從數(shù)據(jù)庫傳遞到2.數(shù)據(jù)專用的對象模型把一個(gè)XML文檔表示為由數(shù)據(jù)對象構(gòu)成的樹,每一個(gè)元素類型和對象相對應(yīng)。主要在面向?qū)ο蠛蛯哟螖?shù)據(jù)庫中使用,通過傳統(tǒng)的關(guān)系-對象模型也可以映射到關(guān)系數(shù)據(jù)庫中。2022/12/28332.數(shù)據(jù)專用的對象模型把一個(gè)XML文檔表示為由數(shù)據(jù)對象構(gòu)成2.數(shù)據(jù)專用的對象模型基于模型的轉(zhuǎn)換方法由于有了數(shù)據(jù)模型的支持,可以完成關(guān)系數(shù)據(jù)庫數(shù)據(jù)和XML數(shù)據(jù)之間的雙向轉(zhuǎn)換。但是模型的引入也使得XML文檔的結(jié)構(gòu)受到了一些限制,一個(gè)XML文檔必須符合模型所規(guī)定的結(jié)構(gòu),才能將XML文檔轉(zhuǎn)換成其他類型的數(shù)據(jù),而從其他類型數(shù)據(jù)轉(zhuǎn)換得到的XML文檔也具有某種結(jié)構(gòu)特點(diǎn)。基于模型的轉(zhuǎn)換方法的關(guān)鍵在于設(shè)計(jì)一個(gè)靈活的映射模型,為了更好的支持其雙向映射的特點(diǎn),這個(gè)映射模型必須是易于“讀懂”的,易于操縱的,能夠很好的表達(dá)關(guān)系數(shù)據(jù)庫的各種約束。模型驅(qū)動(dòng)的映射是一種深層映射,是模式和模式之間的映射。2022/12/28342.數(shù)據(jù)專用的對象模型基于模型的轉(zhuǎn)換方法由于有了數(shù)據(jù)模型的2.數(shù)據(jù)專用的對象模型在XML和數(shù)據(jù)庫之間進(jìn)行數(shù)據(jù)轉(zhuǎn)化的時(shí)候,需要考慮兩個(gè)過程:一個(gè)是從數(shù)據(jù)庫模式中產(chǎn)生DTD,另外一個(gè)是根據(jù)DTD生成數(shù)據(jù)庫模式.從一個(gè)DTD中生成一個(gè)關(guān)系模式的步驟如下:(1)對每一個(gè)元素,產(chǎn)生一個(gè)表和一個(gè)主鍵列。(2)對每一個(gè)有混合內(nèi)容的元素,產(chǎn)生一個(gè)獨(dú)立的表格,用來存儲PCDATA,并通過父表的主鍵和父表相聯(lián)。(3)對元素類型中的每一個(gè)單一值的屬性,對具有只有PCDATA內(nèi)容的子元素(該子元素按順序出現(xiàn)),產(chǎn)生一個(gè)單獨(dú)的列,如果子元素類型或者值是可以選擇的話,該列就應(yīng)該可以允許為NULL類型。2022/12/28352.數(shù)據(jù)專用的對象模型在XML和數(shù)據(jù)庫之間進(jìn)行數(shù)據(jù)轉(zhuǎn)化的時(shí)2.數(shù)據(jù)專用的對象模型(4)對有多個(gè)值的屬性和可以出現(xiàn)多次的子元素(該子元素PCDATA)的話,需要?jiǎng)?chuàng)建一個(gè)單獨(dú)的表來存儲這些值,并通過父表的主鍵和父表相聯(lián)。(5)對每一個(gè)包含元素或者混合內(nèi)容的子元素來說,通過父表的主鍵把父元素和子元素聯(lián)接起來。從一個(gè)關(guān)系數(shù)據(jù)庫模式構(gòu)建DTD步驟如下:(1)對每一個(gè)表,創(chuàng)建一個(gè)元素。(2)對表中的每一列,創(chuàng)建一個(gè)屬性或者是一個(gè)只有PCDATA內(nèi)容的子元素。(3)根據(jù)表中的每一主鍵/外鍵關(guān)系,創(chuàng)建該表元素的子元素。2022/12/28362.數(shù)據(jù)專用的對象模型(4)對有多個(gè)值的屬性和可以出現(xiàn)多次9.3SQLServer對XML的支持在SQLServer中實(shí)現(xiàn)了對XML使用HTTP執(zhí)行簡單查詢、應(yīng)用XSL樣式單的查詢、使用模板查詢、使用XPath查詢。SQLServer2000的XML功能主要包括如下內(nèi)容:許用戶通過網(wǎng)絡(luò)查詢SQLServer中數(shù)據(jù),并以XML格式獲得返回結(jié)果。持XDR(簡化的XML_DATA)架構(gòu),并可以使用XPath查詢XDR架構(gòu)。允許查詢和寫入XML數(shù)據(jù)。使用SELECT語句和FORXML字句檢索XML數(shù)據(jù)。使用XPath查詢語言檢索XML數(shù)據(jù)。增強(qiáng)了MicrosoftSQLServer2000OLEDB提供程序,從而可以使用XML文檔作為命令文本并以流的形式返回結(jié)果集。2022/12/28379.3SQLServer對XML的支持在SQLSer9.3.1配置IIS服務(wù)器支持SQLXML在Windows2000中,有自帶的IIS5.0。如果是WindowsNT,則在最新的serverpack中包含了新的IIS。IIS服務(wù)器建立了用戶和SQLServer之間的橋梁。用戶通過瀏覽器發(fā)出URL查詢請求,IIS首先接收到查詢結(jié)果,然后將請求通過OLEDB接口傳遞給SQLServer。SQLServer以XML格式返回的查詢結(jié)果再返回到用戶的瀏覽器中。在IIS服務(wù)器中完成XML格式數(shù)據(jù)通信需要通過SQLServer2000的XML組件(sqlsapi.dll和sqlxml.dll)來完成。2022/12/28389.3.1配置IIS服務(wù)器支持SQLXML在Windo9.3.1配置IIS服務(wù)器支持SQLXML在使用HTTP訪問SQLServer2000數(shù)據(jù)庫之前,必須根據(jù)使用方式創(chuàng)建適當(dāng)?shù)奶摂M目錄。必須將IIS服務(wù)器和虛擬目錄的名稱指定為URL的一部分2022/12/28399.3.1配置IIS服務(wù)器支持SQLXML在使用HT9.3.1配置IIS服務(wù)器支持SQLXML根據(jù)使用HTTP訪問SQLServer2000數(shù)據(jù)庫的不同方式,需要?jiǎng)?chuàng)建適當(dāng)?shù)奶摂M目錄:(1)直接訪問數(shù)據(jù)庫對象,例如表。在這種情況下,需要?jiǎng)?chuàng)建dbobject類型的虛擬目錄。(2)執(zhí)行模板文件。在這種情況下,需要?jiǎng)?chuàng)建template類型的虛擬目錄(3)執(zhí)行XPath查詢。在這種情況下,需要?jiǎng)?chuàng)建schema類型的虛擬目錄2022/12/28409.3.1配置IIS服務(wù)器支持SQLXML根據(jù)使用HT9.3.1配置IIS服務(wù)器支持SQLXML下面舉例說明各種查詢方式的使用。這幾種查詢方式都是用下面的表:2022/12/28419.3.1配置IIS服務(wù)器支持SQLXML下面舉例說明9.3.2使用HTTP執(zhí)行簡單查詢

使用了簡單查詢來獲得“書籍”表中的書名:http://localhost/xmlquery?sql=selectf+書名+from+書籍+for+xml+auto&root=+書名清單書名+from+書籍+for+xml+auto&root=+書名清單該查詢將返回的XML文檔根元素設(shè)置為“書名清單”,并以AUTO方式返回結(jié)果。查詢結(jié)果如圖9-9所示2022/12/28429.3.2使用HTTP執(zhí)行簡單查詢使用了簡單查詢來獲得圖9-9簡單查詢結(jié)果2022/12/2843圖9-9簡單查詢結(jié)果2022/12/28439.3.3應(yīng)用XSL樣式單的查詢可以使用樣式單元來定義XML查詢結(jié)果在瀏覽器中的表現(xiàn)形式。要使用樣式單,需要在查詢時(shí)使用XSL參數(shù)指定樣式單文件。下面的查詢使用XSL樣式單以表格方式顯示查詢結(jié)果:

http://localhost/xmlquery?sql=select+書名+from+書籍+for+xml+auto&root=+圖書清單&xsl=/table.xsl其中xsl/table.xsl指定了使用的樣式單文件應(yīng)用了樣式單后的查詢結(jié)果如圖9-10所示2022/12/28449.3.3應(yīng)用XSL樣式單的查詢可以使用樣式單元來定義圖9-10應(yīng)用了樣式單后的查詢結(jié)果2022/12/2845圖9-10應(yīng)用了樣式單后的查詢結(jié)果2022/12/2849.3.4使用模板查詢直接在瀏覽器地址欄中輸入過長的SQL查詢語句非常不便為解決這一問題,SQLServer引入了模板的概念。一個(gè)查詢模板實(shí)際上就是一個(gè)包含SQL查詢的XML或XPath查詢的XML文檔,然后在URL中指定模板文件的方式來執(zhí)行查詢2022/12/28469.3.4使用模板查詢直接在瀏覽器地址欄中輸入過長的S9.3.4使用模板查詢在查詢模板中,可以定義如下內(nèi)容:(1)指定SQL查詢或XPath查詢。(2)指定通過執(zhí)行SQL或XPath查詢所返回的XML片段的根元素,從而使在URL中執(zhí)行模板的結(jié)果是有效的XML文檔。(3)定義可被傳遞到SQL語句或XPath查詢的參數(shù)。(4)聲明命名空間。(5)指定將應(yīng)用于所得到文檔的可擴(kuò)展樣式語言XSL樣式表。(6)定義查詢模板2022/12/28479.3.4使用模板查詢在查詢模板中,可以定義如下內(nèi)容:9.3.4使用模板查詢使用XML文檔定義的查詢模板具有如下格式:

<ROOTxmlns:sql=”urn:schemas-microsoft-com:xml-sql:xsl=’XSLFILENAME’><sql:header><sql:param>..</sql:param><sql:param>..</sql:param></sql:header><sql:query>Sqlstatement(s) </sql:query><sql:xpath-querymapping-schema=”SchemaFileName.xml”> XPathquery </sql:xpath-query> </ROOT>2022/12/28489.3.4使用模板查詢使用XML文檔定義的查詢模板具有9.3.4使用模板查詢第一步:使用模板執(zhí)行SQL簡單查詢。〈?xmlversion=“1.0”encoding=“gb2312”?〉〈圖書清單xmlns:sql=“urn:schemas-microsoft-com:xml-sql”〉〈sql:query〉SELECT書名,作者,出版社

FROM書籍

FORXMLAUTO〈/sql:query〉〈/圖書清單〉2022/12/28499.3.4使用模板查詢第一步:使用模板執(zhí)行SQL簡單查9.3.4使用模板查詢第二步:在模板執(zhí)行存儲過程。在“書籍”數(shù)據(jù)庫中創(chuàng)建如下的存儲過程:CREATEPROCEDUREgetinfoASSelect書名,作者,出版社

from書籍

forxmlauto2022/12/28509.3.4使用模板查詢第二步:在模板執(zhí)行存儲過程。209.3.4使用模板查詢第三步:在模板中創(chuàng)建參數(shù)查詢?!矗縳mlversion=“1.0”encoding=“gb2312”?〉〈圖書清單xmlns:sql=“urn:schemas-microsoft-com:xml-sql”〉〈sql:header〉〈sql:paramname=‘姓名’〉郭勝〈/sql:param〉〈/sql:header〉〈sql:query〉select*from書籍

where作者=@姓名

forxmlauto,elements〈/sql:query〉</圖書清單〉2022/12/28519.3.4使用模板查詢第三步:在模板中創(chuàng)建參數(shù)查詢。29.3.4使用模板查詢下面的URL使用參數(shù)的默認(rèn)值來執(zhí)行查詢:

http://localhost/xmlquery/mytemplate/paramquery.xml在瀏覽器中執(zhí)行結(jié)果如圖9-11所示2022/12/28529.3.4使用模板查詢下面的URL使用參數(shù)的默認(rèn)值來執(zhí)9.3.5使用XPath查詢XPath查詢是使用簡化的XML數(shù)據(jù)架構(gòu)為關(guān)系數(shù)據(jù)創(chuàng)建的XML視圖第一步,使用帶批注的XDR創(chuàng)建XML視圖第二步,使用默認(rèn)屬性映射架構(gòu)建立與數(shù)據(jù)的XPath查詢第三步,使用特定屬性映射架構(gòu)的XPath查詢第四步,返回CDATA節(jié)內(nèi)容2022/12/28539.3.5使用XPath查詢XPath查詢是使用簡化的9.3.4使用模板查詢第三步:在模板中創(chuàng)建參數(shù)查詢。〈?xmlversion=“1.0”encoding=“gb2312”?〉〈圖書清單xmlns:sql=“urn:schemas-microsoft-com:xml-sql”〉〈sql:header〉〈sql:paramname=‘姓名’〉郭勝〈/sql:param〉〈/sql:header〉〈sql:query〉select*from書籍

where作者=@姓名

forxmlauto,elements〈/sql:query〉</圖書清單〉2022/12/28549.3.4使用模板查詢第三步:在模板中創(chuàng)建參數(shù)查詢。29.4XML數(shù)據(jù)庫20世紀(jì)60年代早期稱為前關(guān)系型數(shù)據(jù)庫系統(tǒng)時(shí)期。1970年,E.F.Codd在IBM的SanJose研究實(shí)驗(yàn)室推出了關(guān)系數(shù)據(jù)模型雖然關(guān)系型數(shù)據(jù)庫技術(shù)已經(jīng)相當(dāng)成熟,但其局限性也顯而易見:它能很好地處理所謂的“表格型數(shù)據(jù)”,卻對各種復(fù)雜類型的數(shù)據(jù)無能為力。20世紀(jì)90年代初期開始,人們研究和開發(fā)“面向?qū)ο蟮臄?shù)據(jù)庫系統(tǒng)”,數(shù)據(jù)庫發(fā)展進(jìn)入了后關(guān)系型數(shù)據(jù)庫系統(tǒng)時(shí)期。20世紀(jì)90年代末期出現(xiàn)了XML數(shù)據(jù)庫。數(shù)據(jù)庫管理系統(tǒng)的發(fā)展歷程如圖9-15所示2022/12/28559.4XML數(shù)據(jù)庫20世紀(jì)60年代早期稱為前關(guān)系型數(shù)據(jù)庫圖9-15數(shù)據(jù)庫管理系統(tǒng)發(fā)展

2022/12/2856圖9-15數(shù)據(jù)庫管理系統(tǒng)發(fā)展2022/12/28569.4.1XML和半結(jié)構(gòu)化數(shù)據(jù)

現(xiàn)實(shí)世界中,一些數(shù)據(jù)是完全沒有結(jié)構(gòu)的,如video、audio、image數(shù)據(jù)流。很多數(shù)據(jù)既不是完全沒有結(jié)構(gòu),也不是完全有結(jié)構(gòu)的,如HTML構(gòu)成的Web頁、電子郵件、Latex文檔、生物數(shù)據(jù)庫(如ACeDB)等等。我們把它們稱為半結(jié)構(gòu)化數(shù)據(jù)。與傳統(tǒng)的結(jié)構(gòu)化數(shù)據(jù)相比,半結(jié)構(gòu)化數(shù)據(jù)主要特性是自描述的(即內(nèi)容與結(jié)構(gòu)都包含在數(shù)據(jù)中),它的結(jié)構(gòu)是不固定、不規(guī)則、隱含的,并且是易變化的。由于Web數(shù)據(jù)、數(shù)據(jù)集成、數(shù)據(jù)交換都需要利用半結(jié)構(gòu)化數(shù)據(jù),因此要從數(shù)據(jù)庫角度研究半結(jié)構(gòu)化數(shù)據(jù)的數(shù)據(jù)模型、數(shù)據(jù)模式、數(shù)據(jù)查詢、查詢優(yōu)化。2022/12/28579.4.1XML和半結(jié)構(gòu)化數(shù)據(jù)現(xiàn)實(shí)世界中,一些數(shù)據(jù)是完9.4.1XML和半結(jié)構(gòu)化數(shù)據(jù)XML文檔代表了一個(gè)重要的并且在不斷增長的半結(jié)構(gòu)化數(shù)據(jù)源它同半結(jié)構(gòu)化數(shù)據(jù)有許多共同的性質(zhì),因此半結(jié)構(gòu)化數(shù)據(jù)己有的理論,己有的原型系統(tǒng)可以作為XML研究的基礎(chǔ)XML與經(jīng)典的半結(jié)構(gòu)化數(shù)據(jù)之間也有區(qū)別,使其成為一種獨(dú)特的半結(jié)構(gòu)數(shù)據(jù)類型2022/12/28589.4.1XML和半結(jié)構(gòu)化數(shù)據(jù)XML文檔代表了一個(gè)重要的9.4.2XML數(shù)據(jù)庫的崛起XML本身并不是數(shù)據(jù)庫,從嚴(yán)格的意義上來說,XML僅僅意味著XML文檔加上一些其他的輔助工具,我們可以把整個(gè)XML看成是一個(gè)數(shù)據(jù)庫系統(tǒng),XML文本本身可以看成是數(shù)據(jù)庫中的數(shù)據(jù)區(qū),DTD或者Schemas可以看成是數(shù)據(jù)庫模式設(shè)計(jì),XQL可以看成是數(shù)據(jù)庫查詢語言,SAX或DOM可以看成是數(shù)據(jù)庫處理工具XML數(shù)據(jù)庫就是從數(shù)據(jù)庫的角度來研究以XML格式表達(dá)的Web數(shù)據(jù)。它包括XML數(shù)據(jù)的存儲、查詢語言、模式管理、查詢處理等。

2022/12/28599.4.2XML數(shù)據(jù)庫的崛起XML本身并不是數(shù)據(jù)庫,從嚴(yán)9.4.2XML數(shù)據(jù)庫的崛起與傳統(tǒng)關(guān)系數(shù)據(jù)庫相比,XML數(shù)據(jù)庫具有以下特點(diǎn):(1)XML數(shù)據(jù)庫的數(shù)據(jù)模型可以是樹、圖等層次數(shù)據(jù)模型,而傳統(tǒng)的關(guān)系數(shù)據(jù)庫是以關(guān)系數(shù)據(jù)模型理論為基礎(chǔ)的(2)傳統(tǒng)數(shù)據(jù)庫語言允許對數(shù)據(jù)元素的值進(jìn)行操作,但不能對元素名稱進(jìn)行操作,XML數(shù)據(jù)庫則提供了對標(biāo)簽名稱的操作,并且包括了對路徑的操作2022/12/28609.4.2XML數(shù)據(jù)庫的崛起與傳統(tǒng)關(guān)系數(shù)據(jù)庫相比,XML9.4.2XML數(shù)據(jù)庫的崛起(3)XML數(shù)據(jù)庫的顯示豐富多樣,其多樣性由XSL指定,而傳統(tǒng)關(guān)系數(shù)據(jù)庫的顯示方式相對簡單(4)傳統(tǒng)關(guān)系數(shù)據(jù)庫只能采用SQL查詢語言,而XML文檔查詢語言包括Xquery、Xpath、XQL、XML-QL、QUILT等(5)XML數(shù)據(jù)庫的模式主要由DTD、XMLSchema確定,而傳統(tǒng)關(guān)系數(shù)據(jù)庫由數(shù)據(jù)字典決定2022/12/28619.4.2XML數(shù)據(jù)庫的崛起(3)XML數(shù)據(jù)庫的顯示豐富9.4.2XML數(shù)據(jù)庫的崛起但是,畢竟關(guān)系數(shù)據(jù)庫經(jīng)過了20多年發(fā)展,其技術(shù)和市場都非常成熟,我們無法忽視關(guān)系數(shù)據(jù)庫的優(yōu)勢所在:技術(shù)成熟、應(yīng)用廣泛;數(shù)據(jù)管理能力強(qiáng)(包括存儲、檢索、修改等);數(shù)據(jù)安全程度高;事務(wù)處理穩(wěn)定可靠;并發(fā)訪問機(jī)制完善等。2022/12/28629.4.2XML數(shù)據(jù)庫的崛起但是,畢竟關(guān)系數(shù)據(jù)庫經(jīng)過了29.4.2XML數(shù)據(jù)庫的崛起XML數(shù)據(jù)庫的主要缺點(diǎn)在于:(1)XML數(shù)據(jù)庫的檢索是基于節(jié)點(diǎn)的檢索,存放大量甚至海量數(shù)據(jù)的XML文件會(huì)導(dǎo)致檢索速度極低。XML的修改也是基于節(jié)點(diǎn)的,所以修改效率也很低。(2)XML數(shù)據(jù)庫的解析手段有缺陷。在目前的兩種解析機(jī)制中,SAX方式是基于文件的解析,速度慢;DOM方式是基于內(nèi)存的方式,資源消耗極大。(3)XML的安全性及并發(fā)操作機(jī)制是需要重點(diǎn)解決的問題之一。2022/12/28639.4.2XML數(shù)據(jù)庫的崛起XML數(shù)據(jù)庫的主要缺點(diǎn)在于:9.4.2XML數(shù)據(jù)庫的崛起XML數(shù)據(jù)庫不會(huì)代替關(guān)系數(shù)據(jù)庫,這種可能性非常小,但它一定能夠“占領(lǐng)”某些領(lǐng)域。XML數(shù)據(jù)庫可以解決關(guān)系數(shù)據(jù)庫不能解決的問題,從長遠(yuǎn)來看,XML數(shù)據(jù)庫發(fā)展?jié)摿Σ蝗葜靡伞?022/12/28649.4.2XML數(shù)據(jù)庫的崛起XML數(shù)據(jù)庫不會(huì)代替關(guān)系數(shù)據(jù)9.5小結(jié)著重講解了對XML數(shù)據(jù)庫的訪問技術(shù)和異構(gòu)數(shù)據(jù)庫之間通過轉(zhuǎn)換成XML實(shí)現(xiàn)互訪介紹了SQLSERVER對XML數(shù)據(jù)的支持簡要介紹了XML數(shù)據(jù)庫2022/12/28659.5小結(jié)著重講解了對XML數(shù)據(jù)庫的訪問技術(shù)和異構(gòu)數(shù)王紅第9章

XML與數(shù)據(jù)庫

2022/12/2866王紅2022/12/281主要內(nèi)容第9章XML與數(shù)據(jù)庫9.1借助XML文檔實(shí)現(xiàn)數(shù)據(jù)庫之間數(shù)據(jù)互換

9.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射

9.3SQLServer對XML的支持

9.4XML數(shù)據(jù)庫

9.5小

結(jié)

2022/12/2867主要內(nèi)容第9章XML與數(shù)據(jù)庫2022/12/282當(dāng)存在大量數(shù)據(jù)需要處理分析的話,最好是把這些數(shù)據(jù)放到數(shù)據(jù)庫中幾乎所有大型應(yīng)用系統(tǒng)都是和數(shù)據(jù)庫相關(guān)聯(lián)的,所以如果XML需要在這些領(lǐng)域大展宏圖的話,必須要和數(shù)據(jù)庫相聯(lián)系

2022/12/2868當(dāng)存在大量數(shù)據(jù)需要處理分析的話,最好是把這些數(shù)據(jù)放到數(shù)據(jù)庫中9.1借助XML文檔實(shí)現(xiàn)數(shù)據(jù)庫之間數(shù)據(jù)互換

XML提供了一種連接關(guān)系數(shù)據(jù)庫和面向?qū)ο髷?shù)據(jù)庫以及其他數(shù)據(jù)庫管理系統(tǒng)之間的紐帶

關(guān)系數(shù)據(jù)庫和面向?qū)ο髷?shù)據(jù)庫首先需要將數(shù)據(jù)從數(shù)據(jù)庫中提取出來,經(jīng)過轉(zhuǎn)換或直接以XML數(shù)據(jù)形式發(fā)布到網(wǎng)上(局域網(wǎng)或Internet網(wǎng)),然后相互交換數(shù)據(jù),經(jīng)應(yīng)用層系統(tǒng)處理后在轉(zhuǎn)存入庫

開發(fā)一個(gè)訪問數(shù)據(jù)庫的XML應(yīng)用系統(tǒng)需要同時(shí)借助XML編程接口和數(shù)據(jù)庫編程接口,前者用于對XML文檔的解析、定位和查詢,后者則是用于訪問數(shù)據(jù)庫

2022/12/28699.1借助XML文檔實(shí)現(xiàn)數(shù)據(jù)庫之間數(shù)據(jù)互換XML提供了XML和數(shù)據(jù)庫XML文檔是一個(gè)數(shù)據(jù)集合優(yōu)點(diǎn)自我描述性可移植性以樹結(jié)構(gòu)描述數(shù)據(jù)提供部分?jǐn)?shù)據(jù)庫的功能缺點(diǎn)數(shù)據(jù)存取慢缺少數(shù)據(jù)庫的功能2022/12/2870XML和數(shù)據(jù)庫XML文檔是一個(gè)數(shù)據(jù)集合2022/12/2XML和數(shù)據(jù)庫

XML文檔在數(shù)據(jù)量較小和用戶較少的環(huán)境中可以當(dāng)作數(shù)據(jù)庫使用本地XML數(shù)據(jù)庫專門設(shè)計(jì)用于存儲XML文檔的數(shù)據(jù)庫2022/12/2871XML和數(shù)據(jù)庫XML文檔在數(shù)據(jù)量較小和用戶較少的環(huán)境中可9.1.1將XML數(shù)據(jù)插入數(shù)據(jù)庫

將XML數(shù)據(jù)插入數(shù)據(jù)庫的步驟:使用Class.forName()方法加載缺省驅(qū)動(dòng)器使用DriverManager對象的getConnection()方法建立數(shù)據(jù)庫連接使用Connection對象創(chuàng)建Statement對象將已解析的XML文檔放在Document對象中使用getElementsByTagName()方法檢索其元素使用Insert語句將數(shù)據(jù)插入數(shù)據(jù)庫2022/12/28729.1.1將XML數(shù)據(jù)插入數(shù)據(jù)庫將XML數(shù)據(jù)插入數(shù)將XML中的數(shù)據(jù)插入數(shù)據(jù)庫DocumentBuilderFactoryDocumentBuilder

DocumentNodeListElementNode2022/12/2873將XML中的數(shù)據(jù)插入數(shù)據(jù)庫DocumentBuilderFa實(shí)例下面例xml2db.java,將candidate.xml文檔中的數(shù)據(jù)存儲到一個(gè)ACCESS數(shù)據(jù)庫people中表的結(jié)構(gòu)如圖9-1所示

2022/12/2874實(shí)例下面例xml2db.java,將candidate.xm實(shí)例importjava.sql.*;importjavax.xml.parsers.*;importorg.w3c.dom.*;publicclassxml2db{staticConnectioncon;staticStringnm,add,tel,fax,email,sql;publicstaticvoidmain(Stringargs[]){try{

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");con=DriverManager.getConnection("jdbc:odbc:people","","");Statementstmt=con.createStatement();2022/12/2875實(shí)例importjava.sql.*;2022/12/28實(shí)例(續(xù))

DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=factory.newDocumentBuilder();Documentdoc=builder.parse("candidate.xml");NodeListnl=doc.getElementsByTagName("PERSON");for(inti=0;i<nl.getLength();i++){Elementnode=(Element)nl.item(i);Stringnm=node.getElementsByTagName(“NAME").item(0).

getFirstChild().getNodeValue();……sql="insertintopeoplevalues(\'"+nm+"\',\'"+add+"\',\'"+tel+"\',\'"+fax+"\',\'"+email+"\')";intret=stmt.executeUpdate(sql);}stmt.close();con.close();}catch(Exceptione){e.printStackTrace();}}}運(yùn)行結(jié)果如圖9-2所示2022/12/2876實(shí)例(續(xù))DocumentBuilderFactoryf圖9-2xml2db.java運(yùn)行結(jié)果2022/12/2877圖9-2xml2db.java運(yùn)行結(jié)果2022/12/9.1.2由數(shù)據(jù)庫中數(shù)據(jù)生成XML文檔

從數(shù)據(jù)庫檢索數(shù)據(jù)生成XML的步驟:將文件頭和根元素寫入文件使用Class.forName()方法加載缺省驅(qū)動(dòng)程序使用DriverManager對象的getConnection()方法建立數(shù)據(jù)庫連接使用Connection對象創(chuàng)建Statement對象使用Statement對象的executeQuery方法執(zhí)行查詢從數(shù)據(jù)庫提取數(shù)據(jù)并將其插入文件中將結(jié)束元素寫入文件2022/12/28789.1.2由數(shù)據(jù)庫中數(shù)據(jù)生成XML文檔從數(shù)據(jù)庫檢索數(shù)據(jù)生用數(shù)據(jù)庫中的數(shù)據(jù)生成XML文檔DocumentBuilderFactoryDocumentBuilder

DocumentNode2022/12/2879用數(shù)據(jù)庫中的數(shù)據(jù)生成XML文檔DocumentBuilder實(shí)例下面舉例Sdudents.java,將一個(gè)ACCESS數(shù)據(jù)庫students中數(shù)據(jù)存儲到students.xml文檔中表的內(nèi)容如圖9-3所示2022/12/2880實(shí)例下面舉例Sdudents.java,將一個(gè)ACCESS數(shù)實(shí)例importjava.sql.*;importjava.io.*;importjavax.xml.parsers.*;importjavax.xml.transform.dom.*;importjavax.xml.transform.stream.*;importjavax.xml.transform.*;importorg.w3c.dom.*;importorg.xml.sax.*; Filefl=newFile("students.xml"); fl.createNewFile(); FileWriterfw=newFileWriter(fl); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connectioncon=DriverManager.getConnection("jdbc:odbc:aaa","",""); Statementst=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSetrs=st.executeQuery("select*fromstudents");2022/12/2881實(shí)例importjava.sql.*;2022/12/28實(shí)例while(rs.next()) { fw.write("<student>"); fw.write("<stud_id>"); Stringstud_id=rs.getString("Stud_id"); fw.write(stud_id); fw.write("</stud_id>"); fw.write("<stud_namme>"); Stringstud_name=rs.getString("Stud_name"); fw.write(stud_name); fw.write("</stud_name>"); fw.write("</student>");}運(yùn)行結(jié)果如圖9-4所示2022/12/2882實(shí)例while(rs.next())2022/12/2817圖9-4Sdudents.java運(yùn)行結(jié)果

2022/12/2883圖9-4Sdudents.java運(yùn)行結(jié)果2022/12實(shí)例下面舉例db2xml.java,用org.apache.crimson.tree包中的XmlDocument類的write()方法將一個(gè)ACCESS數(shù)據(jù)庫people中數(shù)據(jù)存儲到candidate1.xml文檔中的表的內(nèi)容如圖9-2所示程序運(yùn)行結(jié)果使candidate1.xml與前面用到的candidate.xml完全相同2022/12/2884實(shí)例下面舉例db2xml.java,用org.apache.實(shí)例importjava.sql.*;importjavax.xml.parsers.*;importorg.apache.crimson.tree.*;importorg.w3c.dom.*;importjava.io.*;publicclassdb2xml{staticStringnm,add,tel,fax,email,sql;staticStringurl="jdbc:oracle:oci8:@oradb";publicstaticvoidmain(Stringargs[]){Elementpeople,person,name,address,tel,fax,email;try{

Class.forName("oracle.jdbc.driver.OracleDriver");Connectioncon=DriverManager.getConnection(url,"scott","tiger");Statementstmt=con.createStatement();ResultSetresults=stmt.executeQuery("SELECT*FROMpeople");DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=dbf.newDocumentBuilder();Documentdoc=builder.newDocument();people=doc.createElement("PEOPLE");2022/12/2885實(shí)例importjava.sql.*;2022/12/28實(shí)例(續(xù))

while(results.next()){person=doc.createElement("PERSON");people.appendChild(person);name=doc.createElement("NAME");name.appendChild(doc.createTextNode(results.getString("NAME")));person.appendChild(name);……}doc.appendChild(people);((XmlDocument)doc).write(System.out);}catch(Exceptione){e.printStackTrace();}}}2022/12/2886實(shí)例(續(xù))while(results.next()){9.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射把數(shù)據(jù)存儲到數(shù)據(jù)庫中的時(shí)候,需要拋棄一個(gè)文檔的很多信息比如它的名稱和DTD同樣,當(dāng)從數(shù)據(jù)庫中提取數(shù)據(jù)的時(shí)候,產(chǎn)生的XML文檔通常不包含CDATA或者是實(shí)體使用的說明,而且節(jié)點(diǎn)下元素的排列位置只和數(shù)據(jù)庫中記錄的順序位置一致一個(gè)XML文檔存儲到數(shù)據(jù)庫中,再由該數(shù)據(jù)庫生成此XML文檔,這前后兩個(gè)文檔格式幾乎不可能完全一樣2022/12/28879.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射把數(shù)據(jù)存儲到數(shù)據(jù)庫中的時(shí)9.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射為了在數(shù)據(jù)庫和XML文檔之間傳遞數(shù)據(jù),必須在數(shù)據(jù)庫數(shù)據(jù)模型和XML數(shù)據(jù)模型產(chǎn)生映射關(guān)系數(shù)據(jù)庫數(shù)據(jù)是結(jié)構(gòu)化數(shù)據(jù)XML文檔屬于半結(jié)構(gòu)化的數(shù)據(jù)將結(jié)構(gòu)化數(shù)據(jù)與非結(jié)構(gòu)化數(shù)據(jù)進(jìn)行轉(zhuǎn)換的時(shí)候,關(guān)鍵問題是建立不同結(jié)構(gòu)層次之間的映射關(guān)系,及如何保留他們的語義約束信息,即如何將關(guān)系數(shù)據(jù)庫表達(dá)的結(jié)構(gòu)與約束映射為XML。映射可以有兩類:模板驅(qū)動(dòng)和模型驅(qū)動(dòng)。2022/12/28889.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射為了在數(shù)據(jù)庫和XML文檔9.2.1基于模板驅(qū)動(dòng)的映射基于模板的映射方法并不事先定義好XML文檔與其他數(shù)據(jù)之間的映射關(guān)系,而是在XML文檔中嵌入帶參數(shù)的SQL命令。這些命令在轉(zhuǎn)換過程中被系統(tǒng)所識別和執(zhí)行,執(zhí)行的結(jié)果被替換到指令所在的位置,從而生成目標(biāo)XML文檔.并用數(shù)據(jù)傳輸諸如中間件等實(shí)體軟件進(jìn)行處理

2022/12/28899.2.1基于模板驅(qū)動(dòng)的映射基于模板的映射方法并不事先定9.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射比如,考慮下面的模板:<?xmlversion="1.0"?>

<FlightInfo>

<Intro>Thefollowingflightshaveavailableseats:</Intro>

<SelectStmt>SELECTAirline,FltNumber,Depart,ArriveFROMFlights</SelectStmt>

<Conclude>W(wǎng)ehopeoneofthesemeetsyourneeds</Conclude>

</FlightInfo>2022/12/28909.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射比如,考慮下面的模板:9.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射當(dāng)用數(shù)據(jù)傳輸中間件進(jìn)行處理的時(shí)候,每一個(gè)SELECT語句都會(huì)被它的結(jié)果所代替,用XML格式化形式表現(xiàn)為:<?xmlversion="1.0"?>

<FlightInfo>

<Intro>Thefollowingflightshaveavailableseats:</Intro>

<Flights>

<Row>

<Airline>ACME</Airline>

<FltNumber>123</FltNumber>

<Depart>Dec12,199813:43</Depart>

<Arrive>Dec13,199801:21</Arrive></Row>

</Flights>

<Conclude>W(wǎng)ehopeoneofthesemeetsyourneeds</Conclude>

</FlightInfo>2022/12/28919.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射當(dāng)用數(shù)據(jù)傳輸中間件進(jìn)行處9.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射基于模板轉(zhuǎn)換的流程圖:2022/12/28929.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射基于模板轉(zhuǎn)換的流程圖:9.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射優(yōu)點(diǎn):基于模板驅(qū)動(dòng)的映射可以是相當(dāng)靈活的允許你把結(jié)果集放到XML文檔的任何位置同時(shí)可以對SELECT語句設(shè)置參數(shù)并且可以使用for循環(huán)語句和if條件語句等。2022/12/28939.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射優(yōu)點(diǎn):2022/12/29.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射缺點(diǎn):基于模板驅(qū)動(dòng)的映射是一種淺層映射以XML內(nèi)嵌的SQL執(zhí)行的數(shù)據(jù)結(jié)果集為依據(jù),不涉及數(shù)據(jù)庫賴以存在的關(guān)系模式舍棄了關(guān)系模式的種種約束條件只適合于將關(guān)系數(shù)據(jù)庫的數(shù)據(jù)轉(zhuǎn)換為XML文檔2022/12/28949.2文檔結(jié)構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)的映射缺點(diǎn):2022/12/29.2.2基于模型驅(qū)動(dòng)的映射就是把數(shù)據(jù)從數(shù)據(jù)庫傳送到XML文檔是用一個(gè)具體的模型實(shí)現(xiàn)的。這樣,用戶可以將相應(yīng)的格式直接映射到模型上,從而數(shù)據(jù)庫中數(shù)據(jù)以各種形式展示出來。在XML文檔中,兩種模型是很常見的:表格模型和數(shù)據(jù)專用對象模型。2022/12/28959.2.2基于模型驅(qū)動(dòng)的映射就是把數(shù)據(jù)從數(shù)據(jù)庫傳送到XM1.表格模型把XML文檔表示為一個(gè)單一的表格或者是表格的集合,這樣數(shù)據(jù)庫中數(shù)據(jù)都展示為固定模式。一般地,數(shù)據(jù)庫中數(shù)據(jù)可以用如下的形式表示:<database>

<table>

<row>

<column1>...</column1>

<column2>...</column2>

...

</row>

...

</table>

...

</database>2022/12/28961.表格模型把XML文檔表示為一個(gè)單一的表格或者是表格的集1.表格模型這里關(guān)鍵字“table”在把數(shù)據(jù)從數(shù)據(jù)庫傳遞到XML文檔的時(shí)候,表示一個(gè)單一的結(jié)果集。但是,當(dāng)結(jié)果集合不只一個(gè)的時(shí)候,或者當(dāng)XML文檔包括多個(gè)復(fù)雜嵌套的時(shí)候,這種傳遞方式就不能適應(yīng)了。2022/12/28971.表格模型這里關(guān)鍵字“table”在把數(shù)據(jù)從數(shù)據(jù)庫傳遞到2.數(shù)據(jù)專用的對象模型把一個(gè)XML文檔表示為由數(shù)據(jù)對象構(gòu)成的樹,每一個(gè)元素類型和對象相對應(yīng)。主要在面向?qū)ο蠛蛯哟螖?shù)據(jù)庫中使用,通過傳統(tǒng)的關(guān)系-對象模型也可以映射到關(guān)系數(shù)據(jù)庫中。2022/12/28982.數(shù)據(jù)專用的對象模型把一個(gè)XML文檔表示為由數(shù)據(jù)對象構(gòu)成2.數(shù)據(jù)專用的對象模型基于模型的轉(zhuǎn)換方法由于有了數(shù)據(jù)模型的支持,可以完成關(guān)系數(shù)據(jù)庫數(shù)據(jù)和XML數(shù)據(jù)之間的雙向轉(zhuǎn)換。但是模型的引入也使得XML文檔的結(jié)構(gòu)受到了一些限制,一個(gè)XML文檔必須符合模型所規(guī)定的結(jié)構(gòu),才能將XML文檔轉(zhuǎn)換成其他類型的數(shù)據(jù),而從其他類型數(shù)據(jù)轉(zhuǎn)換得到的XML文檔也具有某種結(jié)構(gòu)特點(diǎn)?;谀P偷霓D(zhuǎn)換方法的關(guān)鍵在于設(shè)計(jì)一個(gè)靈活的映射模型,為了更好的支持其雙向映射的特點(diǎn),這個(gè)映射模型必須是易于“讀懂”的,易于操縱的,能夠很好的表達(dá)關(guān)系數(shù)據(jù)庫的各種約束。模型驅(qū)動(dòng)的映射是一種深層映射,是模式和模式之間的映射。2022/12/28992.數(shù)據(jù)專用的對象模型基于模型的轉(zhuǎn)換方法由于有了數(shù)據(jù)模型的2.數(shù)據(jù)專用的對象模型在XML和數(shù)據(jù)庫之間進(jìn)行數(shù)據(jù)轉(zhuǎn)化的時(shí)候,需要考慮兩個(gè)過程:一個(gè)是從數(shù)據(jù)庫模式中產(chǎn)生DTD,另外一個(gè)是根據(jù)DTD生成數(shù)據(jù)庫模式.從一個(gè)DTD中生成一個(gè)關(guān)系模式的步驟如下:(1)對每一個(gè)元素,產(chǎn)生一個(gè)表和一個(gè)主鍵列。(2)對每一個(gè)有混合內(nèi)容的元素,產(chǎn)生一個(gè)獨(dú)立的表格,用來存儲PCDATA,并通過父表的主鍵和父表相聯(lián)。(3)對元素類型中的每一個(gè)單一值的屬性,對具有只有PCDATA內(nèi)容的子元素(該子元素按順序出現(xiàn)),產(chǎn)生一個(gè)單獨(dú)的列,如果子元素類型或者值是可以選擇的話,該列就應(yīng)該可以允許為NULL類型。2022/12/281002.數(shù)據(jù)專用的對象模型在XML和數(shù)據(jù)庫之間進(jìn)行數(shù)據(jù)轉(zhuǎn)化的時(shí)2.數(shù)據(jù)專用的對象模型(4)對有多個(gè)值的屬性和可以出現(xiàn)多次的子元素(該子元素PCDATA)的話,需要?jiǎng)?chuàng)建一個(gè)單獨(dú)的表來存儲這些值,并通過父表的主鍵和父表相聯(lián)。(5)對每一個(gè)包含元素或者混合內(nèi)容的子元素來說,通過父表的主鍵把父元素和子元素聯(lián)接起來。從一個(gè)關(guān)系數(shù)據(jù)庫模式構(gòu)建DTD步驟如下:(1)對每一個(gè)表,創(chuàng)建一個(gè)元素。(2)對表中的每一列,創(chuàng)建一個(gè)屬性或者是一個(gè)只有PCDATA內(nèi)容的子元素。(3)根據(jù)表中的每一主鍵/外鍵關(guān)系,創(chuàng)建該表元素的子元素。2022/12/281012.數(shù)據(jù)專用的對象模型(4)對有多個(gè)值的屬性和可以出現(xiàn)多次9.3SQLServer對XML的支持在SQLServer中實(shí)現(xiàn)了對XML使用HTTP執(zhí)行簡單查詢、應(yīng)用XSL樣式單的查詢、使用模板查詢、使用XPath查詢。SQLServer2000的XML功能主要包括如下內(nèi)容:許用戶通過網(wǎng)絡(luò)查詢SQLServer中數(shù)據(jù),并以XML格式獲得返回結(jié)果。持XDR(簡化的XML_DATA)架構(gòu),并可以使用XPath查詢XDR架構(gòu)。允許查詢和寫入XML數(shù)據(jù)。使用SELECT語句和FORXML字句檢索XML數(shù)據(jù)。使用XPath查詢語言檢索XML數(shù)據(jù)。增強(qiáng)了MicrosoftSQLServer2000OLEDB提供程序,從而可以使用XML文檔作為命令文本并以流的形式返回結(jié)果集。2022/12/281029.3SQLServer對XML的支持在SQLSer9.3.1配置IIS服務(wù)器支持SQLXML在Windows2000中,有自帶的IIS5.0。如果是WindowsNT,則在最新的serverpack中包含了新的IIS。IIS服務(wù)器建立了用戶和SQLServer之間的橋梁。用戶通過瀏覽器發(fā)出URL查詢請求,IIS首先接收到查詢結(jié)果,然后將請求通過OLED

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論