![网络编程-第八章-访问数据库_第1页](http://file4.renrendoc.com/view/cdf7d8095e9e92849fc980aa2da18d8c/cdf7d8095e9e92849fc980aa2da18d8c1.gif)
![网络编程-第八章-访问数据库_第2页](http://file4.renrendoc.com/view/cdf7d8095e9e92849fc980aa2da18d8c/cdf7d8095e9e92849fc980aa2da18d8c2.gif)
![网络编程-第八章-访问数据库_第3页](http://file4.renrendoc.com/view/cdf7d8095e9e92849fc980aa2da18d8c/cdf7d8095e9e92849fc980aa2da18d8c3.gif)
![网络编程-第八章-访问数据库_第4页](http://file4.renrendoc.com/view/cdf7d8095e9e92849fc980aa2da18d8c/cdf7d8095e9e92849fc980aa2da18d8c4.gif)
![网络编程-第八章-访问数据库_第5页](http://file4.renrendoc.com/view/cdf7d8095e9e92849fc980aa2da18d8c/cdf7d8095e9e92849fc980aa2da18d8c5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章数据库JDBC是JavaSoft定义的数据库连接应用编程接口(JavaDatabase
Connectivity
API
),是Java
API的一部分。JDBC允许使用Java编写的各种应用程序(Application、Applet、Web
Application等)以相同的形式 、查询和修改 数据库。Java语言成为编写跨平台应用的最佳语言,JDBC技术起了非常重要的作用。第八章数据库学习以下几部分内容:本章中,JDBC简介JDBC基本应用元数据参数化查询调用 过程JJDDBBCC简基介本概念JDBC简介8.1节JavaSoft公司定义的数据库连接应用编程接口(JDBC,Java
DatabaseConnectivity
API),是Java
API的一部分。JDBC允许使用Java编写的各种应用程序(Applet、Application、WebApplication等)以相同的形式
、查询和修改
数据库。JDBC
数据库使用的语言是标准的SQL语言,这样Java应用程序就可以利用一个简单的、标准的API(JDBCAPI)建立连接,而不用考虑数据库平台的类型。JDBC特点JDBC简介8.1节1、调用级的SQL接口JDBC是一个Java语言在客户机上使用的调用级接口。它完全独立于各种DBMS。JDBC是一个低级的应用程序编程接口,允许Java程序发出SQL语句并接收SQL语句的执行结果。2、一致性的API的错JDBC提供与Java系统其他部分完全相一致的Java接口。3、简洁性JDBC的工作机制非常简洁,容易理解和使用。4、健壮性JDBC使用健壮、动态的数据类型,这样应用在编译时就会检查出误。Java应用程序DBMS数据库JDBC代码构成JDBC的组件JDBC简介8.1节JDBC连接数据库的典型结构主要有四个组件:一、JDBC应用程序二、驱动程序管理器三、驱动程序四、数据源构成JDBC的组件JDBC简介8.1节JDBC应用程序利用JDBC代码来连接数据库、向数据库系统发送SQL语句、接收SQL执行结果。这部分代码需要完成的工作有:向数据库系统发出请求建立连接向数据库系统发送SQL语句为返回的结果集中的数据确定相应的数据类型查询和处理结果集处理数据库异常关闭连接JDBC应用程序构成JDBC的组件JDBC简介8.1节JDBC驱动程序管理器的主要作用是帮助客户应用程序装载和实例化特定的驱动程序。它要完成的任务有:定位和装载特定数据库的驱动程序处理JDBC驱动程序的初始化工作可以管理多个不同的数据库驱动程序驱动程序管理器构成JDBC的组件JDBC简介8.1节驱动程序的任务JDBC驱动程序负责向数据库系统发送SQL语句,并接收执行结果。具体来说,驱动程序可以完成以下任务:建立与数据库的连接向数据库系统发送数据请求将数据库系统的错误代码转换为JDBC的错误代码可以管理结果集游标可以初始化事务驱动程序构成JDBC的组件JDBC简介8.1节分类JDBC驱动程序是独立与数据库系统的,但几乎所有的数据库系统都有自己的私有协议,来与客户端应用程序通信。所以JDBC驱动程序可以部分地利用这些已有的数据库引擎。按照JDBC对这些数据库引擎的依赖程度,JDBC驱动程序分为以下几类:JDBC-ODBC桥通过本地客户机网络代码连接数据库通过中间件连接数据库与DBMS直接连接驱动程序构成JDBC的组件JDBC简介8.1节类提供的唯一的JDBC驱动器。这种驱动器的作成相应的ODBC操作以满足应用程序的请求并返回结1、JDBC-ODBC桥JDBC-ODBC桥是Java用是把JDBC操作果。Java
类提供的JDBC驱动器的Java类名为sun.jdbc.odbc.JdbcOdbcDriver。驱动程序Java实现非Java实现优点:Windows操作ODBC,使得O建非常简单。缺点:是这种数据操作系统平驱动器的性JDBC驱动程序系统缺省地包括DBC数据源的创ODBC驱动程序本地驱动程序源通常只在Windows台上运网行络,驱同时动这程种序能也比较低.构成JDBC的组件JDBC简介8.1节2、通过本地客户机网络代码连接数据库多数数据库产品提供客户机接口,通过它与数据库服务器交互,如Oralce提供的SQL*PLUS程序。而使用SQL*PLUS之前必须安装Oralce网络
,这样客户机才能 数据库服务器。而这类JDBC驱动程序的作用就是将JDBC数据库调用转换为本地库调用。驱动程序本地驱动程序Java实现非Java实现优点:使用DBMS优化的本地客户驱动,可以获得较好的效率JD和BC速驱度动。程序缺点:这类驱动程序在发布时要求相应的客户机上都有安装网相络应驱D动BM程S序的客户机网络
。构成JDBC的组件JDBC简介8.1节3、通过中间件连接数据这一类驱动程序完全用Java编写,它将JDBC请求转换为一种独立于特定
DBMS的网络协议,并发送给一个中间件服务器。中间件服务器的作用是将这种协议转换为特定数据库的请求格式。缺点是要求服务器方组件;优点是当服务器上使用的数据库平台改变时可以不用修改客户端代码;驱动程序构成JDBC的组件JDBC简介8.1节4、与DBMS直接连接这类JDBC驱动程序完全用Java编写,这种JDBC驱动程序直接与数据库服务器进行通信。例如Oralce的这类JDBC驱动程序与数据库服务器之间打开一个套接字。这类驱动程序非常容易使用,因为要不需要其他客户机/服务器方的通信数据库只需要该驱动程序本身,,大大简化了应用程序的发布。驱动程序构成JDBC的组件JDBC简介8.1节数据源由用户应用程序要
的数据库系统和自身的参数组成。一般来讲,从Java程序角度而言,数据源体现为一种配置信息,它代表了Java要连接到
某种数据来源时应提供的参数。另外要注意的是,数据来源不仅仅是数据库,也可能是的响应、本地XML文件,甚至是本地的一个文本文件。使用数据源的概念,可以把各种异构的数据使用JDBC来。数据源构成JDBC的组件JDBC简介8.1节JDBC是Java应用程序和JDBC厂商之间的一种协约。它提供了Java程序员访问数据库的简单的、一致的调用形式。在应用程序 数据时,形成了由4部分构成的功能堆栈。由上至下是:Java应用程序JDBC驱动程序管理器驱动程序数据源四种组件间的关系Java应用程序JDBC驱动程序管理器JDBC网络驱动程序JDBC桥ODBC驱动程序JDBC驱动程序JDBC驱动程序本地驱动程序本地驱动程序网络驱动程序网络驱动程序网络驱动程序数据源A数据源B数据源C数据源DJDBC
APIJDBC简介8.1节由结构图可以看出,JDBC
API分为两种:JDBC
APIJDBC驱动程序API。JDBC网络驱动程序JDBC桥ODBC驱动程序JDBC驱动程序JDBC驱动程序本地驱动程序本地驱动程序网络驱动程序网络驱动程序网络驱动程序JDBC
API定义了用户与JDBC驱动程序管理器之间的接口,以及JDBC驱动程序管理器和各种不同的JDBC驱动程序之间的接口。Java应用程序
JDBC编程接口JDBC驱动程序管理器
JDBC驱动程序接口数据源A数据源B数据源C数据源DJDBC
APIJDBC简介8.1节提供的一些可编程的接口。供程序员JDBC
API是为数据库开发编程使用的常用的接口有:java.sql.DriverManager
:处理驱动器的加载、数据库连接的建立。java.sql.Connection
:java.sql.Statement
:处理特定数据库的连接。处理数据库连接中的SQL语句。有2个子接口java.sql.PreparedStatement
:用于处理带有参数的SQL语句。java.sql.CallableStatement
:用于处理数据库 过程java.sql.Result
:
用于处理数据库操作的结果集。-JDBC
APIJDBC
APIJDBC简介8.1节JDBC驱动程序API是为驱动程序供应商要遵循的编程接口:每一个JDBC数据库驱动器必须提供一个类实现java.sql.Driver,这个类的装载和实例化由java.sql.DriverManager来进行管理。所有数据库驱动器还必须提供对java.sql.Connection、java.sql.Statement、java.sql.PrearedStatement和java.sql.ResultSet等这几个接口的实现。这些实现工作一般是由JDBC生产厂商负责的。JDBC驱动程序API第八章数据库JDBC简介JDBC基本应用元数据参数化查询调用 过程准JD备BC使基用本JD应B用CJDBC基本应用8.2节在哪找到JDBC
API?JDBC
API的大部分的类和接口包含在java.sql包中,java.sql
含了大多数的Java标准发布版本中。另外JDBC的扩展API部分包含在javax.sql包中。可以
了吗?由于JDBC
API只是为数据库开发 提供的一个可编程的接口,因此,在使用JDBC
数据库之前,必须安装JDBC驱动程序:首先要
JDBC驱动程序,它通常打包为JAR文件,然后必须把该文件存放在CLASSPATH所包含的 中。数据源:然后,分以下几步装载驱动程序建立数据库连接建立语句发送SQL语句关闭数据库连接检索数据使用JDBCJDBC基本应用8.2节使用JDBC的第一步是指定数据库所需要的特定的JDBC驱动程序。主要有二种方式可以完成此操作。第 式是显式地装载JDBC驱动程序,只需要一行代码,例如:Class.forName("com.
.jdbc.sqlserver.SQLServerDriver");另com.式是直接调用DriverManager类的registerDriver()方法。例如:DriverManager.
registerDriver(new.jdbc.sqlserver.SQLServerDriver
());一、装载驱动程序若选用的JDBC驱动程序不存在或存放位置不在CLASSPATH内,上述代码会抛出ClassNotFoundException异常,因此通常要把此句封闭在try/catch块中。使用JDBCJDBC基本应用8.2节一旦装载了数据库驱动程序,第二步是建立到数据库的连接。这是通过DriverManager类的getConnection()方法来完成的。例如:Connectionconn=DriverManager.getConnection("jdbc:
:sqlserver://localhost:1433;User=example;Password=example;DatabaseName=Example")JDBC数据源URLJDBC数据源使用的URL语法的形式为:jdbc:<sunprotocol>:<subname>其中jdbc表示使用的协议是jdbc,sunprotocol字段表示使用的JDBC驱动程序名,subname是根据子协议而确定的参数字符串。立数据库连接使用JDBCJDBC基本应用8.2节Statement如果已经装载了数据库驱动程序并创建了数据库连接conn,现在可以向数据库服务器发送SQL语句。这是通过创建Statement对象来完成的。可使用
Connection对象的createStatement()方法创建该对象,例如:Statement
stmt=conn.createStatement();PreparedStatement如果需要向数据库服务器传递带参数的SQL,则应使用PreparedStatement对象,该对象是由Connection对象的prepareStatement()方法生成的,例如:String
sql=
"select
*
from
employee
where
salary>?";PreparedStatement
stmt=
conn.prepareStatement(sql);CallableStatement如果需要调用数据库的
过程,则需要创建CallableStatement对象来达到这一目的:String
callProc="{call
myproc}";CallableStatement
cstmt=conn.prepareCall(callProc);三、建立Statement对象使用JDBCJDBC基本应用8.2节一旦创建了Statement对象,下一步是把SQL发送到数据库。Statement对象有两个主要的方法用于此目的。使用哪个方法取决于是否需要返回结果。executeQuery()对于需要返回结果集的SELECT语句,应当使用executeQuery()方法,该方法只有一个字符串参数,用来存放SELECT语句,查询成功则以ResultSet对象的形式返回查询结果。例如:String
sql="select
*
from
students";ResultSet
rs=stmt.executeQuery(sql);executeUpdate()方法如果调用INSERT、UPDATE、DELETE不需返回查询结果的SQL语句,应采用executeUpdate()方法。
executeUpdate()方法也只接受String类型的SQL语句作参数,返回类型为int。如果返回值为0则表示SQL语句不返回任何数据,否则返回数据库中受到INSERT、UPDATE、DELETE语句影响的数据行数。例如:String
sql="DELETE
FROM
STUDENT
WHERE
SCORE
<=60";int
ret=stmt.executeUpdate(sql);四、发送SQL语句使用JDBCJDBC基本应用8.2节尽管不是必须的,但及时关闭到数据库的连接是一个很好的 。这样就确保及时 用于连接数据库的相应的资源。及时将宝贵的数据库连接归还给DBMS,可提高数据库并发处理能力。JDBC的Statement和Connection对象都有一个close()方法用于此目的。例如:
stmt.close();conn.close()五、管理数据连接使用JDBCJDBC基本应用8.2节六、检索数据KateResultSet对象John
21Kate22CurrentCurrentCurrentCurrentrs.next()rs.next()rs.next()truetruefalse遍当发历送R的esuSQltSLe语t对句象SELECT语句时,返回的是ResultSet对象表示的结果集,R它e包sul含tS了et对返象回提数供据了的可行以和逐列行。移动的游标。最初,游标位于数据集的第一行的前面,并且可以通过使用next()方法每次向前移动一行。next()方法的返回类型boolean,表示游标指向一行数据。随着游标的移动,可以通过get
方法获取当前行中各数据列中的数据。根据列的数据类型,采用R不es同ult的Se获t对取象方法。例如getString()、getDate()、getInt()等。这些方法的参数有Jo一hn个,2可1
以是表示列名的String类型,也可以是相应的列号的int类型。需要注意的是列名是大小写敏感的,列的序号是从1开始的。使用JDBCJDBC基本应用8.2节常用while或for循环遍历ResultSet对象,而do循环不太合适:Name
from
Employees
where
city='London'";……String
sql="select
LastName,rs=stmt.executeQuery(sql);while(rs.next()){rowNum++;lastName=rs.getString("lastName");Name=rs.getString(2);address=rs.getString(3);System.out.println(rowNum+
""
+Name
+
","
+
lastName
+
"
"
+
address);}……六、检索数据例一:连接数据库的控制台程序例二:在JSP中数据库第八章数据库JDBC简介JDBC基本应用元数据参数化查询调用 过程元数数据据8.3节访问元数据元数据可以看作描述数据的数据。对于数据库而言,元数据可以是数据库的名称,数据库中表、视图、 结构的列表,数据库用户及权限的列表等信息;对于数据库的表而言,元数据可能是表的名称,表中各列的列名、列数据类型、数据程度等信息。在Java程序中,使用JDBC,可以通过DatabaseMetaData对象获得数据库的元数据,或者通过ResultSetMetaData对象获得查询得到的ResultSet元数据。获取数据库元数据8.3节访问元数据DatabaseMetaData接口由JDBC驱动程序厂商实现以便JDBC用户能够获得
DBMS的相关信息。该接口常用的方法有:public
StringgetDatabaseProductName()返回数据库产品名public
String
getDatabaseProductVersion()
返回数据库产品的版本号public
String
getDriverName()
返回JDBC驱动程序的名称publicint
getMaxConnections()返回数据库可以同时打开的最大的连接数publicResultSet
getSchemas()
返回连接的数据库的所有的数据库方案的名称public
ResultSet
getTables()
返回相应数据库方案下的表的描述信息。获取DatabaseMetaData接口DatabaseMetaData对象通过Connection对象的getMetaData()方法获得。<%@
page
contentType="text/html;
charset=GBK"
%><%@
page
import="java.sql.*"
%><html><head>
<title>DataBase
MetaData
Test</title>
</h
d><body
bgcolor="#ffffff"><h2>Database
Information:</h2><%try{DriverManager.registerDriver(new
com.Connection
conn=DriverManager.getConnection("jdbc:.jdbc.sqlserver.SQLServerDriver
());:sqlserver://localhost:1433;User=example;Password=example;DatabaseName=Example");DatabaseMetaData
dbmd=conn.getMetaData();%><table
width="90%"
border="1"><tr><td>Database
Produce
Name:</td>
dme()%></td>
</tr><tr><td>JDBC
Version:</td><td><%=dbmd.getJDBCMajorVersion()
+
"."
+
dbmd.getJDBCMinorVersion()%></td>
</tr><tr><td>URL:</td>
<td><%=dbmd.getURL()%></td>
</tr></table><%
conn.close();}catch(SQLException
e){
out.println(e.getMessage();
}%></body></html>获取数据库元数据载入JDBC驱动程序,然后建立tryjava.sql包。使用JDBC所用的类和接口大多定义在该包中。<tr><td>Database
Produce
Version:</td>获得数据库的元数据对象。
ersion()%></td>
</tr><tr><td>Driver
Name:</td>
<td><%=dbmd.g
块中以测试异常。输出元数据对象中的数据。获取结果集元数据8.3节访问元数据查询得到ResultSet后,可对其调用getMetaData()方法获得ResultSetMetaData对象。ResultSetMetaData接口由JDBC驱动程序厂商实现,向JDBC程序员提供有关ResultSet对象中的数据列的类型和属性等信息。该接口常用方法有:publicint
getColumnCount()返回ResultSet对象的数据列的数目public
String
getColumnName(int
column)返回相应列的名称,需要注意的是列号是从1开始计数的。publicint
getColumnType(int
column)返回相应列的SQL类型,返回值是java.sql.Types中定义的常量值。同样,列号是从1开始计数的。int
count=rsmd.getColumnCount();for(int
i=1;
i<=count;
i++){String
colName=rsmd.getColumnName(i);
%><td>
<%=colName%>
</td><%
}
%></tr><%while(rs.next()){out.println("<tr>");for(int
i=1;
i<=count;
i++)
out.println("<td>"
+
rs.getString(
i
)
+
"</td>");out.println("</tr>");}}catch(Exception
e){}%>……获取结果集元数据……<tr><%try{DriverManager.registerDriver(new
com.
.jdbc.sqlserver.SQLServerDriver());Connection
conn=DriverManager.getConnection("jdbc:
:sqlserver://localhost:1433;User=example;Password=example;DatabaseName=Example");Statement
stmt=conn.createStatement();ResultSet
rs=stmt.executeQuery("select
name,
,passw d
from
userinfo
where
city='London'");ResultSetMetaData
rsmd=rs.getMetaData();
载入驱动、建立连接、建立从数据集获取元数据对象从元数据对象获取结果集列数,然后用for循环输出每一列。输出结果集。第八章数据库JDBC简介JDBC基本应用元数据参数化查询调用 过程关参于数参化数查化询查询8.4节参数化查询尽管Statement接口可以满足通常的SQL语句的需要,但是在很多情况下,
SQL语句中的一些条件或数值只有在运行时才会知道,例如新的用户的相关信息只有一个新用户时才会获得用户名和口令等信息。这时就会用到Statement接口的一个子接口:PreparedStatement接口。PreparedStatement接口8.4节参数化查询使用PreparedStatement接口,可将包含参数的SQL语句事先发送SQL语句到数据库引擎进行分析和编译,而SQL查询中将要变化的部分可以在运行过发送到数据库。获得PreparedStatement接口为了获得PreparedStatement接口,可在建立到数据库的连接后,调用连接对象的prepareStatement()方法。该方法接受一个参数化SQL语句,返回新建语句对象的PreparedStatement接口。参数化SQL:在查询或更新数据库的参数化SQL语句中,不确定的数值用问号代替。这样的SQL语句字符串不是作为executeQuery()方法的参数,而是用在创建PreparedStatement对象时。查询参数的值直到调用executeQuery()之前,才使用PreparedStatement对象的set
方法来设定。PreparedStatement接口8.4节参数化查询参数化SQL中的参数是用占位符
?来表示的,如:String
sqlstr
=
"selectname, from
userinfowhere
city=?
And
salary>?
";PrepareStatement
stmt=conn.prepareStatement(sqlstr);stmt.setString(1,
"London");stmt.setDouble(2,
5000);ResultSetrs=stmt.executeQuery();使用prepareStatement接口进行查询。在调用executeQuery方法提交查询之前,应先调用set
方法设置SQL参数值。注意参数序号从1开始。第八章数据库JDBC简介JDBC基本应用元数据参数化查询调用 过程为了在Java程序中利用JDBC调用数据库中的
过程,不应使用Statement对象,而是使用CallableStatement对象。调用过程aC调a用llt过ate程ment接口8.5节调用存储过程使用CallableStatement接口的基本语法如下:String
callProc="{call
myproc}";CallableStatement
cstmt=conn.prepareCall(callProc);ResultSet
rs=cstmt.executeQuery();其中:1、为了新建一个过程调用对象,应使用连接对象conn的prepareCall方法。该方法接受一个表示 过程调用的字符串,返回新建的 过程调用对象的CallableStatement接口。2、注意调用 过程的字符串放在括弧内。因为调用过程的语法不是标准SQL的一部分,括弧使JDBC通过转义支持 过程调用语法。CallableStatement接口用存储过程8.5节调和一般的函数与过程相同, 过程可以传入参数(在过称为IN参数)和提供返回结果参数(在
过 称为OUT参数)。在调用过程的SQL字符串中,使用占位符?表示这些参数。一个典型的 过程调用如下:String
callProc="{?=call
callProc(?,
?,
?)
}";CallableStatementcstmt=conn.prepareCall(callProc);//……处理IN参数
cstmt.execute();//……处理OUT参数和返回值要补充的是:1、上述SQL中并没有指示参数的类型和方向。为了正确地向IN参数输入值,从OUT参数获得输出值,需要在调用executeQuery前后对这些参数的类型和值进行处理。2、处理上述SQL中的参数时,?
是从1开始的。调用过程CallableStatement接口8.5节调用存储过程在获得CallableStatement接口后、调用executeQuery方法之前。需要调用以下方法准备所有输入参数,以指定参数的类型和值:cstmt.setString(2,
"John");cstmt.setInt(3,
112);cstmt.setDouble(4,
23.5);String
callProc="{?=call
callProc(?,
?,
?)
}";上述例子相当于把准备向数据库提交的 过程调用SQL设置为:{
callPr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教版数学七年级下册知识点
- 粤教版地理八年级下册第六章第4节《西部地区》听课评课记录4
- 湘教版数学八年级下册1.2《直角三角形的性质和判定(II)》听评课记录
- 小学二年级数学100道口算题
- 湘教版数学七年级下册2.2.2《完全平方公式》听评课记录1
- 人教版数学七年级下册听评课记录9.1.1《 不等式及其解集》
- 2025年水利管理及技术咨询服务项目合作计划书
- 合伙开餐饮餐馆项目协议书范本
- 融资咨询代理协议书范本
- 网络设备租赁合同范本
- 河北省邯郸市永年区2024-2025学年九年级上学期期末考试化学试卷(含答案)
- 油漆工培训试题
- 2024年四川绵阳初中学业水平考试英语试卷真题(含答案详解)
- 2025年阀门和龙头项目发展计划
- 快手信息流广告优化师(初级)认证考试题库(附答案)
- 消防员证考试题库2000题中级
- 农产品质量安全检测技术
- 【蝉妈妈】2024年抖音电商酒水行业趋势洞察报告
- 物业员工行为规范管理手册
- 海洋垃圾处理行业可行性分析报告
- 小型家用电器制造工(省赛)理论考试题及答案
评论
0/150
提交评论