數(shù)據(jù)庫課件講義整理_第1頁
數(shù)據(jù)庫課件講義整理_第2頁
數(shù)據(jù)庫課件講義整理_第3頁
數(shù)據(jù)庫課件講義整理_第4頁
數(shù)據(jù)庫課件講義整理_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

工程培訓(xùn)XML和數(shù)據(jù)庫工程培訓(xùn)XML和數(shù)據(jù)庫GR-XML培訓(xùn)1回憶-1XMLDSO是一個(gè)MicrosoftActiveX控件,嵌入到MicrosoftInternetExplorer中DSO有助于格式化數(shù)據(jù)并將這些數(shù)據(jù)顯示在HTML頁面上DSO可用于從外部XML文檔或從嵌入到HTML文檔的XML數(shù)據(jù)中提取數(shù)據(jù)<xml>和</xml>標(biāo)簽之間綁定的XML數(shù)據(jù)稱為XML數(shù)據(jù)島回憶-1XMLDSO是一個(gè)MicrosoftA2回憶-2可以通過在HTML文檔中使用<xml>標(biāo)簽或通過使用JavaScript創(chuàng)立函數(shù),將外部XML文檔鏈接到HTML文檔可以使用datasrc和datafld屬性從數(shù)據(jù)島中提取數(shù)據(jù)DSO可用于使用樣式表中定義的樣式來顯示XML數(shù)據(jù)島的數(shù)據(jù)回憶-2可以通過在HTML文檔中使用<xml>標(biāo)簽3本章知識(shí)點(diǎn)XML的數(shù)據(jù)庫應(yīng)用領(lǐng)域XML導(dǎo)入數(shù)據(jù)庫XML導(dǎo)出數(shù)據(jù)庫本章知識(shí)點(diǎn)XML的數(shù)據(jù)庫應(yīng)用領(lǐng)域4實(shí)驗(yàn)——<將關(guān)于員工和客戶信息的XML導(dǎo)入數(shù)據(jù)庫><?xmlversion="1.0"encoding="UTF-8"?><company> <employee> <personid="DE001"> <name>張三</name> <age>40</age> <pay>1800</pay> </person> <personid="DE002"> <name>小王</name> <age>20</age> <pay>1500</pay> </person> <personid="DE003"> <name>小周</name> <age>30</age> <pay>2000</pay> </person> </employee>將如下文檔中的員工信息解析出來存入company數(shù)據(jù)庫中的employee表中,將顧客信息解析出來存入company數(shù)據(jù)庫中的buyer表中:員工信息

實(shí)驗(yàn)——<將關(guān)于員工和客戶信息的XML導(dǎo)入數(shù)據(jù)庫><?x5 <buyer> <personid="BY001"> <name>Marry</name> <age>33</age> <phone>lt;/phone> <email>marrymm@163.com</email> </person> <personid="BY002"> <name>Sandenly</name> <age>20</age> <phone>lt;/phone> <email>sandenlygg@163.com</email> </person> </buyer></company>顧客信息 <buyer>顧客信息6XML的應(yīng)用領(lǐng)域XML的應(yīng)用可以分為以下幾個(gè)方面:應(yīng)用于將大量運(yùn)算分布在客戶端進(jìn)行,以減少服務(wù)器的負(fù)載應(yīng)用于數(shù)據(jù)轉(zhuǎn)換應(yīng)用于將同一數(shù)據(jù)以不同的面貌展現(xiàn)給不同的用戶XML應(yīng)用于網(wǎng)絡(luò)代理XML成為一種各種程序都能自動(dòng)理解和處理數(shù)據(jù)的規(guī)范??蛻艨梢愿鶕?jù)自己的需求選擇和制作不同的應(yīng)用程序來處理數(shù)據(jù),而服務(wù)器只須發(fā)出同一個(gè)XML文件

