《JavaSE程序設(shè)計及實踐》課件09-第9章JDBC基礎(chǔ)_第1頁
《JavaSE程序設(shè)計及實踐》課件09-第9章JDBC基礎(chǔ)_第2頁
《JavaSE程序設(shè)計及實踐》課件09-第9章JDBC基礎(chǔ)_第3頁
《JavaSE程序設(shè)計及實踐》課件09-第9章JDBC基礎(chǔ)_第4頁
《JavaSE程序設(shè)計及實踐》課件09-第9章JDBC基礎(chǔ)_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

-1-理解JDBC訪問數(shù)據(jù)庫的結(jié)構(gòu)及原理了解JDBC四種驅(qū)動類型掌握JDBC訪問數(shù)據(jù)庫的步驟掌握JDBC中的DriverManager類和Connection、ResultSet接口掌握JDBC的常用查詢接口掌握JDBC對集元數(shù)據(jù)的訪問掌握JDBC的事務處理目標-2-JDBCJava數(shù)據(jù)庫連接(JavaDatabaseConnectivity,JDBC),是一種用于執(zhí)行SQL語句的JavaAPI,它由一組用Java編程語言編寫的類和接口組成。JDBC為數(shù)據(jù)庫開發(fā)人員提供了一個標準的API,使他們能夠用純JavaAPI來編寫數(shù)據(jù)庫應用程序。使用JDBC編寫的程序能夠自動地將SQL語句傳送給相應的數(shù)據(jù)庫管理系統(tǒng)。JDBC擴展了Java的功能,由于Java語言本身的特點,使得JDBC具有簡單、健壯、安全、可移植、獲取方便等優(yōu)勢。-3-JDBC結(jié)構(gòu)JDBCAPI是Java開發(fā)工具包(JDK)的組成部份:JDBC驅(qū)動程序管理器JDBC驅(qū)動程序測試工具包JDBC-ODBC橋JDBC驅(qū)動程序管理器是JDBC體系結(jié)構(gòu)的支柱,其主要作用是把Java應用程序連接到正確的JDBC驅(qū)動程序上。JDBC驅(qū)動程序測試工具包為JDBC驅(qū)動程序的運行提供一定的可信度,只有通過JDBC驅(qū)動程序測試包的驅(qū)動程序才被認為是符合JDBC標準的。JDBC-ODBC橋使ODBC驅(qū)動程序可被用作JDBC驅(qū)動程序。其目標是為方便實現(xiàn)訪問某些不常見的DBMS,它的實現(xiàn)為JDBC的快速發(fā)展提供了一條途徑。

