版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
王红第9章
XML与数据库
2022/12/281王红2022/12/281主要内容第9章XML与数据库9.1借助XML文档实现数据库之间数据互换
9.2文档结构与数据库结构的映射
9.3SQLServer对XML的支持
9.4XML数据库
9.5小
结
2022/12/282主要内容第9章XML与数据库2022/12/282当存在大量数据需要处理分析的话,最好是把这些数据放到数据库中几乎所有大型应用系统都是和数据库相关联的,所以如果XML需要在这些领域大展宏图的话,必须要和数据库相联系
2022/12/283当存在大量数据需要处理分析的话,最好是把这些数据放到数据库中9.1借助XML文档实现数据库之间数据互换
XML提供了一种连接关系数据库和面向对象数据库以及其他数据库管理系统之间的纽带
关系数据库和面向对象数据库首先需要将数据从数据库中提取出来,经过转换或直接以XML数据形式发布到网上(局域网或Internet网),然后相互交换数据,经应用层系统处理后在转存入库
开发一个访问数据库的XML应用系统需要同时借助XML编程接口和数据库编程接口,前者用于对XML文档的解析、定位和查询,后者则是用于访问数据库
2022/12/2849.1借助XML文档实现数据库之间数据互换XML提供了XML和数据库XML文档是一个数据集合优点自我描述性可移植性以树结构描述数据提供部分数据库的功能缺点数据存取慢缺少数据库的功能2022/12/285XML和数据库XML文档是一个数据集合2022/12/2XML和数据库
XML文档在数据量较小和用户较少的环境中可以当作数据库使用本地XML数据库专门设计用于存储XML文档的数据库2022/12/286XML和数据库XML文档在数据量较小和用户较少的环境中可9.1.1将XML数据插入数据库
将XML数据插入数据库的步骤:使用Class.forName()方法加载缺省驱动器使用DriverManager对象的getConnection()方法建立数据库连接使用Connection对象创建Statement对象将已解析的XML文档放在Document对象中使用getElementsByTagName()方法检索其元素使用Insert语句将数据插入数据库2022/12/2879.1.1将XML数据插入数据库将XML数据插入数将XML中的数据插入数据库DocumentBuilderFactoryDocumentBuilder
DocumentNodeListElementNode2022/12/288将XML中的数据插入数据库DocumentBuilderFa实例下面例xml2db.java,将candidate.xml文档中的数据存储到一个ACCESS数据库people中表的结构如图9-1所示
2022/12/289实例下面例xml2db.java,将candidate.xm实例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实例importjava.sql.*;2022/12/28实例(续)
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();}}}运行结果如图9-2所示2022/12/2811实例(续)DocumentBuilderFactoryf图9-2xml2db.java运行结果2022/12/2812图9-2xml2db.java运行结果2022/12/9.1.2由数据库中数据生成XML文档
从数据库检索数据生成XML的步骤:将文件头和根元素写入文件使用Class.forName()方法加载缺省驱动程序使用DriverManager对象的getConnection()方法建立数据库连接使用Connection对象创建Statement对象使用Statement对象的executeQuery方法执行查询从数据库提取数据并将其插入文件中将结束元素写入文件2022/12/28139.1.2由数据库中数据生成XML文档从数据库检索数据生用数据库中的数据生成XML文档DocumentBuilderFactoryDocumentBuilder
DocumentNode2022/12/2814用数据库中的数据生成XML文档DocumentBuilder实例下面举例Sdudents.java,将一个ACCESS数据库students中数据存储到students.xml文档中表的内容如图9-3所示2022/12/2815实例下面举例Sdudents.java,将一个ACCESS数实例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实例importjava.sql.*;2022/12/28实例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>");}运行结果如图9-4所示2022/12/2817实例while(rs.next())2022/12/2817图9-4Sdudents.java运行结果
2022/12/2818图9-4Sdudents.java运行结果2022/12实例下面举例db2xml.java,用org.apache.crimson.tree包中的XmlDocument类的write()方法将一个ACCESS数据库people中数据存储到candidate1.xml文档中的表的内容如图9-2所示程序运行结果使candidate1.xml与前面用到的candidate.xml完全相同2022/12/2819实例下面举例db2xml.java,用org.apache.实例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实例importjava.sql.*;2022/12/28实例(续)
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实例(续)while(results.next()){9.2文档结构与数据库结构的映射把数据存储到数据库中的时候,需要抛弃一个文档的很多信息比如它的名称和DTD同样,当从数据库中提取数据的时候,产生的XML文档通常不包含CDATA或者是实体使用的说明,而且节点下元素的排列位置只和数据库中记录的顺序位置一致一个XML文档存储到数据库中,再由该数据库生成此XML文档,这前后两个文档格式几乎不可能完全一样2022/12/28229.2文档结构与数据库结构的映射把数据存储到数据库中的时9.2文档结构与数据库结构的映射为了在数据库和XML文档之间传递数据,必须在数据库数据模型和XML数据模型产生映射关系数据库数据是结构化数据XML文档属于半结构化的数据将结构化数据与非结构化数据进行转换的时候,关键问题是建立不同结构层次之间的映射关系,及如何保留他们的语义约束信息,即如何将关系数据库表达的结构与约束映射为XML。映射可以有两类:模板驱动和模型驱动。2022/12/28239.2文档结构与数据库结构的映射为了在数据库和XML文档9.2.1基于模板驱动的映射基于模板的映射方法并不事先定义好XML文档与其他数据之间的映射关系,而是在XML文档中嵌入带参数的SQL命令。这些命令在转换过程中被系统所识别和执行,执行的结果被替换到指令所在的位置,从而生成目标XML文档.并用数据传输诸如中间件等实体软件进行处理
2022/12/28249.2.1基于模板驱动的映射基于模板的映射方法并不事先定9.2文档结构与数据库结构的映射比如,考虑下面的模板:<?xmlversion="1.0"?>
<FlightInfo>
<Intro>Thefollowingflightshaveavailableseats:</Intro>
<SelectStmt>SELECTAirline,FltNumber,Depart,ArriveFROMFlights</SelectStmt>
<Conclude>Wehopeoneofthesemeetsyourneeds</Conclude>
</FlightInfo>2022/12/28259.2文档结构与数据库结构的映射比如,考虑下面的模板:9.2文档结构与数据库结构的映射当用数据传输中间件进行处理的时候,每一个SELECT语句都会被它的结果所代替,用XML格式化形式表现为:<?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>Wehopeoneofthesemeetsyourneeds</Conclude>
</FlightInfo>2022/12/28269.2文档结构与数据库结构的映射当用数据传输中间件进行处9.2文档结构与数据库结构的映射基于模板转换的流程图:2022/12/28279.2文档结构与数据库结构的映射基于模板转换的流程图:9.2文档结构与数据库结构的映射优点:基于模板驱动的映射可以是相当灵活的允许你把结果集放到XML文档的任何位置同时可以对SELECT语句设置参数并且可以使用for循环语句和if条件语句等。2022/12/28289.2文档结构与数据库结构的映射优点:2022/12/29.2文档结构与数据库结构的映射缺点:基于模板驱动的映射是一种浅层映射以XML内嵌的SQL执行的数据结果集为依据,不涉及数据库赖以存在的关系模式舍弃了关系模式的种种约束条件只适合于将关系数据库的数据转换为XML文档2022/12/28299.2文档结构与数据库结构的映射缺点:2022/12/29.2.2基于模型驱动的映射就是把数据从数据库传送到XML文档是用一个具体的模型实现的。这样,用户可以将相应的格式直接映射到模型上,从而数据库中数据以各种形式展示出来。在XML文档中,两种模型是很常见的:表格模型和数据专用对象模型。2022/12/28309.2.2基于模型驱动的映射就是把数据从数据库传送到XM1.表格模型把XML文档表示为一个单一的表格或者是表格的集合,这样数据库中数据都展示为固定模式。一般地,数据库中数据可以用如下的形式表示:<database>
<table>
<row>
<column1>...</column1>
<column2>...</column2>
...
</row>
...
</table>
...
</database>2022/12/28311.表格模型把XML文档表示为一个单一的表格或者是表格的集1.表格模型这里关键字“table”在把数据从数据库传递到XML文档的时候,表示一个单一的结果集。但是,当结果集合不只一个的时候,或者当XML文档包括多个复杂嵌套的时候,这种传递方式就不能适应了。2022/12/28321.表格模型这里关键字“table”在把数据从数据库传递到2.数据专用的对象模型把一个XML文档表示为由数据对象构成的树,每一个元素类型和对象相对应。主要在面向对象和层次数据库中使用,通过传统的关系-对象模型也可以映射到关系数据库中。2022/12/28332.数据专用的对象模型把一个XML文档表示为由数据对象构成2.数据专用的对象模型基于模型的转换方法由于有了数据模型的支持,可以完成关系数据库数据和XML数据之间的双向转换。但是模型的引入也使得XML文档的结构受到了一些限制,一个XML文档必须符合模型所规定的结构,才能将XML文档转换成其他类型的数据,而从其他类型数据转换得到的XML文档也具有某种结构特点。基于模型的转换方法的关键在于设计一个灵活的映射模型,为了更好的支持其双向映射的特点,这个映射模型必须是易于“读懂”的,易于操纵的,能够很好的表达关系数据库的各种约束。模型驱动的映射是一种深层映射,是模式和模式之间的映射。2022/12/28342.数据专用的对象模型基于模型的转换方法由于有了数据模型的2.数据专用的对象模型在XML和数据库之间进行数据转化的时候,需要考虑两个过程:一个是从数据库模式中产生DTD,另外一个是根据DTD生成数据库模式.从一个DTD中生成一个关系模式的步骤如下:(1)对每一个元素,产生一个表和一个主键列。(2)对每一个有混合内容的元素,产生一个独立的表格,用来存储PCDATA,并通过父表的主键和父表相联。(3)对元素类型中的每一个单一值的属性,对具有只有PCDATA内容的子元素(该子元素按顺序出现),产生一个单独的列,如果子元素类型或者值是可以选择的话,该列就应该可以允许为NULL类型。2022/12/28352.数据专用的对象模型在XML和数据库之间进行数据转化的时2.数据专用的对象模型(4)对有多个值的属性和可以出现多次的子元素(该子元素PCDATA)的话,需要创建一个单独的表来存储这些值,并通过父表的主键和父表相联。(5)对每一个包含元素或者混合内容的子元素来说,通过父表的主键把父元素和子元素联接起来。从一个关系数据库模式构建DTD步骤如下:(1)对每一个表,创建一个元素。(2)对表中的每一列,创建一个属性或者是一个只有PCDATA内容的子元素。(3)根据表中的每一主键/外键关系,创建该表元素的子元素。2022/12/28362.数据专用的对象模型(4)对有多个值的属性和可以出现多次9.3SQLServer对XML的支持在SQLServer中实现了对XML使用HTTP执行简单查询、应用XSL样式单的查询、使用模板查询、使用XPath查询。SQLServer2000的XML功能主要包括如下内容:许用户通过网络查询SQLServer中数据,并以XML格式获得返回结果。持XDR(简化的XML_DATA)架构,并可以使用XPath查询XDR架构。允许查询和写入XML数据。使用SELECT语句和FORXML字句检索XML数据。使用XPath查询语言检索XML数据。增强了MicrosoftSQLServer2000OLEDB提供程序,从而可以使用XML文档作为命令文本并以流的形式返回结果集。2022/12/28379.3SQLServer对XML的支持在SQLSer9.3.1配置IIS服务器支持SQLXML在Windows2000中,有自带的IIS5.0。如果是WindowsNT,则在最新的serverpack中包含了新的IIS。IIS服务器建立了用户和SQLServer之间的桥梁。用户通过浏览器发出URL查询请求,IIS首先接收到查询结果,然后将请求通过OLEDB接口传递给SQLServer。SQLServer以XML格式返回的查询结果再返回到用户的浏览器中。在IIS服务器中完成XML格式数据通信需要通过SQLServer2000的XML组件(sqlsapi.dll和sqlxml.dll)来完成。2022/12/28389.3.1配置IIS服务器支持SQLXML在Windo9.3.1配置IIS服务器支持SQLXML在使用HTTP访问SQLServer2000数据库之前,必须根据使用方式创建适当的虚拟目录。必须将IIS服务器和虚拟目录的名称指定为URL的一部分2022/12/28399.3.1配置IIS服务器支持SQLXML在使用HT9.3.1配置IIS服务器支持SQLXML根据使用HTTP访问SQLServer2000数据库的不同方式,需要创建适当的虚拟目录:(1)直接访问数据库对象,例如表。在这种情况下,需要创建dbobject类型的虚拟目录。(2)执行模板文件。在这种情况下,需要创建template类型的虚拟目录(3)执行XPath查询。在这种情况下,需要创建schema类型的虚拟目录2022/12/28409.3.1配置IIS服务器支持SQLXML根据使用HT9.3.1配置IIS服务器支持SQLXML下面举例说明各种查询方式的使用。这几种查询方式都是用下面的表:2022/12/28419.3.1配置IIS服务器支持SQLXML下面举例说明9.3.2使用HTTP执行简单查询
使用了简单查询来获得“书籍”表中的书名:http://localhost/xmlquery?sql=selectf+书名+from+书籍+for+xml+auto&root=+书名清单书名+from+书籍+for+xml+auto&root=+书名清单该查询将返回的XML文档根元素设置为“书名清单”,并以AUTO方式返回结果。查询结果如图9-9所示2022/12/28429.3.2使用HTTP执行简单查询使用了简单查询来获得图9-9简单查询结果2022/12/2843图9-9简单查询结果2022/12/28439.3.3应用XSL样式单的查询可以使用样式单元来定义XML查询结果在浏览器中的表现形式。要使用样式单,需要在查询时使用XSL参数指定样式单文件。下面的查询使用XSL样式单以表格方式显示查询结果:
http://localhost/xmlquery?sql=select+书名+from+书籍+for+xml+auto&root=+图书清单&xsl=/table.xsl其中xsl/table.xsl指定了使用的样式单文件应用了样式单后的查询结果如图9-10所示2022/12/28449.3.3应用XSL样式单的查询可以使用样式单元来定义图9-10应用了样式单后的查询结果2022/12/2845图9-10应用了样式单后的查询结果2022/12/2849.3.4使用模板查询直接在浏览器地址栏中输入过长的SQL查询语句非常不便为解决这一问题,SQLServer引入了模板的概念。一个查询模板实际上就是一个包含SQL查询的XML或XPath查询的XML文档,然后在URL中指定模板文件的方式来执行查询2022/12/28469.3.4使用模板查询直接在浏览器地址栏中输入过长的S9.3.4使用模板查询在查询模板中,可以定义如下内容:(1)指定SQL查询或XPath查询。(2)指定通过执行SQL或XPath查询所返回的XML片段的根元素,从而使在URL中执行模板的结果是有效的XML文档。(3)定义可被传递到SQL语句或XPath查询的参数。(4)声明命名空间。(5)指定将应用于所得到文档的可扩展样式语言XSL样式表。(6)定义查询模板2022/12/28479.3.4使用模板查询在查询模板中,可以定义如下内容: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使用模板查询第一步:使用模板执行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使用模板查询第一步:使用模板执行SQL简单查9.3.4使用模板查询第二步:在模板执行存储过程。在“书籍”数据库中创建如下的存储过程:CREATEPROCEDUREgetinfoASSelect书名,作者,出版社
from书籍
forxmlauto2022/12/28509.3.4使用模板查询第二步:在模板执行存储过程。209.3.4使用模板查询第三步:在模板中创建参数查询。〈?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/28519.3.4使用模板查询第三步:在模板中创建参数查询。29.3.4使用模板查询下面的URL使用参数的默认值来执行查询:
http://localhost/xmlquery/mytemplate/paramquery.xml在浏览器中执行结果如图9-11所示2022/12/28529.3.4使用模板查询下面的URL使用参数的默认值来执9.3.5使用XPath查询XPath查询是使用简化的XML数据架构为关系数据创建的XML视图第一步,使用带批注的XDR创建XML视图第二步,使用默认属性映射架构建立与数据的XPath查询第三步,使用特定属性映射架构的XPath查询第四步,返回CDATA节内容2022/12/28539.3.5使用XPath查询XPath查询是使用简化的9.3.4使用模板查询第三步:在模板中创建参数查询。〈?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使用模板查询第三步:在模板中创建参数查询。29.4XML数据库20世纪60年代早期称为前关系型数据库系统时期。1970年,E.F.Codd在IBM的SanJose研究实验室推出了关系数据模型虽然关系型数据库技术已经相当成熟,但其局限性也显而易见:它能很好地处理所谓的“表格型数据”,却对各种复杂类型的数据无能为力。20世纪90年代初期开始,人们研究和开发“面向对象的数据库系统”,数据库发展进入了后关系型数据库系统时期。20世纪90年代末期出现了XML数据库。数据库管理系统的发展历程如图9-15所示2022/12/28559.4XML数据库20世纪60年代早期称为前关系型数据库图9-15数据库管理系统发展
2022/12/2856图9-15数据库管理系统发展2022/12/28569.4.1XML和半结构化数据
现实世界中,一些数据是完全没有结构的,如video、audio、image数据流。很多数据既不是完全没有结构,也不是完全有结构的,如HTML构成的Web页、电子邮件、Latex文档、生物数据库(如ACeDB)等等。我们把它们称为半结构化数据。与传统的结构化数据相比,半结构化数据主要特性是自描述的(即内容与结构都包含在数据中),它的结构是不固定、不规则、隐含的,并且是易变化的。由于Web数据、数据集成、数据交换都需要利用半结构化数据,因此要从数据库角度研究半结构化数据的数据模型、数据模式、数据查询、查询优化。2022/12/28579.4.1XML和半结构化数据现实世界中,一些数据是完9.4.1XML和半结构化数据XML文档代表了一个重要的并且在不断增长的半结构化数据源它同半结构化数据有许多共同的性质,因此半结构化数据己有的理论,己有的原型系统可以作为XML研究的基础XML与经典的半结构化数据之间也有区别,使其成为一种独特的半结构数据类型2022/12/28589.4.1XML和半结构化数据XML文档代表了一个重要的9.4.2XML数据库的崛起XML本身并不是数据库,从严格的意义上来说,XML仅仅意味着XML文档加上一些其他的辅助工具,我们可以把整个XML看成是一个数据库系统,XML文本本身可以看成是数据库中的数据区,DTD或者Schemas可以看成是数据库模式设计,XQL可以看成是数据库查询语言,SAX或DOM可以看成是数据库处理工具XML数据库就是从数据库的角度来研究以XML格式表达的Web数据。它包括XML数据的存储、查询语言、模式管理、查询处理等。
2022/12/28599.4.2XML数据库的崛起XML本身并不是数据库,从严9.4.2XML数据库的崛起与传统关系数据库相比,XML数据库具有以下特点:(1)XML数据库的数据模型可以是树、图等层次数据模型,而传统的关系数据库是以关系数据模型理论为基础的(2)传统数据库语言允许对数据元素的值进行操作,但不能对元素名称进行操作,XML数据库则提供了对标签名称的操作,并且包括了对路径的操作2022/12/28609.4.2XML数据库的崛起与传统关系数据库相比,XML9.4.2XML数据库的崛起(3)XML数据库的显示丰富多样,其多样性由XSL指定,而传统关系数据库的显示方式相对简单(4)传统关系数据库只能采用SQL查询语言,而XML文档查询语言包括Xquery、Xpath、XQL、XML-QL、QUILT等(5)XML数据库的模式主要由DTD、XMLSchema确定,而传统关系数据库由数据字典决定2022/12/28619.4.2XML数据库的崛起(3)XML数据库的显示丰富9.4.2XML数据库的崛起但是,毕竟关系数据库经过了20多年发展,其技术和市场都非常成熟,我们无法忽视关系数据库的优势所在:技术成熟、应用广泛;数据管理能力强(包括存储、检索、修改等);数据安全程度高;事务处理稳定可靠;并发访问机制完善等。2022/12/28629.4.2XML数据库的崛起但是,毕竟关系数据库经过了29.4.2XML数据库的崛起XML数据库的主要缺点在于:(1)XML数据库的检索是基于节点的检索,存放大量甚至海量数据的XML文件会导致检索速度极低。XML的修改也是基于节点的,所以修改效率也很低。(2)XML数据库的解析手段有缺陷。在目前的两种解析机制中,SAX方式是基于文件的解析,速度慢;DOM方式是基于内存的方式,资源消耗极大。(3)XML的安全性及并发操作机制是需要重点解决的问题之一。2022/12/28639.4.2XML数据库的崛起XML数据库的主要缺点在于:9.4.2XML数据库的崛起XML数据库不会代替关系数据库,这种可能性非常小,但它一定能够“占领”某些领域。XML数据库可以解决关系数据库不能解决的问题,从长远来看,XML数据库发展潜力不容置疑。2022/12/28649.4.2XML数据库的崛起XML数据库不会代替关系数据9.5小结着重讲解了对XML数据库的访问技术和异构数据库之间通过转换成XML实现互访介绍了SQLSERVER对XML数据的支持简要介绍了XML数据库2022/12/28659.5小结着重讲解了对XML数据库的访问技术和异构数王红第9章
XML与数据库
2022/12/2866王红2022/12/281主要内容第9章XML与数据库9.1借助XML文档实现数据库之间数据互换
9.2文档结构与数据库结构的映射
9.3SQLServer对XML的支持
9.4XML数据库
9.5小
结
2022/12/2867主要内容第9章XML与数据库2022/12/282当存在大量数据需要处理分析的话,最好是把这些数据放到数据库中几乎所有大型应用系统都是和数据库相关联的,所以如果XML需要在这些领域大展宏图的话,必须要和数据库相联系
2022/12/2868当存在大量数据需要处理分析的话,最好是把这些数据放到数据库中9.1借助XML文档实现数据库之间数据互换
XML提供了一种连接关系数据库和面向对象数据库以及其他数据库管理系统之间的纽带
关系数据库和面向对象数据库首先需要将数据从数据库中提取出来,经过转换或直接以XML数据形式发布到网上(局域网或Internet网),然后相互交换数据,经应用层系统处理后在转存入库
开发一个访问数据库的XML应用系统需要同时借助XML编程接口和数据库编程接口,前者用于对XML文档的解析、定位和查询,后者则是用于访问数据库
2022/12/28699.1借助XML文档实现数据库之间数据互换XML提供了XML和数据库XML文档是一个数据集合优点自我描述性可移植性以树结构描述数据提供部分数据库的功能缺点数据存取慢缺少数据库的功能2022/12/2870XML和数据库XML文档是一个数据集合2022/12/2XML和数据库
XML文档在数据量较小和用户较少的环境中可以当作数据库使用本地XML数据库专门设计用于存储XML文档的数据库2022/12/2871XML和数据库XML文档在数据量较小和用户较少的环境中可9.1.1将XML数据插入数据库
将XML数据插入数据库的步骤:使用Class.forName()方法加载缺省驱动器使用DriverManager对象的getConnection()方法建立数据库连接使用Connection对象创建Statement对象将已解析的XML文档放在Document对象中使用getElementsByTagName()方法检索其元素使用Insert语句将数据插入数据库2022/12/28729.1.1将XML数据插入数据库将XML数据插入数将XML中的数据插入数据库DocumentBuilderFactoryDocumentBuilder
DocumentNodeListElementNode2022/12/2873将XML中的数据插入数据库DocumentBuilderFa实例下面例xml2db.java,将candidate.xml文档中的数据存储到一个ACCESS数据库people中表的结构如图9-1所示
2022/12/2874实例下面例xml2db.java,将candidate.xm实例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实例importjava.sql.*;2022/12/28实例(续)
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();}}}运行结果如图9-2所示2022/12/2876实例(续)DocumentBuilderFactoryf图9-2xml2db.java运行结果2022/12/2877图9-2xml2db.java运行结果2022/12/9.1.2由数据库中数据生成XML文档
从数据库检索数据生成XML的步骤:将文件头和根元素写入文件使用Class.forName()方法加载缺省驱动程序使用DriverManager对象的getConnection()方法建立数据库连接使用Connection对象创建Statement对象使用Statement对象的executeQuery方法执行查询从数据库提取数据并将其插入文件中将结束元素写入文件2022/12/28789.1.2由数据库中数据生成XML文档从数据库检索数据生用数据库中的数据生成XML文档DocumentBuilderFactoryDocumentBuilder
DocumentNode2022/12/2879用数据库中的数据生成XML文档DocumentBuilder实例下面举例Sdudents.java,将一个ACCESS数据库students中数据存储到students.xml文档中表的内容如图9-3所示2022/12/2880实例下面举例Sdudents.java,将一个ACCESS数实例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实例importjava.sql.*;2022/12/28实例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>");}运行结果如图9-4所示2022/12/2882实例while(rs.next())2022/12/2817图9-4Sdudents.java运行结果
2022/12/2883图9-4Sdudents.java运行结果2022/12实例下面举例db2xml.java,用org.apache.crimson.tree包中的XmlDocument类的write()方法将一个ACCESS数据库people中数据存储到candidate1.xml文档中的表的内容如图9-2所示程序运行结果使candidate1.xml与前面用到的candidate.xml完全相同2022/12/2884实例下面举例db2xml.java,用org.apache.实例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实例importjava.sql.*;2022/12/28实例(续)
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实例(续)while(results.next()){9.2文档结构与数据库结构的映射把数据存储到数据库中的时候,需要抛弃一个文档的很多信息比如它的名称和DTD同样,当从数据库中提取数据的时候,产生的XML文档通常不包含CDATA或者是实体使用的说明,而且节点下元素的排列位置只和数据库中记录的顺序位置一致一个XML文档存储到数据库中,再由该数据库生成此XML文档,这前后两个文档格式几乎不可能完全一样2022/12/28879.2文档结构与数据库结构的映射把数据存储到数据库中的时9.2文档结构与数据库结构的映射为了在数据库和XML文档之间传递数据,必须在数据库数据模型和XML数据模型产生映射关系数据库数据是结构化数据XML文档属于半结构化的数据将结构化数据与非结构化数据进行转换的时候,关键问题是建立不同结构层次之间的映射关系,及如何保留他们的语义约束信息,即如何将关系数据库表达的结构与约束映射为XML。映射可以有两类:模板驱动和模型驱动。2022/12/28889.2文档结构与数据库结构的映射为了在数据库和XML文档9.2.1基于模板驱动的映射基于模板的映射方法并不事先定义好XML文档与其他数据之间的映射关系,而是在XML文档中嵌入带参数的SQL命令。这些命令在转换过程中被系统所识别和执行,执行的结果被替换到指令所在的位置,从而生成目标XML文档.并用数据传输诸如中间件等实体软件进行处理
2022/12/28899.2.1基于模板驱动的映射基于模板的映射方法并不事先定9.2文档结构与数据库结构的映射比如,考虑下面的模板:<?xmlversion="1.0"?>
<FlightInfo>
<Intro>Thefollowingflightshaveavailableseats:</Intro>
<SelectStmt>SELECTAirline,FltNumber,Depart,ArriveFROMFlights</SelectStmt>
<Conclude>Wehopeoneofthesemeetsyourneeds</Conclude>
</FlightInfo>2022/12/28909.2文档结构与数据库结构的映射比如,考虑下面的模板:9.2文档结构与数据库结构的映射当用数据传输中间件进行处理的时候,每一个SELECT语句都会被它的结果所代替,用XML格式化形式表现为:<?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>Wehopeoneofthesemeetsyourneeds</Conclude>
</FlightInfo>2022/12/28919.2文档结构与数据库结构的映射当用数据传输中间件进行处9.2文档结构与数据库结构的映射基于模板转换的流程图:2022/12/28929.2文档结构与数据库结构的映射基于模板转换的流程图:9.2文档结构与数据库结构的映射优点:基于模板驱动的映射可以是相当灵活的允许你把结果集放到XML文档的任何位置同时可以对SELECT语句设置参数并且可以使用for循环语句和if条件语句等。2022/12/28939.2文档结构与数据库结构的映射优点:2022/12/29.2文档结构与数据库结构的映射缺点:基于模板驱动的映射是一种浅层映射以XML内嵌的SQL执行的数据结果集为依据,不涉及数据库赖以存在的关系模式舍弃了关系模式的种种约束条件只适合于将关系数据库的数据转换为XML文档2022/12/28949.2文档结构与数据库结构的映射缺点:2022/12/29.2.2基于模型驱动的映射就是把数据从数据库传送到XML文档是用一个具体的模型实现的。这样,用户可以将相应的格式直接映射到模型上,从而数据库中数据以各种形式展示出来。在XML文档中,两种模型是很常见的:表格模型和数据专用对象模型。2022/12/28959.2.2基于模型驱动的映射就是把数据从数据库传送到XM1.表格模型把XML文档表示为一个单一的表格或者是表格的集合,这样数据库中数据都展示为固定模式。一般地,数据库中数据可以用如下的形式表示:<database>
<table>
<row>
<column1>...</column1>
<column2>...</column2>
...
</row>
...
</table>
...
</database>2022/12/28961.表格模型把XML文档表示为一个单一的表格或者是表格的集1.表格模型这里关键字“table”在把数据从数据库传递到XML文档的时候,表示一个单一的结果集。但是,当结果集合不只一个的时候,或者当XML文档包括多个复杂嵌套的时候,这种传递方式就不能适应了。2022/12/28971.表格模型这里关键字“table”在把数据从数据库传递到2.数据专用的对象模型把一个XML文档表示为由数据对象构成的树,每一个元素类型和对象相对应。主要在面向对象和层次数据库中使用,通过传统的关系-对象模型也可以映射到关系数据库中。2022/12/28982.数据专用的对象模型把一个XML文档表示为由数据对象构成2.数据专用的对象模型基于模型的转换方法由于有了数据模型的支持,可以完成关系数据库数据和XML数据之间的双向转换。但是模型的引入也使得XML文档的结构受到了一些限制,一个XML文档必须符合模型所规定的结构,才能将XML文档转换成其他类型的数据,而从其他类型数据转换得到的XML文档也具有某种结构特点。基于模型的转换方法的关键在于设计一个灵活的映射模型,为了更好的支持其双向映射的特点,这个映射模型必须是易于“读懂”的,易于操纵的,能够很好的表达关系数据库的各种约束。模型驱动的映射是一种深层映射,是模式和模式之间的映射。2022/12/28992.数据专用的对象模型基于模型的转换方法由于有了数据模型的2.数据专用的对象模型在XML和数据库之间进行数据转化的时候,需要考虑两个过程:一个是从数据库模式中产生DTD,另外一个是根据DTD生成数据库模式.从一个DTD中生成一个关系模式的步骤如下:(1)对每一个元素,产生一个表和一个主键列。(2)对每一个有混合内容的元素,产生一个独立的表格,用来存储PCDATA,并通过父表的主键和父表相联。(3)对元素类型中的每一个单一值的属性,对具有只有PCDATA内容的子元素(该子元素按顺序出现),产生一个单独的列,如果子元素类型或者值是可以选择的话,该列就应该可以允许为NULL类型。2022/12/281002.数据专用的对象模型在XML和数据库之间进行数据转化的时2.数据专用的对象模型(4)对有多个值的属性和可以出现多次的子元素(该子元素PCDATA)的话,需要创建一个单独的表来存储这些值,并通过父表的主键和父表相联。(5)对每一个包含元素或者混合内容的子元素来说,通过父表的主键把父元素和子元素联接起来。从一个关系数据库模式构建DTD步骤如下:(1)对每一个表,创建一个元素。(2)对表中的每一列,创建一个属性或者是一个只有PCDATA内容的子元素。(3)根据表中的每一主键/外键关系,创建该表元素的子元素。2022/12/281012.数据专用的对象模型(4)对有多个值的属性和可以出现多次9.3SQLServer对XML的支持在SQLServer中实现了对XML使用HTTP执行简单查询、应用XSL样式单的查询、使用模板查询、使用XPath查询。SQLServer2000的XML功能主要包括如下内容:许用户通过网络查询SQLServer中数据,并以XML格式获得返回结果。持XDR(简化的XML_DATA)架构,并可以使用XPath查询XDR架构。允许查询和写入XML数据。使用SELECT语句和FORXML字句检索XML数据。使用XPath查询语言检索XML数据。增强了MicrosoftSQLServer2000OLEDB提供程序,从而可以使用XML文档作为命令文本并以流的形式返回结果集。2022/12/281029.3SQLServer对XML的支持在SQLSer9.3.1配置IIS服务器支持SQLXML在Windows2000中,有自带的IIS5.0。如果是WindowsNT,则在最新的serverpack中包含了新的IIS。IIS服务器建立了用户和SQLServer之间的桥梁。用户通过浏览器发出URL查询请求,IIS首先接收到查询结果,然后将请求通过OLED
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学信息技术第三册 第19课带变量的过程教学实录 北京版
- 2023九年级历史下册 第一单元 殖民地人民的反抗与资本主义制度的扩展第4课 日本明治维新教学实录 新人教版
- 六年级儿童节讲话稿10篇
- 银行的实习报告模板集锦五篇
- 2024六年级英语上册 Unit 2 School in Canada Lesson 11 Always Do Your Homework教学实录 冀教版(三起)
- 异位妊娠说课-教学课件
- 老师道歉信范文集合五篇
- 第3课 突破封锁线(教学实录)-教学实录2023-2024学年粤教版(B版)小学信息技术六年级下册
- 驾驶员工作述职报告6篇
- 教师学期个人总结2021汇报【10篇】
- 2024年中学科技教育工作总结样本(4篇)
- 国家开放大学电大本科《理工英语3》期末试题题库及答案1(试卷号:1377)
- 湖北省十堰市2023-2024学年高二上学期期末调研考试 物理 含答案
- 电网突发停电应急预案
- 护理安全小组工作计划
- 2025办公室无偿租赁合同范本
- 翻译美学视角下小说《长恨歌》英译研究
- 辽宁省抚顺市抚顺县2023-2024学年八年级上学期期末考试数学试卷(含解析)
- 《中国武术的起源》课件
- 广东省东莞市2024-2025学年八年级上学期12月月考道德与法治试题(含答案)
- 期末测试卷(试题)(含答案)2024-2025学年北师大版数学五年级上册
评论
0/150
提交评论