在-Eclipse-中开发-Apache-Derby-应用程序.doc_第1页
在-Eclipse-中开发-Apache-Derby-应用程序.doc_第2页
在-Eclipse-中开发-Apache-Derby-应用程序.doc_第3页
在-Eclipse-中开发-Apache-Derby-应用程序.doc_第4页
在-Eclipse-中开发-Apache-Derby-应用程序.doc_第5页
免费预览已结束,剩余23页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在 Eclipse 中开发 Apache Derby 应用程序级别: 初级Gilles Roux, 信息管理软件工程师, IBM2005 年 2 月 01 日在开发 Apache Derby 应用程序的过程中需要执行很多任务,例如创建和连接数据库,编写 Java JDBC 客户机应用程序和存储过程,以及将最终得到的软件组件部署到生产环境。本文旨在发现如何结合使用各种基于 Eclipse 的 Apache Derby 工具来简化这一开发过程。概述本文的目的是向您展示如何在 Eclipse 集成开发环境(IDE)中使用几种不同的工具,例如 Java Development Tools、IBM DB2 plug-ins for Eclipse 和 IBM integration plug-in for Derby,以便开发 Apache Derby 应用程序。本文将介绍一个典型 Derby 应用程序的整个开发周期,从数据库的创建开始,然后经历 JDBC 客户机应用程序的开发,存储过程和函数的开发,最后是解决方案的开发。本文还将描述必要时如何用 DB2 Universal Database (UDB) 数据库替代 Apache Derby 数据库。本文假设您对 Apache Derby 数据库、Eclipse 平台和 DB2 plug-ins for Eclipse 有基本的理解。强烈建议您阅读 参考资料 一节中列出的文章“与 Apache Derby 一起使用 DB2 plug-ins for Eclipse”的两个部分。为了阐明应用程序开发中涉及的各种不同任务,作者 Gilles Roux 将提供关于如何构建一个示例应用程序的具体例子和逐步说明。在这个例子中,您需要开发一个命令行应用程序来执行一家书店的库存管理。书店的数据库存储了这家书店拥有的各种书籍,以及这些书籍的现有数量。这个示例应用程序将允许您访问这些数据,并允许您更改书籍的数量。例如,如果从一个供应商那里收到一批书,那么就要使用这个应用程序来添加所收到书籍的数量。如果书籍的数量超过或者低于某个限制,则需要用电子邮件通知管理员,以便其采取必要的行动。回页首开发环境工具Java Development Tools(JDT)是一组内建到 Eclipse 中的插件,为编辑、编译、调试、执行和部署一般用途的 Java 应用程序提供了一种方法。DB2 plug-ins for Eclipse 提供了连接到各种数据库(包括 IBM Cloudscape 和 Apache Derby)的一组功能。这个插件是以下几个插件的组合。 Connection Wizard:用于创建和连接 DB2、Cloudscape 或 Derby 数据库。 Database Explorer View:用于浏览数据库对象。 SQL Scrapbook:用于编辑和执行单独的 SQL 语句。 Database Output View:用于对一个表的内容进行抽样或者查看一条 SQL 语句的执行结果。 Migration Wizard:用于自动地将一个现有 Derby 数据库迁移到 DB2 UDB。 IBM integration plug-in for Derby 将很多有用的 Derby 工具集成到了 Eclipse 环境中。下面是该工具所提供的主要功能: Apache Derby Nature:使 Eclipse 项目可以执行 Derby 任务。 Network Server:直接从 Eclipse 项目中配置和启动 Derby Network Server。 IJ:直接在 Eclipse 控制台中以交互模式或脚本模式启动 Derby 命令行实用程序。 Sysinfo:显示与项目相关的 Derby 系统信息。 DB2 plug-ins for Eclipse 和 IBM Integration plug-in for Derby 是两个独立的工具,但是它们之间互补性很强,前者提供了一般数据库连接,而后者则提供了访问很多特定于 Derby 特性的访问途径。然而,很多任务都可以通过这些工具中的任意一个来执行,效果是一样的。本文提到了执行一个给定任务的各种不同方法,从而使每个用户都可以选择他们所喜爱的工作方式。安装工具首先要下载和安装 DB2 plug-ins for Eclipse。该产品包括 DB2 插件,并且是基于 Eclipse 3.0 的,后者本身就包括了 JDT。然后从 A 下载 Apache Derby plug-in,并在安装了前面软件的基础上安装此软件。最后,下载 IBM Integration plug-in for Derby 并在安装了 eclipse 的基础上安装此软件。该插件包括 JCC JDBC 驱动程序和 Derby 集成工具。设置开发环境如前所述,您将使用几种不同的工具来开发应用程序:DB2 plug-ins for Eclipse、IBM Integration plug-in for Derby 和 JDT。这些工具都是基于 Eclipse 的,因此它们可以很好地集成到一个单独的开发环境中。在开发应用程序时,通常要建立一些到数据库的连接: 使用 Database Explorer 浏览数据库。 使用 Derby ij 命令行实用程序执行 SQL 语句。 在测试时应用程序自己将连接到数据库。 Derby 数据库引擎可以在多种配置下运行。最简单的一种是嵌入式配置,但在这里不适合,因为需要通过运行在不同 Java 虚拟机上的几种工具建立连接。而且,在生产环境中,可能需要从多个应用程序中访问数据库。因此,这里使用 Network Server 配置。IBM Integration plug-in for Derby 提供了一种选择,以便可以很容易地从 Eclipse 项目目录中启动本地机器上的 Derby Network Server。接着要配置应用程序和其他工具,以连接到该网络服务器。下图展示了配置情况。图 1. 开发环境配置设置环境的第一步是创建项目。选择“File-New-Project-Java Project”并输入 bookstore 作为项目名称。这样就创建了一个 Java 项目,然后切换到 Java perspective(透视图)中。右击该项目并选择“Apache Derby-Add Apache Derby nature”。这样使您的项目可以使用 Apache Derby 特性,然后设置该 Java 项目的构建路径,以便应用程序可以访问 Derby 数据库和 JDBC 驱动程序。DB2 plug-ins for Eclipse 通常可以从 Data perspective 访问,并且无需与某个特定的项目相关联。为了简化开发过程,避免 Java perspective 和 Data perspective 之间的切换,需要将 DB2 plug-ins 视图,即 Database Explorer 视图和 DB Output 视图,添加到 Java perspective。这可以通过 Show View-Other 菜单来完成。下图展示了开发环境的外观。图 2. 开发环境布局回页首创建数据库在开始编写实际的应用程序代码之前,需要创建应用程序将要用到的数据库,或者连接到一个已有的数据库。首先通过右击项目并选择“Apache Derby-Start Derby Network Server”来启动 Derby Network Server。每次重新启动 Eclipse 时都需要执行这一步。这时项目图标上有一个绿色的箭头,表明服务器正在运行。创建数据库创建一个 Derby 数据库非常类似于连接到一个已有的数据库:通过将 create=true 属性包括在 URL 中,可以指示数据库引擎在您第一次连接到数据库时创建该数据库。这可以通过使用 DB2 plug-ins for Eclipse 的 Connection Wizard 来完成。下面的表展示了在这个向导中应该使用的参数。表 1. 连接参数Connection namebookstoredbDatabase ManagerApache Derby v10.0JDBC DriverIBM DB2 Universal需要使用这个参数来连接到网络服务器Databasebookstoredb要创建的数据库的名称Hostlocalhost网络服务器运行在本地机器上Port Number1527默认端口号Class Location比如: C:eclipseplugins com.ibm.cloudscape.ui_1.0.0db2jcc_license_c.jar;C:eclipsepluginscom.ibm.cloudscape.ui_1.0.0 db2jcc.jarCreate database if requiredyes需要使用这个参数在第一次连接时创建数据库User IDbookstore数据库上的认证没有被启用,因此可以使用任何用户,但是用户名将定义默认模式Passwordaaa数据库上的认证没有被启用,因此可以使用任何密码图 3. 使用 Connection Wizard 创建数据库完成该向导后,便创建了一个数据库,并且向 Database Explorer View 中添加了一个连接。通过展开连接的节点,就可以浏览这个数据库,但是显然这个时候它是空的。数据库被创建在 Derby 网络服务器的当前目录中,也就是之前创建 Eclipse 项目时所在的目录。可以通过右击项目名并选择 Refresh 来刷新该项目,这样将显示一个新的 bookstoredb/ 目录,该目录包含用于数据库的文件。不要试图修改这些文件,否则数据库会受到损坏。创建数据库对象接下来的步骤是创建应用程序将要用到的数据库对象。在这里,只需使用 SQL Scrapbook 创建一个表即可。SQL Scrapbook 可以通过右击连接名并选择“Open SQL Scrapbook”来调用。这时将打开一个新的编辑器,在这个编辑器中可以输入要发出的 SQL 语句:清单 1. CREATE TABLE 语句create table books( id int, title varchar(128), author varchar(128), price decimal(6,2), quantity int, status int)请注意,SQL Scrapbook 只能用于执行单条的 SQL 语句。而且,不要以分号来结束 SQL 语句。然后,可以按下主 Eclipse 按钮栏中的“Execute SQL statement”按钮。DB Output 视图应该显示结果是成功的。还可以刷新连接,以及验证数据库现在是否包含新创建的表。图 4. 使用 SQL Scrapbook 创建表创建测试数据现在通过执行 INSERT 语句向 books 表填充一些测试数据。这也可以通过 SQL Scrapbook 来实现,但这里我们使用了 IBM Integration plug-in for Derby 的“Run SQL script using ij”功能。这项功能允许使用 Derby 命令行实用程序执行 SQL 脚本,并在 Eclipse 输出视图中查看结果。这种方法的一大优点是:它允许一次执行多条语句。而且,这种方法要求在脚本的开始处包含一条连接语句,因此您可以对连接 URL 有更多的控制。表 2. SQL Scrapbook 和 IJ 脚本 之间的不同之处SQL Scrapbook执行 IJ 脚本语句存储在一个文件中不是是一次可以执行多条语句不是是语句终止符不允许有终止符分号编辑功能语法高亮显示,内容辅助没有到数据库的连接SQL scrapbook 被关联到一个给定的连接第一条语句应该是到所需数据库的一个连接构建 URL 的一种简便方法是复制 Connection Wizard 所使用的 URL:在数据库浏览器中右击连接,然后选择“Edit Connection”并访问“Connection URL”字段。这里需要添加用户名和密码作为 URL 属性。使用 Eclipse 在项目中创建一个名为 data.sql 的文本文件,并键入以下命令:清单 2. INSERT INTO 语句connect jdbc:derby:net:/localhost:1527/bookstoredb:user=bookstore;password=aaa;insert into books values(1, East Of Eden, John Steinbeck, 7.20, 3, 0);insert into books values(2, Hard-Boiled Wonderland and the End of the World, Haruki Murakami, 10.50, 9, 0);insert into books values(3, SQL for Dummies, Allen G. Taylor, 16.49, 6, 0);disconnect;然后就可以在 Project Explorer 中右击该文件并选择“Apache Derby-Run SQL script using ij”。Eclipse 的控制台输出视图将显示执行的结果,这个结果应该是成功的。然后可以在 Database Explorer 中选择 books 表,并选择“Sample Content”,以确信数据真正被插入到这个表中。图 5. 执行 SQL 脚本以插入数据回页首编写 Derby Client JDBC 应用程序装载 JDBC 驱动程序通过使用 Eclipse JDT 和 Derby JDBC 驱动程序,可以很容易地编写 JDBC 应用程序。首先使用 JDT Class 向导在 bookstoreapp.clientside 包中创建一个 Inventory 类,并在类中添加一个 main() 方法。由于启用了 Derby nature,所以包含 JDBC 驱动程序和 Derby 类的 JAR 文件已经位于项目的类路径中。在连接到一个 Derby 数据库之前,需要使用 Class.forName(jdbcDriverClassName) 方法装载适当的 JDBC 驱动程序。该方法将装载参数指定的 JDBC Driver 类,并注册这个类,以便进行下一次 JDBC 连接。可以使用两种不同的 JDBC 驱动程序,这取决于 Derby 配置:表 3. Derby JDBC 驱动程序配置Embedded ServerNetwork Server所需 JAR 文件derby.jardb2jcc.jar;db2jcc_license_c.jar类名org.apache.derby.jdbc.EmbeddedDrivercom.ibm.db2.jcc.DB2Driver由于这个例子是基于一个网络服务器配置,因此这里使用 jcc JDBC 驱动程序。如果不确定的话,那么正确的类名可以通过从 Connection 向导复制获得:清单 3. 装载 jcc JDBC 驱动程序Class.forName(com.ibm.db2.jcc.DB2Driver);连接到数据库DriverManager.getConnection(url) 方法用于建立到数据库的连接。它假设一个连接 URL,并返回一个 Connection 对象,这个对象可用于查询数据库。获得连接 URL 的一种好方法是在 Database Explorer 视图中编辑 Derby 连接,并复制从各个连接属性自动构造而成的连接 URL。出于安全的原因,这里没有显示用户名和密码,因此在应用程序代码中需要手动地将它们添加到 URL 的后面。图 6. 使用连接向导构建连接 URL其他选项也可以添加到 URL 的后面。例如,retrieveMessagesFromServerOnGetMessage=true 选项指示 JDBC 驱动程序从 Derby 服务器获取可读的错误消息,这在调试连接到远程 Derby 数据库的应用程序时非常有用。在本文的例子中,使用下列代码连接到 Derby 数据库:清单 4. 连接到数据库String url = jdbc:derby:net:/localhost:1527/bookstoredb;url += :user=bookstore;password=aaa;url += retrieveMessagesFromServerOnGetMessage=true;Connection con = DriverManager.getConnection(url);查询数据库一旦建立了连接,便可以通过使用 JDBC API 查询数据库。例如,您可以创建一个 Statement 对象,然后使用这个对象来执行对数据库的 SQL 查询。查询返回一个用于迭代查询结果集的 ResultSet 对象:清单 5. 执行查询并迭代结果集Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery(SELECT * FROM bookstore.books);while (rs.next() System.out.print(rs.getString(1) + , ); System.out.print(rs.getString(2) + , ); System.out.print(rs.getString(3) + , ); System.out.print(rs.getString(4) + , ); System.out.print(rs.getString(5) + , ); System.out.println(rs.getString(6);rs.close();stmt.close();图 7. 运行 JDBC 应用程序要了解关于使用 JDBC 的更多信息,请参阅本文 参考资料 一节中列出的 JDBC 教程。您可以下载 Inventory 类的完整代码。这个类实现了一个简单的文本界面,用于列出书店中的书籍以及更新书店中给定的某种书籍的数量。下面是应用程序输出的一个例子:图 8. Inventory 应用程序的示例输出回页首编写 Java 函数和过程前一节中讨论的 JDBC 应用程序对于开发用于用户的前端应用程序非常有用。然而,在这一层中实现重要的应用程序逻辑不是很妥当,因为应用程序逻辑放置在数据库之外,这使得数据库更容易受到损坏。例如,如果另一个 JDBC 应用程序连接到同一个数据库,那么就需要确保它实现相同的逻辑。对于这个问题,一种解决办法是通过使用触发器、存储过程和函数,在数据库中实现数据库规则。编写 Java 代码由于 Derby 是一种 Java 数据库,因此它没有自己的存储过程/函数语言,而是使用 Java 语言。可以通过创建一个 Java 方法,然后基于这个 Java 方法声明一个 Derby 过程或函数,从而创建 Derby 存储过程或函数(通常称为例程)。对 Derby 例程的调用将导致这个 Java 方法被调用。为了让这种调用获得成功,重要的是让 Derby 和 Java 例程的声明相匹配。下面的表展示了应该使用的 Derby 和 Java 特性的映射。表 4. 用于编写 Java 函数和过程的特性映射DerbyJava过程没有返回值的公共静态方法函数有一个返回值的公共静态方法输入参数(过程或函数)方法参数输出参数(过程)单入口数组参数输入/输出参数(过程)单入口数组参数返回值(函数)返回值返回的结果集附加的单入口 java.sql.ResultSet 参数表 5. 用于编写 Java 函数和过程的类型映射DerbyJavaSMALLINTshortINTEGERintBIGINTlongDECIMAL(p,s)java.math.BigDecimalREALfloatDOUBLE PRECISIONdoubleCHAR(n)StringVARCHAR(n)StringLONG VARCHAR*unsupported*CHAR(n) FOR BIT DATAbyteVARCHAR(n) FOR BIT DATAbyteLONG VARCHAR FOR BIT DATA*unsupported*CLOB(n)*unsupported*BLOB(n)*unsupported*DATEjava.sql.DateTIMEjava.sql.TimeTIMESTAMPjava.sql.Timestamp对于 Java 方法本身的内容没有约束,因此任何合法的 Java 代码都可以作为 Derby 过程或函数来调用。一种有趣的应用是使用标准 derby:default:connection URL 建立到 Derby 数据库的 JDBC 连接,以便查询发出调用的数据库。还可以使用完整 JDBC URL 连接到另一个数据库。对于本文的应用程序,需要在 bookstoreapp.serverside 包中创建一个 DerbyFunctions 类,用于容纳数据库服务器将要运行的所有 Java 方法。然后可以创建一个 updateQuantity 方法,当更新一种书籍的数量时,将调用该方法。调用该方法时需要提供这种书籍的 ID、title 和 author,以及旧的数量和新的 quantity。这个方法将返回一个整数值,用于表明是否到达数量限制。因此,这个 Java 方法的声明如下:清单 6. Java 方法的声明public static int updateQuantity(int id, String title, String author, int oldQuantity, int newQuantity)这个函数的作用是:当书的数量达到一个下界或上界时,就发送一封电子邮件。因此,可以声明 LOW_LIMIT 和 HIGH_LIMIT 常量,并测试旧的数量是否低于下界,新的数量是否高于上界或低于下界。如果条件符合,那么可以调用另一个负责发送电子邮件的 Java 方法。在这个例子中,只是输出一条调试消息,而不发送真正的电子邮件。下面是完整的代码:清单 7. DerbyFunctions 类package bookstoreapp.serverside;public class DerbyFunctions public static final int LOW_LIMIT = 2; public static final int HIGH_LIMIT = 10; public static int updateQuantity(int id, String title, String author, int oldQuantity, int newQuantity) if ( oldQuantity=HIGH_LIMIT ) sendEMailAlert(High limit reached, title: +title+, author: +author); else if ( oldQuantityLOW_LIMIT & newQuantity=HIGH_LIMIT) return +1; else if (newQuantityJAR file 来完成创建任务。然后可以使用下列命令(在 ij 中)将 JAR 文件安装到数据库中,并将其添加到类路径中:清单 12. 将 JAR 文件存储在 Derby 数据库中CALL sqlj.install_jar(functions.jar, bookstore.functionsjar, 0);CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY( derby.database.classpath, bookstore.functionsjar);做完这些后,Java 代码便属于数据库,这使得数据库的转移和启动变得很容易。整个数据库目录可以直接转移到一个完全不同的环境中,并且可以正常运行。网络服务器配置在开发应用程序时,我们使用了网络服务器配置,这样一来,应用程序的部署就会按正确的方式打包各个组件。在服务器端,需要安装: derby.jar,其中包含 Derby 数据库引擎。 derbynet.jar,其中包含网络服务器。 bookstoredb/ 目录,其中包含数据库,还包括带有函数的 JAR 文件。 这些组件可以复制到任何装有 JVM 的机器上,网络服务器可以使用下列命令来启动:清单 13. 启动 Derby 网络服务器java -cp derby.jar;derbynet.jar org.apache.derby.drda.NetworkServerControl start可以使用下列命令可以停止网络服务器:清单 14. 停止 Derby 网络服务器java -cp derby.jar;derbynet.jar org.apache.derby.drda.NetworkServerControl shutdown在客户端,需要安装: db2jcc.jar 和 db2jcc_license_c.jar,用于 JDBC 驱动程序。 inventory.jar,这个 jar 包含了应用程序的各个类。通过使用 eclipse 导出功能,可以很容易地基于应用程序包创建这个 JAR。 这些组件可以复制到任何装有 JVM 的机器上。当网络服务器正在运行时,可以使用以下命令启动应用程序:清单 15. 启动客户机应用程序java -cp db2jcc.jar;db2jcc_license_c.jar;inventory.jar bookstoreapp.clientside.Inventory下图阐明了网络服务器配置中应用程序的部署:图 11. 网络服务器部署配置下图展示了应用程序在生产环境中的执行:图 12. 已部署的网络服务器的执行图 13. 已部署的客户机应用程序的执行嵌入式服务器配置网络服务器配置也许最适合这种类型的应用程序,但是也可以使用嵌入式服务器配置,比如出于性能方面的原因。在部署应用程序之前,需要在代码中作一下修改,使连接指向嵌入式服务器,而不是远程服务器。这可以通过修改 JDBC 驱动程序类名和连接 URL 来实现这一点:清单 16. 新的连接代码Class.forName(org.apachy.derby.jdbc.EmbeddedDriver);String url = jdbc:derby:bookstoredb;完成这些修改之后,便可以使用 Eclipse 导出功能将应用程序的类打包到 JAR 文件中,并将下列文件部署到生产机器上: derby.jar,其中包含 Derby 数据库引擎和 JDBC 驱动程序。 inventory.jar,其中包含应用程序的类。 bookstoredb/ 目录,其中包含数据库,还包括带有存储过程和函数的 JAR 文件。 可以使用下列命令启动应用程序:清单 17. 启动应用程序java -cp derby.jar;inventory.jar bookstoreapp.clientside.Inventory下图阐明了应用程序在嵌入式服务器配置中的部署:图 14. 嵌入式服务器部署配置回页首迁移到 DB2虽然 Apache Derby 是一种非常健壮的、可伸缩的数据库,但是由于以下原因,您有理由转而使用企业数据库,例如 DB2 UDB: 功能缺乏。 性能受限。 需要与其他数据库集成。 由于有了 DB2 plug-ins for Eclipse,并且客户机应用程序是基于标准 JDBC 接口的,所以从 Derby 到 DB2 的迁移很容易完成。迁移数据库第一步是迁移数据库本身。DB2 plug-ins for Eclipse 提供了一个工具来自动地将 Apache Derby 数据库迁移到 DB2 for Linux、Unix 和 Windows。首先通过在 DB2 CLP 中发出 create database bookstoredb 命令创建一个 DB2 数据库。然后可以通过在 Database Explorer 视图中右击之前创建的 derby 数据库条目并选择 Migrate to DB2 UDB 动作来调用迁移工具。确保 DB2 服务器已经启动,并遵循使用说明来创建 DB2 数据库、迁移数据库对象和迁移实际数据。图 15. 使用 DB2 plug-ins for Eclipse 迁移 Derby 数据库手动迁移不受支持的对象完成了数据库的迁移之后,迁移工具会给出一个报告,指出迁移获得成功,但是有些对象不能迁移。当前版本的迁移工具不支持触发器和函数,因此需要手动迁移这些对象。Apache Derby SQL 语言是与 DB2 兼容的语言,因此可以重复使用以前的 SQL 语句来创建丢失的对象。在 Database Explorer 中右击 DB2 连接,并打开一个新的 SQL Scrapbook。包含 Java 函数的 JAR 文件的安装与 Derby 的安装类似,惟一的区别是无需将 JAR 文件添加到类路径。从 DB2 连接打开一个 SQL scrapbook,并输入以下命令:清单 18. 在 DB2 中安装 JAR 文件CALL sqlj.install_jar(functions.jar, bookstore.jar1, 0)为了创建函数和触发器,只需将之前使用的 SQL 语句复制和粘贴到 SQL scrapbook 中。记住,一次只能执行一条语句,因而不能使用冒号作为结束符。清单 19. 在 DB2 中创建函数和触发器create function bookstore.updateQuantity(id int, title varchar(128), author varchar(128), oldQuantity int, newQuantity int) returns intPARAMETER STYLE JAVA NO SQL LANGUAGE JAVAEXTERNAL NAME bookstoreapp.StoredProcs.updateQuantitycreate trigger bookstore.updateQuantityTrig after update of quantity on booksreferencing OLD as OLD NEW as NEW for each row mode db2sqlVALUES(updateQuantity(NEW.id, NEW.title, NEW.author, OLD.quantity, NEW.quantity)迁移客户机应用程序迁移客户机应用程序的主要工作是修改建立数据库

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论