-4-JDBC模型JDBC既支持數(shù)據(jù)庫訪問的兩層模型,也支持三層模型。兩層模型:三層模型:-5-JDBC類型Type1:JDBC-ODBC橋Type2:本地API驅(qū)動Type3:網(wǎng)絡協(xié)議驅(qū)動Type4:本地協(xié)議驅(qū)動JDBC-ODBC驅(qū)動程序?qū)DBC翻譯成ODBC,然后使用一個ODBC驅(qū)動程序與數(shù)據(jù)庫進行通信。本地API驅(qū)動程序用Java來編寫的驅(qū)動程序,這種類型的驅(qū)動程序把客戶機API上的JDBC調(diào)用轉(zhuǎn)換為Oracle、Sybase、Informix、DB2或其它DBMS的調(diào)用。JDBC網(wǎng)絡協(xié)議驅(qū)動程序?qū)DBC轉(zhuǎn)換為與DBMS無關(guān)的網(wǎng)絡協(xié)議,這是最為靈活的JDBC驅(qū)動程序。本地協(xié)議驅(qū)動程序?qū)DBC調(diào)用直接轉(zhuǎn)換為DBMS所使用的專用網(wǎng)絡協(xié)議。是Intranet訪問的一個很實用的解決方法。-6-JDBC和ODBCODBC(開放式數(shù)據(jù)庫連接)API是使用最廣的、用于訪問關(guān)系數(shù)據(jù)庫的編程接口,它可以將所有平臺的關(guān)系型數(shù)據(jù)庫連接起來。ODBC模型結(jié)構(gòu):Java中通過JDBC-ODBC橋接方式實現(xiàn)ODBC功能調(diào)用:-7-JDBCAPI接口/類功能說明DriverManager數(shù)據(jù)庫驅(qū)動管理類,用于加載和卸載各種驅(qū)動程序,并建立于數(shù)據(jù)庫的連接Connection此接口用于連接數(shù)據(jù)庫Statement此接口用于執(zhí)行SQL語句并將數(shù)據(jù)檢索到ResultSet中ResultSet結(jié)果集接口,提供檢索SQL語句返回數(shù)據(jù)的各種方法PreparedStatement此接口用于執(zhí)行預編譯的SQL語句CallableStatement此接口用于執(zhí)行SQL存儲過程的語句-8-訪問數(shù)據(jù)庫使用Oracle數(shù)據(jù)庫作為JDBC的訪問環(huán)境,需做如下準備工作:設(shè)置Oracle驅(qū)動的類路徑:在Oracle的安裝路徑下找到ojdbc6.jar包,將此工具包導入到工程中,或加入到環(huán)境變量CLASSPATH中。創(chuàng)建演示表格及測試數(shù)據(jù)createtablestudent(snovarchar2(10)primarykey,--學生號snamevarchar2(20)notnull,--學生姓名agevarchar2(3)notnull,--學生年齡sexchar(1)notnull--性別,1:男,0:女);--添加測試數(shù)據(jù)insertintostudentvalues('D00001','張飛',20,1);insertintostudentvalues('D00002','關(guān)羽',21,1);insertintostudentvalues('D00003','劉備',22,1);insertintostudentvalues('D00004','貂蟬',18,0);insertintostudentvalues('D00005','小喬',19,0);-9-連接數(shù)據(jù)庫使用JDBC訪問數(shù)據(jù)庫的基本步驟一般如下:加載JDBC驅(qū)動程序建立數(shù)據(jù)庫連接創(chuàng)建Statement對象執(zhí)行SQL語句處理返回結(jié)果關(guān)閉創(chuàng)建的對象-10-加載JDBC驅(qū)動程序加載驅(qū)動程序的方法:其中DriverName是要加載的JDBC驅(qū)動程序名稱。驅(qū)動程序名稱根據(jù)數(shù)據(jù)庫廠商提供的JDBC驅(qū)動程序的種類來確定。加載JDBC-ODBC數(shù)據(jù)庫驅(qū)動程序的方法為:加載Oracle數(shù)據(jù)庫驅(qū)動程序的方法為:Class.forName("DriverName")Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Class.forName("oracle.jdbc.driver.OracleDriver");注意:JDBC4以后已經(jīng)不需要顯式的調(diào)用Class.forName()了,在JDBC4中調(diào)用getConnection的時候DriverManager會自動去加載合適的驅(qū)動,但是在實際開發(fā)中為保證程序的完整性、正確性建議不要省略。-11-創(chuàng)建數(shù)據(jù)庫連接-1DriverManager類是JDBC的管理層,作用于用戶和驅(qū)動程序之間,跟蹤可用的驅(qū)動程序,并在數(shù)據(jù)庫和相應驅(qū)動程序之間建立連接。該類負責加載、注冊JDBC驅(qū)動程序,管理應用程序和已注冊的驅(qū)動程序的連接。DriverManager的常用方法:方法名功能說明StaticconnectiongetConnection(Stringurl,Stringuser,Stringpassword)用于建立到指定數(shù)據(jù)庫URL的連接。其中url為提供了一種標識數(shù)據(jù)庫位置的方法,user為用戶名,password為密碼staticDrivergetDriver(Stringurl)用于返回能夠打開url所指定的數(shù)據(jù)庫的驅(qū)動程序使用DriverManager類的getConnection()創(chuàng)建一個數(shù)據(jù)庫連接:Connectionconn=DriverManager.getConnection(Stringurl,Stringuser,Stringpassword); -12-創(chuàng)建數(shù)據(jù)庫連接-2URL提供了一種標識數(shù)據(jù)庫位置的方法,可以使相應的驅(qū)動程序能夠識別該數(shù)據(jù)庫并與它建立連接。JDBCURL由三個部分組成:<subprotocol>是子協(xié)議,指數(shù)據(jù)庫連接的方式。<subname>可以根據(jù)子協(xié)議的改變而變化。對于JDBC-ODBC橋驅(qū)動的連接URL是:odbc為子協(xié)議名稱data_source指本地ODBC數(shù)據(jù)源的名字attribute_name和attribute_value指定建立連接所必須的信息,如用戶名、密碼等jdbc:odbc:<data_source>[<attribute_name1>=<attribute_value1>]…… jdbc:<subprotocol>:<subname>Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connectionconn=DriverManager.getConnection("jdbc:odbc:orcl","dh_admin","admin123"); -13-創(chuàng)建數(shù)據(jù)庫連接-3對于Oracle驅(qū)動的連結(jié)的URL是:oracle為子協(xié)議名稱thin是oracle數(shù)據(jù)庫的一種連結(jié)方式serverName為Oracle數(shù)據(jù)庫服務器名稱,可以是一個域名,也可以是IP地址port為Oracle數(shù)據(jù)庫的端口號,默認為1521instance是數(shù)據(jù)庫的實例名