使用XML可以使得數(shù)據(jù)源與顯示分離。這一應(yīng)用將會(huì)使得網(wǎng)絡(luò)用戶界面趨向個(gè)性化、風(fēng)格化。同一個(gè)XML可以被多個(gè)用戶進(jìn)行編輯、增減以適應(yīng)該用戶的需要,類似于設(shè)置權(quán)限。XML的應(yīng)用領(lǐng)域XML的應(yīng)用可以分為以下幾個(gè)方面:應(yīng)用于7XML導(dǎo)出數(shù)據(jù)庫XML導(dǎo)出單個(gè)表的數(shù)據(jù)

以SQLServer數(shù)據(jù)庫為例,在一個(gè)名為“mydb”的數(shù)據(jù)庫中,有一張關(guān)于person信息的表“mytable”,字段信息和數(shù)據(jù)信息如下:字段信息表數(shù)據(jù)信息表XML導(dǎo)出數(shù)據(jù)庫XML導(dǎo)出單個(gè)表的數(shù)據(jù)以SQLServ8importjava.sql.*;importjavax.xml.parsers.*;importorg.apache.crimson.tree.*;importorg.w3c.dom.*;importjava.io.*;publicclassDBtoXML1{ staticConnectioncon; publicstaticvoidmain(Stringargs[]){ Documentdoc; try{ //建立數(shù)據(jù)庫連接 Stringclassforname= "com.microsoft.jdbc.sqlserver.SQLServerDriver"; Stringurl="jdbc:microsoft:sqlserver://localhost:1433;" +"databasename=mydb"; Class.forName(classforname); Connectioncon=DriverManager.getConnection(url,"sa",""); Statementsta=con.createStatement(); ResultSetresult=sta.executeQuery( "SELECT*FROMmytable"); //獲取Document實(shí)例 DocumentBuilderFactorydbf= DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=dbf.newDocumentBuilder(); doc=builder.newDocument();importjava.sql.*;9 //創(chuàng)建根節(jié)點(diǎn) Elementpeople=doc.createElement("people"); while(result.next()){ Elementperson=doc.createElement("person"); people.appendChild(person); Elementname=doc.createElement("name"); /*獲取數(shù)據(jù)庫中name字段的值, 并作為xml文檔中name元素的字符數(shù)據(jù)*/ name.appendChild(doc.createTextNode( result.getString("name"))); person.appendChild(name); Elementage=doc.createElement("age"); age.appendChild(doc.createTextNode( result.getInt("age")+"")); person.appendChild(age); Elementaddr=doc.createElement("address"); addr.appendChild(doc.createTextNode( result.getString("address"))); person.appendChild(addr); Elementphone=doc.createElement("phone"); phone.appendChild(doc.createTextNode( result.getString("phone"))); person.appendChild(phone); } //創(chuàng)建根節(jié)點(diǎn)10 doc.appendChild(people); //將dom樹導(dǎo)出到文件中 ((XmlDocument)doc).write( newFileOutputStream(newFile("person.xml"))); }catch(Exceptione){e.printStackTrace();} }}程序運(yùn)行完成后,使用記事本打開“person.xml”文件 doc.appendChild(people);程序運(yùn)11XML導(dǎo)出多個(gè)表關(guān)聯(lián)的數(shù)據(jù)如“mydb”庫中有表“mytable1”和“mytable2”,他們之間通過外鍵“personid”而相約束,如下:表mytable1數(shù)據(jù)信息表mytable2字段信息表mytable1字段信息表mytable2字段信息XML導(dǎo)出多個(gè)表關(guān)聯(lián)的數(shù)據(jù)如“mydb”庫中有表“myt12importjava.sql.*;importjavax.xml.parsers.*;importorg.apache.crimson.tree.*;importorg.w3c.dom.*;importjava.io.*;publicclassDBtoXML2{

staticConnectioncon; publicstaticvoidmain(Stringargs[]){ Documentdoc; try{ //連接數(shù)據(jù)庫 Stringclassforname="com.microsoft.jdbc.sqlserver.SQLServerDriver"; Stringurl="jdbc:microsoft:sqlserver://localhost:1433;" +"databasename=mydb"; Class.forName(classforname); Connectioncon=DriverManager.getConnection(url,"sa",""); Statementsta=con.createStatement(); ResultSetresult=sta.executeQuery( "SELECT*FROMmytable1"); //獲取Document實(shí)例 DocumentBuilderFactorydbf= DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=dbf.newDocumentBuilder(); doc=builder.newDocument(); Elementpeople=doc.createElement("people");importjava.sql.*;13 while(result.next()){ Elementperson=doc.createElement("person"); Stringstr=result.getString("personid"); person.setAttribute("id",str); people.appendChild(person); Elementusername=doc.createElement("username"); username.appendChild( doc.createTextNode(result.getString("username"))); person.appendChild(username); Elementpass=doc.createElement("password"); pass.appendChild( doc.createTextNode(result.getString("password"))); person.appendChild(pass); //查詢表mytable2并向XML文檔中添加元素和字符數(shù)據(jù) ResultSetrs=con.createStatement().executeQuery( "SELECT*FROMmytable2" +"wherepersonid='"+str+"'"); while(rs.next()){ Elementuname=doc.createElement("uname"); uname.appendChild( doc.createTextNode(rs.getString("uname"))); person.appendChild(uname); Elementage=doc.createElement("age"); age.appendChild( doc.createTextNode(rs.getInt("age")+"")); person.appendChild(age); while(result.next()){14 Elementaddr=doc.createElement("address"); addr.appendChild( doc.createTextNode(rs.getString("address"))); person.appendChild(addr); Elementphone=doc.createElement("phone"); phone.appendChild( doc.createTextNode(rs.getString("phone"))); person.appendChild(phone); } } doc.appendChild(people); ((XmlDocument)doc).write(newFileOutputStream(newFile("person2.xml"))); }catch(Exceptione){e.printStackTrace();} } }程序運(yùn)行完成后用記事本打開person2.xml Elementaddr=doc.createEl15XML導(dǎo)入數(shù)據(jù)庫將簡單的XML文檔導(dǎo)入數(shù)據(jù)庫

<?xmlversion="1.0"encoding="UTF-8"?> <people> <personid="a001"> <username>aa</username> <password>12345</password> <uname>張三</uname> <age>20</age> <address>北京</address> <phone>12461238</phone> </person> <personid="a002"> <username>bb</username> <password>987562</password> <uname>李四</uname> <age>22</age> <address>北京</address> <phone>98421354</phone> </person> </people>需要導(dǎo)入數(shù)據(jù)庫的XML文檔person.xmlXML導(dǎo)入數(shù)據(jù)庫將簡單的XML文檔導(dǎo)入數(shù)據(jù)庫<?xmlv16文檔中有多個(gè)“person”元素,每個(gè)“person”元素包括一個(gè)屬性和六個(gè)子元素,而這六個(gè)子元素除了有字符數(shù)據(jù)外,并不包含其他的任何子元素。經(jīng)過分析,可以考慮將“person”元素對(duì)應(yīng)到數(shù)據(jù)庫中的一個(gè)表,而把它所包括的屬性和子元素作為該表的字段,如下:“person”表的字段信息

文檔中有多個(gè)“person”元素,每個(gè)“person”元素包17importjava.sql.*;importjavax.xml.parsers.*;importorg.apache.crimson.tree.*;importorg.w3c.dom.*;importjava.io.*;publicclassXMLtoDB1{ publicstaticvoidmain(Stringargs[]){ Stringid,username,password,uname,address,phone,sql,agestr; intage; try{ //建立數(shù)據(jù)庫連接 Stringclassforname= "com.microsoft.jdbc.sqlserver.SQLServerDriver"; Stringurl= "jdbc:microsoft:sqlserver://localhost:1433;" +"databasename=mydb"; Class.forName(classforname); Connectioncon=DriverManager.getConnection(url,"sa",""); //獲取Document實(shí)例 DocumentBuilderFactoryfactory= DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=factory.newDocumentBuilder(); Documentdoc=builder.parse( newFileInputStream(newFile("person.xml"))); importjava.sql.*;18 NodeListnodes=doc.getElementsByTagName("person"); for(inti=0;i<nodes.getLength();i++){ Elementnode=(Element)nodes.item(i); id=node.getAttributes().getNamedItem("id").getNodeValue(); username=node.getElementsByTagName("username"). item(0).getFirstChild().getNodeValue(); password=node.getElementsByTagName("password"). item(0).getFirstChild().getNodeValue(); uname=node.getElementsByTagName("uname"). item(0).getFirstChild().getNodeValue(); agestr=node.getElementsByTagName("age"). item(0).getFirstChild().getNodeValue(); age=Integer.parseInt(agestr); address=node.getElementsByTagName("address"). item(0).getFirstChild().getNodeValue(); phone=node.getElementsByTagName("phone"). item(0).getFirstChild().getNodeValue(); //向數(shù)據(jù)庫中添加數(shù)據(jù) sql="insertintopersonvalues('"+id+"','"+username +"','"+password+"',"+"'"+uname+"','"+age +"','"+address+"','"+phone+"')"; con.createStatement().executeUpdate(sql); } }catch(Exceptione){e.printStackTrace();} }} NodeListnodes=doc.getEleme19將XML映射到數(shù)據(jù)庫`主要形式有:基于對(duì)象的映射

基于表的映射

基于表的映射

所謂基于表的映射是指可以把文檔看成一個(gè)單一的表或單一的組表。將XML映射到數(shù)據(jù)庫`主要形式有:基于對(duì)象的映射基于表20基于表的映射基于表映射的文檔的結(jié)構(gòu)必須是如下所示的兩種類型的結(jié)構(gòu):第一種:<table> <row> <column1></column1> <columnn></columnn> </row> <row> <column1></column1> <columnn></columnn> </row></table><tables> <table1> <row> <column1></column1> <columnn></columnn> </row> </table1> <tablen> <row> <column1></column1> <columnm></columnm> </row> </tablen></tables>第二種:可以將文檔看成是一個(gè)單一的表可以將文檔看成是一個(gè)由一組表組成的庫基于表的映射基于表映射的文檔的結(jié)構(gòu)必須是如下所示的兩種類型21基于表的映射的優(yōu)缺點(diǎn)這種映射的優(yōu)點(diǎn)是它的簡單性。因?yàn)樗ヅ湓陉P(guān)系數(shù)據(jù)庫中的表和結(jié)果集的結(jié)構(gòu)非常簡單,基于這種映射的XML和數(shù)據(jù)庫轉(zhuǎn)換的代碼很容易編寫,并對(duì)特定應(yīng)用非常有用,比如在數(shù)據(jù)庫之間一次只牽扯到一個(gè)表的數(shù)據(jù)傳輸。這種映射有許多缺點(diǎn),最顯著的是它只能處理XML文檔的非常小的節(jié)點(diǎn)集?;诒淼挠成涞膬?yōu)缺點(diǎn)這種映射的優(yōu)點(diǎn)是它的簡單性。因?yàn)樗ヅ湓?2基于對(duì)象的映射所謂基于對(duì)象的映射可以簡單的理解為“對(duì)象與關(guān)系”,這種映射通常與關(guān)系數(shù)據(jù)庫一起使用。該映射主要用于XML模式(主要指DTD)到數(shù)據(jù)庫模式的映射。即將DTD先映射為對(duì)象模式,再由對(duì)象模式到數(shù)據(jù)庫模式。主要分為:映射屬性映射元素

基于對(duì)象的映射所謂基于對(duì)象的映射可以簡單的理解為“對(duì)象與關(guān)23映射元素映射元素首先將簡單的元素類型映射為基本的數(shù)據(jù)類型,然后再將復(fù)雜的元素類型映射為類(class),該復(fù)雜元素類型中的簡單元素類型相應(yīng)的映射為該類的屬性(變量)。如下:<!ELEMENTCheck(CD)><!ELEMENTCD(title,artist,country)><!ELEMENTtitle(#PCDATA)><!ELEMENTartist(#PCDATA)><!ELEMENTcountry(#PCDATA)>classCheck{ CDcd;//一個(gè)CD類對(duì)象}classCD{ Stringtitle; Stringartist; Stringcountry;}將Check類映射為庫,將CD類映射為該庫中的表,或者將Check類和CD類都映射為表,而用主鍵、外鍵將這兩個(gè)表關(guān)聯(lián)。將變量“title”、“artist”和“country”映射為該表中的字段。映射為對(duì)象模式映射為數(shù)據(jù)庫模式映射元素映射元素首先將簡單的元素類型映射為基本的數(shù)據(jù)類型,24對(duì)操作符的映射如果一個(gè)DTD語句中提供了“+”或“*”操作符,則需要把該元素類型作為復(fù)雜類型,并將其映射成一個(gè)數(shù)組變量,它是一個(gè)未知大小的數(shù)組。這個(gè)數(shù)組也必須被映射成一個(gè)表,它將為每個(gè)值包含一行。通過主鍵、外鍵聯(lián)系將該表與其他的表建立關(guān)系。如下:<!ELEMENTA(B+,C,D)><!ELEMENTB(#PCDATA)><!ELEMENTC(#PCDATA)><!ELEMENTD(#PCDATA)>classA{ String[]b; Stringc; Stringd;}TableA: Columna_pk Columnc ColumndTableB: Columna_fk Columnb映射為對(duì)象模式映射為數(shù)據(jù)庫模式對(duì)操作符的映射如果一個(gè)DTD語句中提供了“+”或“*”操作25映射屬性CDATA、ID、IDREF、NMTOKEN、ENTITY、NOTATION和枚舉這七種屬于單值,通常將其映射為類中的變量,然后再映射到數(shù)據(jù)庫中表的字段。IDREFS、NMTOKENS和ENTITIES這三種類型的屬性可以是多值。通常將其映射為類中的數(shù)組變量,然后再映射到數(shù)據(jù)庫中的表。注意:有些文檔使用ENTITY和ENTITIES屬性把未分析的、外部數(shù)據(jù)(比如一個(gè)二進(jìn)制文件)與XML文檔關(guān)聯(lián)起來。在對(duì)它們映射時(shí)同任何其他屬性一樣,不同的是,在傳輸數(shù)據(jù)的時(shí)候,必須用實(shí)體替換屬性值(在從XML傳輸數(shù)據(jù)到數(shù)據(jù)庫的時(shí)候)。映射屬性CDATA、ID、IDREF、NMTOKEN、EN26ID和IDREF或IDREFS屬性的映射<A> <Bid="1"></B> <Cref_id="1"></C> <Dref_id="1"></D></A>在數(shù)據(jù)庫中一般使用主鍵和外鍵將其關(guān)聯(lián),如下:TableA: Columna_pkTableB: Columna_fk Columnref_idTableC: Columna_fk Columnref_idTableD: Columna_fk ColumnidXML文檔數(shù)據(jù)庫中表和字段信息

ID和IDREF或IDREFS屬性的映射<A>在數(shù)據(jù)庫中27實(shí)驗(yàn)——<將關(guān)于員工和客戶信息的XML導(dǎo)入數(shù)據(jù)庫>程序的實(shí)現(xiàn)要求如下:〔1〕創(chuàng)立兩個(gè)表?!?〕使用DOM分別解析employee元素和buyer元素。實(shí)驗(yàn)——<將關(guān)于員工和客戶信息的XML導(dǎo)入數(shù)據(jù)庫>程序的28工程培訓(xùn)XML和數(shù)據(jù)庫工程培訓(xùn)XML和數(shù)據(jù)庫GR-XML培訓(xùn)29回憶-1XMLDSO是一個(gè)MicrosoftActiveX控件,嵌入到MicrosoftInternetExplorer中DSO有助于格式化數(shù)據(jù)并將這些數(shù)據(jù)顯示在HTML頁面上DSO可用于從外部XML文檔或從嵌入到HTML文檔的XML數(shù)據(jù)中提取數(shù)據(jù)<xml>和</xml>標(biāo)簽之間綁定的XML數(shù)據(jù)稱為XML數(shù)據(jù)島回憶-1XMLDSO是一個(gè)MicrosoftA30回憶-2可以通過在HTML文檔中使用<xml>標(biāo)簽或通過使用JavaScript創(chuàng)立函數(shù),將外部XML文檔鏈接到HTML文檔可以使用datasrc和datafld屬性從數(shù)據(jù)島中提取數(shù)據(jù)DSO可用于使用樣式表中定義的樣式來顯示XML數(shù)據(jù)島的數(shù)據(jù)回憶-2可以通過在HTML文檔中使用<xml>標(biāo)簽31本章知識(shí)點(diǎn)XML的數(shù)據(jù)庫應(yīng)用領(lǐng)域XML導(dǎo)入數(shù)據(jù)庫XML導(dǎo)出數(shù)據(jù)庫本章知識(shí)點(diǎn)XML的數(shù)據(jù)庫應(yīng)用領(lǐng)域32實(shí)驗(yàn)——<將關(guān)于員工和客戶信息的XML導(dǎo)入數(shù)據(jù)庫><?xmlversion="1.0"encoding="UTF-8"?><company> <employee> <personid="DE001"> <name>張三</name> <age>40</age> <pay>1800</pay> </person> <personid="DE002"> <name>小王</name> <age>20</age> <pay>1500</pay> </person> <personid="DE003"> <name>小周</name> <age>30</age> <pay>2000</pay> </person> </employee>將如下文檔中的員工信息解析出來存入company數(shù)據(jù)庫中的employee表中,將顧客信息解析出來存入company數(shù)據(jù)庫中的buyer表中:員工信息

實(shí)驗(yàn)——<將關(guān)于員工和客戶信息的XML導(dǎo)入數(shù)據(jù)庫><?x33 <buyer> <personid="BY001"> <name>Marry</name> <age>33</age> <phone>lt;/phone> <email>marrymm@163.com</email> </person> <personid="BY002"> <name>Sandenly</name> <age>20</age> <phone>lt;/phone> <email>sandenlygg@163.com</email> </person> </buyer></company>顧客信息 <buyer>顧客信息34XML的應(yīng)用領(lǐng)域XML的應(yīng)用可以分為以下幾個(gè)方面:應(yīng)用于將大量運(yùn)算分布在客戶端進(jìn)行,以減少服務(wù)器的負(fù)載應(yīng)用于數(shù)據(jù)轉(zhuǎn)換應(yīng)用于將同一數(shù)據(jù)以不同的面貌展現(xiàn)給不同的用戶XML應(yīng)用于網(wǎng)絡(luò)代理XML成為一種各種程序都能自動(dòng)理解和處理數(shù)據(jù)的規(guī)范。客戶可以根據(jù)自己的需求選擇和制作不同的應(yīng)用程序來處理數(shù)據(jù),而服務(wù)器只須發(fā)出同一個(gè)XML文件

使用XML可以使得數(shù)據(jù)源與顯示分離。這一應(yīng)用將會(huì)使得網(wǎng)絡(luò)用戶界面趨向個(gè)性化、風(fēng)格化。同一個(gè)XML可以被多個(gè)用戶進(jìn)行編輯、增減以適應(yīng)該用戶的需要,類似于設(shè)置權(quán)限。XML的應(yīng)用領(lǐng)域XML的應(yīng)用可以分為以下幾個(gè)方面:應(yīng)用于35XML導(dǎo)出數(shù)據(jù)庫XML導(dǎo)出單個(gè)表的數(shù)據(jù)

以SQLServer數(shù)據(jù)庫為例,在一個(gè)名為“mydb”的數(shù)據(jù)庫中,有一張關(guān)于person信息的表“mytable”,字段信息和數(shù)據(jù)信息如下:字段信息表數(shù)據(jù)信息表XML導(dǎo)出數(shù)據(jù)庫XML導(dǎo)出單個(gè)表的數(shù)據(jù)以SQLServ36importjava.sql.*;importjavax.xml.parsers.*;importorg.apache.crimson.tree.*;importorg.w3c.dom.*;importjava.io.*;publicclassDBtoXML1{ staticConnectioncon; publicstaticvoidmain(Stringargs[]){ Documentdoc; try{ //建立數(shù)據(jù)庫連接 Stringclassforname= "com.microsoft.jdbc.sqlserver.SQLServerDriver"; Stringurl="jdbc:microsoft:sqlserver://localhost:1433;" +"databasename=mydb"; Class.forName(classforname); Connectioncon=DriverManager.getConnection(url,"sa",""); Statementsta=con.createStatement(); ResultSetresult=sta.executeQuery( "SELECT*FROMmytable"); //獲取Document實(shí)例 DocumentBuilderFactorydbf= DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=dbf.newDocumentBuilder(); doc=builder.newDocument();importjava.sql.*;37 //創(chuàng)建根節(jié)點(diǎn) Elementpeople=doc.createElement("people"); while(result.next()){ Elementperson=doc.createElement("person"); people.appendChild(person); Elementname=doc.createElement("name"); /*獲取數(shù)據(jù)庫中name字段的值, 并作為xml文檔中name元素的字符數(shù)據(jù)*/ name.appendChild(doc.createTextNode( result.getString("name"))); person.appendChild(name); Elementage=doc.createElement("age"); age.appendChild(doc.createTextNode( result.getInt("age")+"")); person.appendChild(age); Elementaddr=doc.createElement("address"); addr.appendChild(doc.createTextNode( result.getString("address"))); person.appendChild(addr); Elementphone=doc.createElement("phone"); phone.appendChild(doc.createTextNode( result.getString("phone"))); person.appendChild(phone); } //創(chuàng)建根節(jié)點(diǎn)38 doc.appendChild(people); //將dom樹導(dǎo)出到文件中 ((XmlDocument)doc).write( newFileOutputStream(newFile("person.xml"))); }catch(Exceptione){e.printStackTrace();} }}程序運(yùn)行完成后,使用記事本打開“person.xml”文件 doc.appendChild(people);程序運(yùn)39XML導(dǎo)出多個(gè)表關(guān)聯(lián)的數(shù)據(jù)如“mydb”庫中有表“mytable1”和“mytable2”,他們之間通過外鍵“personid”而相約束,如下:表mytable1數(shù)據(jù)信息表mytable2字段信息表mytable1字段信息表mytable2字段信息XML導(dǎo)出多個(gè)表關(guān)聯(lián)的數(shù)據(jù)如“mydb”庫中有表“myt40importjava.sql.*;importjavax.xml.parsers.*;importorg.apache.crimson.tree.*;importorg.w3c.dom.*;importjava.io.*;publicclassDBtoXML2{

staticConnectioncon; publicstaticvoidmain(Stringargs[]){ Documentdoc; try{ //連接數(shù)據(jù)庫 Stringclassforname="com.microsoft.jdbc.sqlserver.SQLServerDriver"; Stringurl="jdbc:microsoft:sqlserver://localhost:1433;" +"databasename=mydb"; Class.forName(classforname); Connectioncon=DriverManager.getConnection(url,"sa",""); Statementsta=con.createStatement(); ResultSetresult=sta.executeQuery( "SELECT*FROMmytable1"); //獲取Document實(shí)例 DocumentBuilderFactorydbf= DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=dbf.newDocumentBuilder(); doc=builder.newDocument(); Elementpeople=doc.createElement("people");importjava.sql.*;41 while(result.next()){ Elementperson=doc.createElement("person"); Stringstr=result.getString("personid"); person.setAttribute("id",str); people.appendChild(person); Elementusername=doc.createElement("username"); username.appendChild( doc.createTextNode(result.getString("username"))); person.appendChild(username); Elementpass=doc.createElement("password"); pass.appendChild( doc.createTextNode(result.getString("password"))); person.appendChild(pass); //查詢表mytable2并向XML文檔中添加元素和字符數(shù)據(jù) ResultSetrs=con.createStatement().executeQuery( "SELECT*FROMmytable2" +"wherepersonid='"+str+"'"); while(rs.next()){ Elementuname=doc.createElement("uname"); uname.appendChild( doc.createTextNode(rs.getString("uname"))); person.appendChild(uname); Elementage=doc.createElement("age"); age.appendChild( doc.createTextNode(rs.getInt("age")+"")); person.appendChild(age); while(result.next()){42 Elementaddr=doc.createElement("address"); addr.appendChild( doc.createTextNode(rs.getString("address"))); person.appendChild(addr); Elementphone=doc.createElement("phone"); phone.appendChild( doc.createTextNode(rs.getString("phone"))); person.appendChild(phone); } } doc.appendChild(people); ((XmlDocument)doc).write(newFileOutputStream(newFile("person2.xml"))); }catch(Exceptione){e.printStackTrace();} } }程序運(yùn)行完成后用記事本打開person2.xml Elementaddr=doc.createEl43XML導(dǎo)入數(shù)據(jù)庫將簡單的XML文檔導(dǎo)入數(shù)據(jù)庫

<?xmlversion="1.0"encoding="UTF-8"?> <people> <personid="a001"> <username>aa</username> <password>12345</password> <uname>張三</uname> <age>20</age> <address>北京</address> <phone>12461238</phone> </person> <personid="a002"> <username>bb</username> <password>987562</password> <uname>李四</uname> <age>22</age> <address>北京</address> <phone>98421354</phone> </person> </people>需要導(dǎo)入數(shù)據(jù)庫的XML文檔person.xmlXML導(dǎo)入數(shù)據(jù)庫將簡單的XML文檔導(dǎo)入數(shù)據(jù)庫<?xmlv44文檔中有多個(gè)“person”元素,每個(gè)“person”元素包括一個(gè)屬性和六個(gè)子元素,而這六個(gè)子元素除了有字符數(shù)據(jù)外,并不包含其他的任何子元素。經(jīng)過分析,可以考慮將“person”元素對(duì)應(yīng)到數(shù)據(jù)庫中的一個(gè)表,而把它所包括的屬性和子元素作為該表的字段,如下:“person”表的字段信息

文檔中有多個(gè)“person”元素,每個(gè)“person”元素包45importjava.sql.*;importjavax.xml.parsers.*;importorg.apache.crimson.tree.*;importorg.w3c.dom.*;importjava.io.*;publicclassXMLtoDB1{ publicstaticvoidmain(Stringargs[]){ Stringid,username,password,uname,address,phone,sql,agestr; intage; try{ //建立數(shù)據(jù)庫連接 Stringclassforname= "com.microsoft.jdbc.sqlserver.SQLServerDriver"; Stringurl= "jdbc:microsoft:sqlserver://localhost:1433;" +"databasename=mydb"; Class.forName(classforname); Connectioncon=DriverManager.getConnection(url,"sa",""); //獲取Document實(shí)例 DocumentBuilderFactoryfactory= DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=factory.newDocumentBuilder(); Documentdoc=builder.parse( newFileInputStream(newFile("person.xml"))); importjava.sql.*;46 NodeListnodes=doc.getElementsByTagName("person"); for(inti=0;i<nodes.getLength();i++){ Elementnode=(Element)nodes.item(i); id=node.getAttributes().getNamedItem("id").getNodeValue(); username=node.getElementsByTagName("username"). item(0).getFirstChild().getNodeValue(); password=node.getElementsByTagName("password"). item(0).getFirstChild().getNodeValue(); uname=node.getElementsByTagName("uname"). item(0).getFirstChild().getNodeValue(); agestr=node.getElementsByTagName("age"). item(0).getFirstChild().getNodeValue(); age=Integer.parseInt(agestr); address=node.getElementsByTagName("address"). item(0).getFirstChild().getNodeValue(); phone=node.getElementsByTagName("phone"). item(0).getFirstChild().getNodeValue(); //向數(shù)據(jù)庫中添加數(shù)據(jù) sql="insertintopersonvalues('"+id+"','"+username +"','"+password+"',"+"'"+uname+"','"+age +"','"+address+"','"+phone+"')"; con.createStatement().executeUpdate(sql); } }catch(Exceptione){e.printStackTrace();} }} NodeListnodes=doc.getEleme47將XML映射到數(shù)據(jù)庫`主要形式有:基于對(duì)象的映射

基于表的映射

基于表的映射

所謂基于表的映射是指可以把文檔看成一個(gè)單一的表或單一的組表。將XML映射到數(shù)據(jù)庫`主要形式有:基于對(duì)象的映射基于表48基于表的映射基于表映射的文檔的結(jié)構(gòu)必須是如下所示的兩種類型的結(jié)構(gòu):第一種:<table> <row> <column1></column1> <columnn></columnn> </row> <row> <column1></

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論