中文-第二章jdbc编程在JavaWeb中有大量的操作是对数据库进行_第1页
中文-第二章jdbc编程在JavaWeb中有大量的操作是对数据库进行_第2页
中文-第二章jdbc编程在JavaWeb中有大量的操作是对数据库进行_第3页
中文-第二章jdbc编程在JavaWeb中有大量的操作是对数据库进行_第4页
中文-第二章jdbc编程在JavaWeb中有大量的操作是对数据库进行_第5页
免费预览已结束,剩余31页可下载查看

下载本文档

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

文档简介

第二章JDBC本章要API来操作数据库。本章介绍JDBC相关的知识。JDBC简JDBCJDBC(JavaDatabaseConnectivity,Java数据库连接)SQLJavaAPI,可以为多种关系数据库提供统一的接口。JDBC由一组用Java语言编写的类与数据库系统(Access、Server2000、Oracle、Sybase等)SQL语言来存Java程序代码。JavaJDBCJava应用程序与各用Java和JDBCAPI发布含有Applet的网页,而该Applet使用的信息可以来自服务JDBCSQL语句传送给几乎任何一种数据库,即可以不必写一个程序Sybase或Oracle,再写一个程序MSSQLServer。用JDBC写的程序SQL语句传送给相应的数据库管理系统(DBMS)Java编写的应用程序可以在任何支持Java的平台上运行,不必在不同的平台上编写不同的应用程序。JavaJDBC简单地说,JDBC3SQL以通过JDBC向数据库下达SQL命令,对数据库进行新增、删除和修改记录等操作,这一的结果,以HTML的形式通过HTTP协议,回传给前端的浏览器。在这整个存取架构中最重要的部分就是JDBC。没有JDBC,我们的JSP程序根本没有办法和数据库相连,如图2-1所示。 2-1存取WebJDBCJSP/ServletJDBC的论述主要JavaJavaWebJDBCJDBCAPI通过一个数据库管理器(DatabaseManager)和为各种数据库定制的驱动程序提供与不同数据库的透明连接。JDBC数据库管理器将确保正确的驱动程序被用于连接数JDBCJDBC指令转换成适用于不同数据库通信的网络协议指令或其他API指令。这种指令的转换机制,使基于JDBC接口开发的程序可以独立于数据JDBC数据库连接对站来说是最重要的部分.很多数据库系统带有JDBC驱动程序,JDBC驱动程序与数据库相连,执行查询和提取数据等操作。目前,JDBC的驱动程JDBC-ODBC1JDBCODBC,JDBC-ODBC基于JDBC的程序能通过传统的ODBC驱动程序数据库由于大多数数据库系统都带有ODBC驱动程序,所以Java程序能诸如Oracle、Sybase、MSSQLServer和MSJava2JDBC驱动程序使用Java本地接口(JavaNativeInterfce)向本地的数据库API发Java3Java的驱动程序,它通过—定的网络协议与数据库服务器上的类驱动程序是最灵活的JDBC方案因为它不要求在数据库的Java程序所在个地端安Java第4类驱动程序也是纯Java的,它通过实现一定的数据库协议(oracle公司的是4种驱动程序中最高的。其缺点是:当目标数据库的类型更换时,必须重新JDBCJDBCjdbc子协议名子名称jdbc子协议名子名称jdbc:odbc:<data_source_name>[<attribute_name1>=<attribute_value1>]JDBC-ODBCjdbc:odbc:<data_source_name>[<attribute_name1>=<attribute_value1>]data_source_nameJDBCURL:JDBCURLodbcmydbme,数据源的口令为pass。注意,当数据库为不具有服务器功能的本地数据库如APIOracle,Oracle数据库服务器名称可以是一个也可以是IP地址“portNumber”为Oracle数据库使用的端,默认为1521,如果你在安装Oracle数据库的时候没有去修改它,那1521就可以了,而“dataInstance”是数据库的实例名,根据情况使用。OracleOracle9iOracle8i/Oracle面,JDBC的设计目标之一就是让它成为一个公共的接口,对于不同的数据OracleJDBCJDBC-述,主要是介绍如何设置ODBC数据源的(以Access数据库为例),如果读者有过ODBCJDBC编程方式的理解。ODBC建立一个ODBC数据源以便于以后的讲解和使用下面以连接Access数据库student.mdbODBCWindows200操作系统为例进行说明的,Windows98/NT/XP操作系统与此类似。ODBC据源(ODBC)DSN2-2所示画面。画面中显示了图2-2用户数据源在使用上的区别在于DSN”上设置的DSN只能在使用进行设置DSN”则针对任何登2-3在图2-3中的数据源名文本框里为数据源命名这里输入的是NIT-Pro了使这个数C:\JavaWeb\student.mdb数据库。单击“确定”按11-4所示的画面。2-42-52-5本框里输入,然后单击“确定”按钮,又回到图2-2所示的画面,再单击“确定”AccessNIT-ProAccess数据库,即student.mdb。用户在编写Java程序时,就可以将这个数据源作为数据库的连接对象OracleOracle在使用Oracle数据库的时候,需要使用它所提供的驱动,在安装完Oracle数据库后,可以在它的安装路径下找到,对于Oracle9i(Oracle8i也类似),可以在<安装目 量CLASSPATH中去就可以了。createtablestudents(student_idvarchar2(20)primarykey,student_namevarchar2(20)notnull,student_ageintegernotnull,student_sexchar(1)not)insertintostudentsvalues('Eng001','Diana',23,'F');insertintostudentsvalues('Cas001','Alex',30,'M');在本书中我们假设使用的Oracle数据库实例名称为O9I,使用下面createtablestudents(student_idvarchar2(20)primarykey,student_namevarchar2(20)notnull,student_ageintegernotnull,student_sexchar(1)not)insertintostudentsvalues('Eng001','Diana',23,'F');insertintostudentsvalues('Cas001','Alex',30,'M');SQLPlus等,都不在本书的讨论范围,请读者参考相关的资料。Tomcat如果需要在JSP/Servlet中使用Oracle的JDBC驱动,那么需要将<安装目 下的classes12.jar文件拷贝到<tomcat安装 这样,就可以在JSP/Servlet中使用Oracle的JDBC驱动了。通过JDBC数据JDBC数据库的基本步下面我们就来学习如何使用JDBC数据库JDBCJDBC驱动程序。这需JDBC驱动程序:使用Class类的forName()方法来装载数据库驱动类并且进行类的初始化等操作。对于数据库驱动程序来说,还会向DriverManager自己,这是在使用JDBC的程序中商提供的JDBC驱动程序的种类来确定。对于JDBC-ODBC桥,加载JDBC-ODBC数据库Oracle另外,除了在代码中写出相关的连接URL、用户名、外,为了提供更好的可移植OracleSpertiestryPropertiesprops=tryPropertiesprops=newFilef=newFile("C:\\OracleSperties");FileInputStreamin=newFileInputStream(f);oracle_url=props.getProperty("oracle_url");oracle_name=props.getProperty("oracle_name");oracle_user=props.getProperty("oracle_user");oracle_pwd=props.getProperty("oracle_pwd");}catch(IOExceptione){}oracle_url=jdbc:oracle:thin:@localhost:1521:O920oracle_name=O920oracle_user=scottoracle_pwd=PropertiesgetProperty()oracle_urloracle_pwdJDBC操作数据库之前,必须首先打开一个数据库连接,创建和指定数据库的DriverManager类的getConnection()方法,其一般的使用格式如下:Connectionconn=DriverManager.getConnection(Stringurl,Stringuser,StringConnectionconn=DriverManager.getConnection(Stringurl,Stringuser,Stringjava.sql.ConnectionURLURL格式是不同的。ConnectionConn=ConnectionConn=OraclethinConnectionConnSQLSQLStatementSQL语句发送给数据库。SQL语句运行后产生结果集,StatementResultSet对象。Statementsmt=StatementStatementsmt=SQLResultSetrs=smt.executeQuery("SELECT*FROMStatementexecuteQuery()方法来执行数据库查询语句,executeQuery()方法返回一个ResultSet类的对象,它包含ResultSetrs=smt.executeQuery("SELECT*FROMSQLJDBCResultSetResultSet对象包含了执行某个SQL语句后满足条件的所有的行,它还提供了对这些行的,用户可以通过一组get方法来当前行的不同列。通常结果集的形式是一张带有表头和相应数据的表。一个Statement对象在同一时间只能打开一个结果集,所以如果在同一个Statement对象中运行下一条SQL语句时,第一条SQL语句生成的ResultSet对象就被自动关闭了。当然也可以通过调用ResultSet接口的close()方法来手工关闭。关闭Statement对象和Connectionclose()方法。JDBCJDBC所提供的类和接口到JDBC3.0版时已经增加到29个,而这些类接口所提供的方法非常多,我们无法一一详细的介绍,详细的参考信息,你可以在 DriverManagerstaticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)throwsSQLException这个类负责管理JDBC驱动程序。我们使用JDBC驱动程序之前,需先将驱动法来完成。然后,我们就可以使用DriverManager类提供的方法staticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)throwsSQLExceptionurlstaticDrivergetDriver(Stringurl)throwsstaticDrivergetDriver(Stringurl)throws这个方法可以向已经在DriverManager的驱动程序中寻找一个能够打开url所指2-1JDBCimportimportpublicclasspublicstaticvoidmain(Stringargs[]){//StringConnection}catch(SQLExceptione){}}}}importOracleimportJDBCConnection当我们通过Class.forName()正确的 并加载JDBC驱动程序后,接下来就要建立和Connection我们利用java.sql.DriverManager类提供的getConnection()方法来建立与数据库的连接,scottConnectionisClosed()方法来判断连结是否打开了,如果isClosed()方法返回false,那么表示数据库连接是打开的否则如果isClosed()为true,ConnectionConnection接口用于应用程序与数据库之间的静态连接。它提供了进行事务处理的方法以及创建执行SQL语句和过程所用对象的方法,同时它还提供了一些基本的错误处理方法。Connection接口提供的常用方法如下:StatementcreateStatement()SQLStatementPreparedStatementprepareStatement(Stringsql)PrepareStatement对象,DELETE语句,或是无返回结果的语句;voidclose()ConnectionbooleanisClosed()ConnectionStatement参数其主要功能是将SQL语句传送给数据库并将SQL语句的执行结果返回StatementResultSetexecuteQuery(Stringsql)SQL查询语句,返回满足条件的结果集。sql是一个查询语句;intexecuteUpdate(Stringsql)SQL数据更新语句(INSERT、UPDATEbooleanexecute(Stringsql):执行任意SQL语句。如果第一个结果是ResultSet,则返回true;否则如果是整数型,则返回false。参数sql可以是任SQL语句。SQL语句。voidclose()Statement通过Connection接口提供的createStatement()方法,可以建立Statement对象。当建立好Statement对象之后,就可以使用executeQuery()方法对数据库表中的数据进行查询importjava.sql.*;importjava.sql.*;publicclassInsertData{publicstaticvoidmain(Stringargs[]){new//SQLStringsql="insertintostudents//StringConnectionStatementstmt=//SQLintaffectedRow=stmt.executeUpdate(sql);}catch(SQLExceptione){}}}ConnectionConnectionintaffectedRow=intaffectedRow=SQLinsertexecuteUpdate()方法,它将会返回一个受影响的行数,紧接着executeUpdate()方法便会通过由Connection类对象所的数据库连接,实际将SQL命令传给数据库以进行新增记录的。excuty(excuteUpdate(Lexectey(当我们使用L命令T对数据库做查询时需使用excuteQuery(方法而execueQuery(方建立一个Ret对象保存查询的结果除了T命令之外的其它L命令如ITEdtep等操作数据库令我们execueUpdateStatementStatementsmt=ResultSetResultSet接口用于得到包含了执行SQL查询语句返回的结果集,这个结果集实质上上面(不指向任何记录)next()方法,它就向下移动一行,到达目标行之后,getXXX()方法得到目标的字段值。ResultSet接口提供的常用方法如下:booleanrelative(introw)rowrow是正booleanfirst()1个记录,返回布尔值,只能用于可滚动结果booleannext()intgetInt(intColumnIndex)Javaint类型表示的字段longgetLong(intColumnIndex)Javalong类型表示的floatgetFloat(intColumnIndex)Javafloat类型表示的doublegetDouble(intColumnIndexJavaDouble类型表DategetDate(intColumnIndex)java.sql.DateDate类型表示byte[]getBytes(intcolumnIndex):返回指定字段的以字节数组形式表示的字ColumnIndexgetXXX()Javaint或者integer的字段,对应的Java数据类型是int,应该使用ResultSet类的getInt()方法去。表2-1列出了SQL数据Java数据类型之间的对应关系。需要提醒读者的是,因为各种数据库之间的差异,SQL数据类型。2-1SQLJavaSQLJavaimportimportpublicclasspublicstaticvoidmain(Stringargs[]){newStringStatementstmt=conn.createStatement();ResultSet"select*fromstudentsorderbystudent_id"); System.out.println("studentid: studentname:}}catch(SQLException}}}}Statement类提供的方法executeQuery()ResultSetResultSetrs=stmt.executeQuery("select*fromstudentsorderbyexecuteQuery()studentsResultSet对象中。我们在程getString()students数据表内记到下一笔记录时若是成功的话会返回boolean值true,这使得while循环得以再度执行,如while循环再次调studentid: studentname:studentid: studentname:studentid: studentname:另外,如果字段中保存的数据是二进制数据,对应的方法如下if(rs!=null)while(rs.next())byte[]imgBytes=if(rs!=null)while(rs.next())byte[]imgBytes=//}}PreparedStatementStatementSQL语句传递给数据库。这SQLSQL语句是查询以当单一的SQL语句在程序中被执行多次时,使用PreparedStatement对象来执行SQL语PreparedStatementSQLSQL语句,就是可以SQL语句中提供参数,这可大大提高程序的灵活性和执行效率。PreparedStatementResultSetexecuteQuery()SQLSELECT对数据库进行查询记录的voidsetInt(intparameterIndex,intx)PreparedStatementINparameterIndexSQLIN参数。voidsetNull(intparameterIndex,intsqlType):将 型数赋PreparedStatementINININ参数voidsetTime(intparameterIndex,Timex)INvoidsetBinaryStream(intparameterIndex,InputStreamx,intlength):将长度为lengthPreparedStatementINPreparedStatementimportjava.sql.*;publicimportjava.sql.*;publicclassPrepStmt{publicstaticvoidmain(String[]}}}newStringurl="jdbc:oracle:thin:@localhost:1521:ora8";Connectionconn=DriverManager.getConnection(URL,Stringsql="insertintostudentsvalues(?,?,?,?)";PreparedStatementstmt=conn.prepareStatement(sql);}catch(SQLExceptione){}studentsPreparedStatement对SQL语句时,用“?”作为动态参数的占位符。例如:StringStringsql="insertintostudentsPreparedStatementConnectionprepareStatement()方法,Connection对象名为connPreparedStatementprepare的语句为:PreparedStatementPreparedStatementstmt=PreparedStatementSQL语句作为数,这些占位符参数称为IN参数。为了传递这些IN参数,需要调用PreparedStatement对setXXX()方法,其中,XXX根据不同的数据类型选择。例如,为上例创建的stmt对象传递的IN参数有四个,它们分别对应数据库的字段student_idsetInt()方法:将数据“Jerrystmt2INResultSetResultSetResultSet类来对数据库进行增加、删除以及修改的操作。如果要使用ResultSetJDBC2.0Statementstmt=Statementstmt=对于PreparedStatementPreparedStatementpstmt=其中,typeResultSetconcurrencyResultSet来更新2-2type2-3concurrency2-2type2-3concurrency当使用TYPE_SCROLL_INSENSITIVE或者TYPE_SCROLL_SENSITIVE来创建Statement对象时,可以使用ResultSet的first()/last()/beforeFirst()/afterLast()/relative()/importimportpublicclasspublicstaticvoidmain(Stringargs[]){newStringStatementstmt=conn.createStatement(Stringsql="select*fromstudentsorderbystudent_id";ResultSetrs=stmt.executeQuery(sql);System.out.println("studentid:"+rs.getString(1) studentname:System.out.println("studentid: studentname:}catch(SQLExceptione){}}}在这个程序中,我们使用TYPE_SCROLL_INSENSITIVE和CONCUR_READ_ONLY两个参数来创建Statement对象,然后,获取ResultSet,这个ResultSet对象rs就是可滚动的结果集此时就可以使用ResultSet的包括next()在内的其他移动指针的方法如:last()、studentid: studentname:studentid: studentname:Statement的时候指定第二个ResultSet.CONCUR_UPDATABLE。集。可以使用ResultSet类的getConcurrency()ResultSet中的下列方法来对数据库进行更新updateXXX(intfieldNum,XXXdata)getXXX()/setXXX()类似的方法,其需要更新的数据。另外也可以更新指定字段名称对应的数据,使用updateXXX(StringfieldName,XXXdata)fieldName就是我们要更新的updateXXX()方法只会修改结果集中updateXXX()方法后执updateXXX()updateXXX()方法后移动了指针,将updateXXX()方法来向这个当前为空的行中插入数据,注意,在执行完updateXXX()方法的时候,需要调用insertRow()方法,来将新增到结果集:将指针移回到调用在这个例子中,所有学生的都加一岁importjava.sql.*;importjava.sql.*;publicclassUpdResult{publicstaticvoidmain(Stringargs[]){newStringStatementstmt=conn.createStatement(Stringsql="selectstudents.*fromstudentsorderbystudent_id";ResultSetrs=stmt.executeQuery(sql);//intage=}}catch(SQLExceptione){}}},,JDBC中使用可更新的结果集来更新数据库,不能使用“select*fromtable”方式的SQL语句,必须将它写成如下两种形式之一:selecttable.*fromselectcolumn1,column2,column3from在JDBC中如何去调用一个过程呢?是Statement或者PreparedStatement,通过这个CallableStatement对象,就可以去调用数据ConnectionprepareCall()CallableStatementconn.prepareCall("{call 过程名称如果过程有参数conn.prepareCall("{callconn.prepareCall("{call其中,占位符“?”是IN、OUT还是INOUT取决于 conn.prepareCall("{call?=conn.prepareCall("{call?=conn.prepareCall("{callcreateorreplaceprocedureinsert_students(stu_idINchar,stu_nameINchar,stu_ageINinteger,stu_sexINchar)createorreplaceprocedureinsert_students(stu_idINchar,stu_nameINchar,stu_ageINinteger,stu_sexINchar)/insertintostudents我们再来看如何使用JDBC调用这个过程importjava.sql.*;publicclassCallSP{publicstaticvoidmain(String[]args){newStringStringsql="{callinsert_students(?,?,?,?)}";CallableStatementstmt=conn.prepareCall(sql);}catch(SQLExceptione){}}}CallableStatement,并且将调用过程“insert_students”的语句“{callinsert_students(?,?,?,?)}importjava.sql.*;publicclassCallSP{publicstaticvoidmain(String[]args){newStringStringsql="{callinsert_students(?,?,?,?)}";CallableStatementstmt=conn.prepareCall(sql);}catch(SQLExceptione){}}}如果你使用的JDBC版本是3.0(被包含在JDK1.4变量的类型,可以通过java.sql.Types的静态常量来指定,例如,Types.FLOAT、Types.INTEGERINsetXXX()方法来指定就可以了。指定了IN/OUT参数后,就可以使用stmt的execute()方法来执行对过程的调用下面我们来看一个例子,首先我们定义一个过程如下createorreplaceproceduretotal_students(numsOUTinteger)createorreplaceproceduretotal_students(numsOUTinteger)selectcount(*)INTOnumsfrom/importjava.sql.*;importjava.sql.*;publicclassCallSPOut{publicstaticvoidmain(String[]args){newStringCallableStatementstmt=conn.prepareCall("{call}}}catch(SQLExceptione){}}CallableStatementregisterOutputParameter()来指定输出参数的数据类型,然后使用CallableStatement对象的getXXX()方法来取出输出数据,这两个地方的数据类型必须匹配还有就是在这里的getXXX()方法是CallableStatement对象ResultSet的方法。JDBC中,怎么处理事务呢?利用Connection对象的 自动提交。还可以使用Connection对象的 打开。如果将自动提交功能关闭,那么,就可以调用Connection的commit()方法来提交所有更新或者rollback()方法来取消更新。importjava.sql.*;publicimportjava.sql.*;publicclassTrans{publicstaticvoidmain(Stringargs[]){Connectionconn=null;newStringurl=}}}//执行SQL语句 }catch(SQLException{}catch(SQLException{}}mitconn=DriverManager.getConnection(url,"scott","tiger");Statementstmt=conn.createStatement();Stringsql1="insertintostudentsvalues('IBM001','Jenny',30,'F')";Stringsql2="insertintostudents将自动提交功能关闭的情况下,如果所有的SQL语句都正确执行了,那么需要调用Connection的commit()方法提交事务,如果出现异常,需要调用Connection的rollback()方SQL语句)集合到一起执行,以提高效率。JDBCStatementaddBatch()方法向其中加入SQL语句,然后,使用Statement对象的executeBatch()方法来一次执行加入到批处理中的SQL语句。注意,在使用addBatch()加入SQL语句的时候,语句并不会执行,只有在调用executeBatch()方法后,才会执行。通常,会将批处理和事务处理结合起来使用。Trans.javaimportjava.sql.*;publicimportjava.sql.*;publicclassBatch{publicstaticvoidmain(Stringargs[]){Connectionconn=null;newStringurl=conn=DriverManager.getConnection(url,"scott","tiger");Statementstmt=conn.createStatement();//SQLStringsql1="insertintostudentsvalues('IBM003','Jimy',30,'F')";Stringsql2="insertintostudentsvalues('IBM004','Hanks',20,'M')";mit//SQLBatch中}} }catch(SQLException{}catch(SQLException{}}}////SQLBatch中OracleBLOB/CLOBOracle9i以后的版本中,新增了两种数据类型用于保存这类数据:BLOB(BinaryLargeOBject)CLOB,(CharacterLargeOBject)。本节结合一个实例来讲解如何通过JDBC将一张保存到Oracle数据库中,以及如何使用JDBC从数据库中读出保存的。,createtableStudent_List(Student_IDvarchar2(20)primaryStudent_Namevarchar2(20)notcreatetableStudent_List(Student_IDvarchar2(20)primaryStudent_Namevarchar2(20)notStudent_List的表,它包含三个字段:Student_IDStudent_PicsetBinaryStream(intidx,InputStreamis,int到数据库字段Student_Pic中,需要使用PreparedStatement对象上的setBinaryStream(intidx,InputStreamis,intsetBlob(intsetBlob(intidx,Blobimportimportjava.sql.*;importjava.io.*;publicclasspublicstaticvoidmain(String[]args){Connectionconn=null;PreparedStatementstmt=null;FileInputStreamfis=null;Stringurl="jdbc:oracle:thin:@localhost:1521:nitpro";conn=DriverManager.getConnection(url,"system","manager");Stringsql="insertintoStudent_Listvalues(?,?,?)";Filefile=newFile("C:/nos/rgb.jpg");fis=newFileInputStream(file);stmt.setBinaryStream(3,fis,}catch(SQLException}}}}catch(IOException{}catch(ClassNotFoundException{}{{{}catch(SQLException{}}{{}catch(IOException{}}}Oracle10g,可以到下列地址直接下载Oracle10g的JDBC驱动:将保存到数据库中之后,接着来看如何通过JDBC将从数据库中出来。要从数据库中读出BLOB的数据,可以使用ResultSet中的getBinaryStream()或者getBlob()方法。我们在此使用getBinaryStream()这个方法,它将返回一个InputStream类型importimportjava.sql.*;importjava.io.*;publicclasspublicstaticvoidmain(String[]args){PreparedStatementstmt=null;ResultSetrs= Connectionconn=null;FileOutputStreamfos=null;Stringurl conn=DriverManager.getConnection(url,"system","manager");Stringsql="select*fromStudent_ListwhereStudent_ID='id001'";stmt=rs=Filefile=newFile("C:/tmp/rgb.jpg");f

温馨提示

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

评论

0/150

提交评论