示例:jdbc:oracle:thin:@serverName:port:instance Class.forName("oracle.jdbc.driver.OracleDriver");ConnectionConn=DriverManager.getConnection(

"jdbc:oracle:thin:@localhost:1521:orcl","dh_admin","admin123");

-14-ConnectionConnection是一個接口,表示與數(shù)據(jù)庫的連接,并擁有創(chuàng)建SQL語句的方法,以完成基本的SQL操作,同時為數(shù)據(jù)庫事務處理提供提交和回滾的方法。Connection接口的常用方法:方法名功能說明voidclose()斷開連接,釋放此Connection對象的數(shù)據(jù)庫和JDBC資源StatementcreateStatement()創(chuàng)建一個Statement對象來將SQL語句發(fā)送到數(shù)據(jù)庫voidcommit()用于提交SQL語句,確認從上一次提交/回滾以來的所有更改booleanisClosed()用于判斷Connection對象是否已經(jīng)被關(guān)閉CallableStatementprepareCall(Stringsql)創(chuàng)建一個CallableStatement對象來調(diào)用數(shù)據(jù)庫存儲過程PreparedStatementprepareStatement(Stringsql)創(chuàng)建一個PreparedStatement對象來將參數(shù)化的SQL語句發(fā)送到數(shù)據(jù)庫voidrollback()用于取消SQL語句,取消在當前事務中進行的所有更改-15-創(chuàng)建Statement創(chuàng)建完連接之后,可以通過此連接向目標數(shù)據(jù)庫發(fā)送SQL語句。在發(fā)送SQL語句之前,須創(chuàng)建一個Statement類的對象,該對象負責將SQL語句發(fā)送給數(shù)據(jù)庫。如果SQL語句運行后產(chǎn)生結(jié)果集,Statement對象會將結(jié)果集封裝成ResultSet對象并返回。通過調(diào)用Connection接口的createStatement方法來創(chuàng)建Statement對象,如:Statementsmt=conn.createStatement(); -16-執(zhí)行SQL語句獲取Statement對象之后,就可以使用該對象的executeQuery()方法來執(zhí)行SQL語句,如:executeQuery()方法返回一個ResultSet對象,它包含了SQL的查詢結(jié)果。ResultSetrs=smt.executeQuery("SELECTsno,name,ageFROMstudent"); -17-處理返回結(jié)果在JDBC中,SQL的查詢結(jié)果使用ResultSet封裝ResultSet對象維持了執(zhí)行某個SQL語句后滿足條件的所有的行,并提供一系列訪問結(jié)果集中數(shù)據(jù)的方法通過調(diào)用ResultSet對象的方法,處理返回結(jié)果-18-關(guān)閉創(chuàng)建的對象當數(shù)據(jù)庫操作執(zhí)行完畢或退出應用前,需將數(shù)據(jù)庫訪問過程中建立的對象按順序關(guān)閉,防止系統(tǒng)資源浪費。關(guān)閉的次序是:關(guān)閉結(jié)果集關(guān)閉Statement對象關(guān)閉連接-19-操作數(shù)據(jù)庫在JDBC中要執(zhí)行SQL查詢語句可以通過執(zhí)行一般查詢、參數(shù)查詢和存儲過程三種方式。三種不同的接口:StatementPreparedStatementCallableStatement-20-Statement-1Statement接口用于執(zhí)行靜態(tài)的SQL語句,靜態(tài)的SQL語句不需要接收任何參數(shù)。Statement主要功能是將SQL語句傳送給數(shù)據(jù)庫,并將SQL語句的執(zhí)行結(jié)果返回。提交的SQL語句可以是:SELECT查詢語句SQLDML語句,如:INSERT、UPDATE或DELETESQLDDL語句,如:CREATETABLE和DROPTABLEStatement接口的常用方法及說明:

方法名功能說明voidclose()關(guān)閉Statement對象booleanexecute(Stringsql)執(zhí)行給定的SQL語句,該語句可能返回多個結(jié)果ResultSetexecuteQuery(Stringsql)執(zhí)行給定的SQL語句,該語句返回單個ResultSet對象intexecuteUpdate(Stringsql)執(zhí)行給定SQL語句,該語句可能為INSERT、UPDATE或DELETE語句,或者不返回任何內(nèi)容的SQL語句(如SQLDDL語句)ConnectiongetConnection()獲取生成此Statement對象的Connection對象intgetFetchSize()獲取結(jié)果集合的行數(shù),該數(shù)是根據(jù)此Statement對象生成的ResultSet對象的默認獲取大小intgetMaxRows()獲取由此Statement對象生成的ResultSet對象可以包含的最大行數(shù)-21-Statement-2Statement接口提供了三種執(zhí)行SQL語句的方法:executeQuery()executeUpdate()execute()executeQuery()方法用于產(chǎn)生單個結(jié)果集的語句,例如SELECT語句。executeUpdate()方法用于執(zhí)行INSERT、UPDATE或DELETE語句以及SQLDDL語句,如CREATETABLE和DROPTABLE。executeUpdate的返回值是一個整數(shù),指示受影響的行數(shù)(即更新計數(shù))對于CREATETABLE或DROPTABLE等語句,executeUpdate的返回值總為零。execute()方法用于執(zhí)行返回多個結(jié)果集、多個更新計數(shù)或二者的組合execute()方法比較特殊,一般是在用戶不知道執(zhí)行SQL語句后會產(chǎn)生什么結(jié)果或可能有多種類型的結(jié)果產(chǎn)生時才會使用。

-22-ResultSet-1ResultSet封裝了Statement的executeQuery()方法返回的結(jié)果集,即符合SQL語句中指定條件的所有行。ResultSet維護了指向當前行的游標,并提供了許多方法用來操作結(jié)果集中的游標,同時提供了一套getXXX()方法對結(jié)果集中的數(shù)據(jù)進行訪問。ResultSet常用方法:方法名功能說明voidbeforeFirst()將游標移動到結(jié)果集的開頭(第一行之前)booleannext()將游標從當前位置下移一行booleanlast()將游標移動到結(jié)果集的最后一行。intgetRow()檢索當前行編號StringgetString(intx)返回當前行第x列的值,類型為StringintgetInt(intx)返回當前行第x列的值,類型為intStatementgetStatement()獲取生成結(jié)果集的Statement對象voidclose()釋放此ResultSet對象的數(shù)據(jù)庫和JDBC資源ResultSetMetaDatagetMetaData()獲取結(jié)果集的列的編號、類型和屬性-23-ResultSet-2ResultSet維護指向當前數(shù)據(jù)行的游標,最初它位于第一行之前,每調(diào)用一次next()方法,游標向下移動一行,從而按照從上至下的次序獲取ResultSet數(shù)據(jù)行。ResultSet提供一套getXXX()方法對結(jié)果集中游標指向的行進行取值。在使用getXXX()方法取值時,一定要注意數(shù)據(jù)庫的字段數(shù)據(jù)類型和Java的數(shù)據(jù)類型之間的匹配:SQL數(shù)據(jù)類型Java數(shù)據(jù)類型對應的方法integer/intintgetInt()smallintshortgetShort()floatdoublegetDouble()doubledoublegetDouble()realfloatgetFloat()varchar/char/varchar2java.lang.StringgetString()booleanbooleangetBoolean()datejava.sql.DategetDate()timejava.sql.TimegetTime()blobjava.sql.BlobgetBlob()clobjava.sql.ClobgetClob()-24-ResultSet-3使用getXXX()方法進行取值時,可通過列名或列號標識要獲取數(shù)據(jù)的列。如:列是從左至右編號的,并且從1開始列名不區(qū)分大小寫Statementstmt=conn.createStatement();ResultSetrs=stmt.executeQuery(selectSql);while(rs.next()){System.out.println("行"+rs.getRow()+":"+rs.getString(1) +","+rs.getString(2)+","+rs.getString(3)); }//執(zhí)行添加intcount=stmt.executeUpdate(insertSql);System.out.println("添加"+count+"行!");//執(zhí)行修改count=stmt.executeUpdate(updateSql);System.out.println("修改"+count+"行!");//執(zhí)行刪除count=stmt.executeUpdate(deleteSql); Stringname=rs.getString("name");Stringname=rs.getString(1);-25-PreparedStatementPreparedStatement接口是Statement接口的子接口,它繼承了Statement的所有功能。PrepardStatement接口有兩大特點:執(zhí)行速度要快于Statement對象SQL語句中提供參數(shù),提高程序的靈活性和執(zhí)行效率PreparedStatement對象是通過Connection的prepareStatement()方法創(chuàng)建。SQL語句中的參數(shù)使用“?”作為占位符示例:StringinsertSql="INSERTINTOstudentVALUES(?,?,?,?)";PreparedStatementpstmt=conn.prepareStatement(insertSql);-26-PreparedStatement在執(zhí)行帶參數(shù)的SQL語句前,必須對“?”進行賦值。PreparedStatement接口中增添了大量的setXXX()方法,通過占位符的索引完成對輸入?yún)?shù)的賦值,XXX根據(jù)不同的數(shù)據(jù)類型選擇。示例://執(zhí)行添加pstmt=conn.prepareStatement(insertSql);//為占位符賦值pstmt.setString(1,"D00006");pstmt.setString(2,"周瑜");pstmt.setInt(3,19);pstmt.setString(4,"1");intcount=pstmt.executeUpdate();System.out.println("添加"+count+"行!"); -27-CallableStatement-1存儲過程是數(shù)據(jù)庫中已經(jīng)存在的SQL語句。在JDBC中執(zhí)行數(shù)據(jù)庫中的存儲過程可以使用CallableStatement對象。CallableStatement接口繼承了Statement接口和PreparedStatement接口,它具有兩者的特點:可以處理一般的SQL語句,也可以處理輸入?yún)?shù),同時它還定義了OUT(輸出)參數(shù)以及INOUT(輸入輸出)參數(shù)的處理方法。使用Connection類的prepareCall()方法創(chuàng)建CallableStatement對象:存儲過程有參數(shù),可使用占位符“?”代替,例如:CallableStatementcstmt=conn.prepareCall("{callproc_name}");CallableStatementcstmt=conn.prepareCall("{callproc_name(?,?)}");-28-CallableStatement-2在執(zhí)行一個存儲過程之前,必須先對其中的OUT參數(shù)進行類型注冊,注冊方式如下:第一個參數(shù)為對應存儲過程占位符,第二個參數(shù)為對應占位符的變量的類型,通過java.sql.Types的靜態(tài)常量來指定,例如,Types.FLOAT、Types.INTEGER等。示例:當使用getXXX()方法獲取OUT參數(shù)的值時,XXX對應的Java類型必須與所注冊的SQL類型相符。如果存儲過程有返回值,使用下面的方式調(diào)用:

registerOutParameter(intindex,intsqlType);cstmt.registerOutParameter(2,java.sql.Types.VARCHAR);CallableStatementcstmt=conn.prepareCall("{?=callproc_name(?,?)}");-29-集元數(shù)據(jù)集元數(shù)據(jù)(MetaData),就是有關(guān)數(shù)據(jù)庫和表格結(jié)構(gòu)的信息,如:數(shù)據(jù)庫中的表、表的列、表的索引、數(shù)據(jù)類型、對SQL的支持程度等信息。集元數(shù)據(jù)類型:DatabaseMetaDataResultSetMetaData-30-DatabaseMetaDataDatabaseMetaData接口主要是用來得到關(guān)于數(shù)據(jù)庫的信息,如:表格的列表、系統(tǒng)函數(shù)、關(guān)鍵字、數(shù)據(jù)庫產(chǎn)品名和數(shù)據(jù)庫支持的JDBC驅(qū)動器名DatabaseMetaData對象是通過Connection的getMetaData()方法獲取。DatabaseMetaData的方法可分為兩大類:一類返回值為boolean型,多用以檢查數(shù)據(jù)庫或驅(qū)動器是否支持某項功能另一類則用獲取數(shù)據(jù)庫或驅(qū)動器本身的某些特征值方法名功能說明booleansupportsOuterJolns()檢查數(shù)據(jù)庫是否支持外部連接booleansupportsStoredProcedures()檢查數(shù)據(jù)庫是否支持存儲過程StringgetURL()該方法的功能是返回用于連接數(shù)據(jù)庫的URL地址StringgetUserName()該方法的功能是獲取當前用戶名StringgetDatabaseProductName()該方法的功能是獲取使用的數(shù)據(jù)庫產(chǎn)品名StringgetDatabaseProductVersion()該方法的功能是獲取使用的數(shù)據(jù)庫版本號StringgetDriverName()該方法的功能是獲取用以連接的驅(qū)動器名稱StringgetProductVerslon()該方法的功能是獲取用以連接的驅(qū)動器版本號ResultSetgetTypeInfo()該方法的功能是獲取數(shù)據(jù)庫中可能取得的所有數(shù)據(jù)類型的描述-31-ResultSetMetaDataResultSetMetaData接口主要用來獲取結(jié)果集的結(jié)構(gòu)。如:結(jié)果集的列的數(shù)量、列的名字等。ResultSetMetaData對象可以通過ResultSet的getMetaData()方法獲取。ResultSetMetaData的常用方法及功能:方法名功能說明intgetColumnCount()返回此ResultSet對象中的列數(shù)StringgetColumnName(intcolumn)獲取指定列的名稱intgetColumnType(intcolumn)檢索指定列的SQL類型StringgetTableName(intcolumn)獲取指定列的名稱intgetColumnDisplaySize(intcolumn)指示指定列的最大標準寬度,以字符為單位booleanisAutoIncrement(intcolumn)指示是否自動為指定列進行編號,這樣這些列仍然是只讀的intisNullable(intcolumn)指示指定列中的值是否可以為nullbooleanisSearchable(intcolumn)指示是否可以在where子句中使用指定的列booleanisReadOnly(intcolumn)指示指定的列是否明確不可寫入-32-事務操作事務是構(gòu)成單一邏輯工作單位的操作集合。已提交事務是指成功執(zhí)行完畢的事務,未能成功完成的事務稱為中止事務,對中止事務造成的變更需要進行撤銷處理,稱為事務回滾。事務具有ACID4個特性:原子性:事務中的全部操作在數(shù)據(jù)庫中是不可分割的,要么全部完成,要么均不執(zhí)行。一致性:幾個并行執(zhí)行的事務,其執(zhí)行結(jié)果必須與按某一順序串行執(zhí)行的結(jié)果相一

溫馨提示

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

評論

0/150

提交評論