JDBC學習筆記_第1頁
JDBC學習筆記_第2頁
JDBC學習筆記_第3頁
JDBC學習筆記_第4頁
免費預覽已結束,剩余19頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、JDBC 學習筆記(該筆記由SD0601張亞玲提供)(我們所學習的均為jdbc2.0規范, jdbc1.0為直接連接,而jdbc2.0它有 JNDI服務,在服務器啟動時自動創建一個連接池,定義了一個DataSource接口,用其標準才能使用JDBC 連接池)一、關于 JDBCl. 連接到數據庫的方法答: 1) ODBC(Open Database Connectivity)一個以 C 語言為基礎訪問 SQL 為基礎數據庫引擎的接口,它提供了一致的接口用于和數據庫溝通以及訪問數據。2) JDBCJava版本的 ODBC2. JDBC 應用編程接口答: JDBC 應用編程接口是:1) 標準的數據訪

2、問接口,可以連到不同的數據庫;2) JAVA 編程語言的一組類和接口。JDBC 應用編程接口能夠:1) 連接到數據庫 ;2) 發 SQL 查詢字符串到數據庫 ;3) 處理結果。JDBC 應用編程接口有二個主要的部分:1) JAVA 應用程序開發接口面向 JAVA 應用程序開發者 ;2) JDBC 驅動程序開發接口。3. JDBC Driver答: 1)一大堆實現了JDBC 類和接口的類;3)提供了一個實現java.sql.Driver接口的類。4. JDBC Driver的四種類型答: 1) JDBC-ODBC橋由 ODBC 驅動提供 JDBC 訪問, JDBCZ 轉化為 ODBC。4) Na

3、tive BridgeJava對數據庫的訪問轉化為數據庫的客戶端對數據庫的訪問,所以需要安裝數據庫的客戶端( API )。5)pure javaJava driver,將 JDBC 調用轉入 DBMS,與網直接發送到數據庫被數據庫監聽。純的絡協議無關。然后通過服務器將調用轉為DBMS 協議。6)本地協議純的 java driver,將 JDBC 調用直接轉為 DBMS 使用的網絡協議5. JDBC開發者接口答: 1) java.sql-java 2平臺下 JDBC 的主要功能,標準版 (J2SE)7)javax.sql-java 2平臺下 JDBC 增強功能,企業版 (J2EE)6.使用 UR

4、L 確認數據庫答:我們使用URL 來確定一個數據庫( 正確的 Driver,正確的主機 , 正確的協議,正確的協議,正確的用戶名和密碼);語法: protocol:subprotocol:subname范例: jdbc:db2:MyTestjdbc:db2:/localhost:6789/MyTest-oracle-驅動: oracle.jdbc.driver.OracleDriverURL: jdbc:oracle:thin:dbname注: machine_name:數據庫所在的機器的名稱;(或IP )port:端口號,默認是1521-mysql-驅動: org.gjt.mm.mysql.

5、DriverURL: jdbc:mysql:/dbname注: machine_name:數據庫所在的機器的名稱;(或IP )port:端口號,默認3306-pointbase-驅動: com.pointbase.jdbc.jdbcUniversalDriverURL: jdbc:pointbase:server:/dbname注: machine_name:數據庫所在的機器的名稱;(或IP )port:端口號,默認是9092-SQL Server-驅動: com.microsoft.jdbc.sqlserver.SQLServerDriverURL:jdbc:microsoft:sqlser

6、ver:/;DatabaseName=注: machine_name:數據庫所在的機器的名稱;(或IP )port:端口號,默認是1433-DB2-驅動: com.ibm.db2.jdbc.app.DB2DriverURL: jdbc:db2:/dbname注: machine_name:數據庫所在的機器的名稱;(或IP )port:端口號,默認是50007. javax.sql包 JDBC2.0的增強功能答: 1)數據源接口 ;8) 連接池 ;9) 分布式交易 ;10) 行集 ;二、基本的JDBC應用1 、創建一個基本的JDBC應用答: 1)步驟一:注冊一個driver; driver被用于

7、連接到數據庫; JDBC應用編程接口使用第一個能成功連接到給定在同一時間可以裝載多個driver注冊一個driver的方法:使用類 loader(裝載 ; 實例化 ; 注冊入 DriverManager)URL 的driver;Class.forName(oracle.jdbc.driver.OracleDriver);a. Class.forName(Com.ibm.db2.jdbc.app.DB2Driver);b. Class.forName(C.DB2Driver);c. Class.forName(Com.microsoft.jdbc.sqlServer.SQLServerDrive

8、r);d. Class.forName(oracl.jdbc.driver.OracleDriver);e. Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); 實例化一個 Drivera. Driver drv = new COM.cloudscape.core.RmiJdbcDriver();2)步驟二:建立一個到數據庫的連接;第一種方法: DriverManager調用 getConnection(urlString)方法,實際上調用的是driver的 connect(urlString)方法 ;Connection con= DriverManag

9、er.getConnectionena);(jdbc:oracle:thin:192.168.0.26:1521:tarenadb,tarena,tar當一個 driver肯定地對應到一個數據庫URL, DriverManager建立一個連接 ;當沒有 driver匹配,返回 null然后下一個 driver被檢驗 ;假如沒有建立連接,拋出一個SQLExcepiton異常第二種方法:調用 driver的 connect方法。 創建一個到指定Driver實例的直接調用 ;避免一般訪問的問題Driver drv = new COM.ibm.db2.jdbc.app.DB2Driver();/ Dr

10、iver drv = new oracle.jdbc.dri;Connection con = null;try con = drv.connect(jdbc:db2:MyTest,new Properties()catch(SQLException e)3 )步驟三:創建一個statement; Statement 的三個接口 : a. Statement;b.PreparedStatement(c.CallableStatement(繼承自繼承自Statement);PreparedStatement); 使用方法Connection.createStatement()得到一個Statem

11、ent對象PreparedStatement對象 調用 ProparedStatement比 statement更為高效 ; 繼承自 Statement; 語法: PreparedStatement pstm =connection.prepareStatement(sqlString);CallableStatement對象通過 CallableStatement調用數據庫中的存儲過程;繼承自 PreparedStatement; CallableStatement cstm = connection.prepareCall(callreturn_student?,?);cstm.setSt

12、ring(1,8623034);cstm.registerOutparameter(2, Types.REAL);cstm.execute();float gpa = cstm.getFloat(2);4 )步驟四:執行SQL 語句 ;通過接口方法將SQL 語句傳輸至黙認的數據庫連接,返回結果可能是一個數據表,可以通過 java.sql.ResultSet訪問。 Statement的接口方法:a.executeQuery(sqlString):執行給定的SQL 聲明,返回一個結果集(ResultSet)對象 ; ResultSet rs = stm.executeQuery(selectnam

13、e,gender,age,gpa from +TABLE_NAMEb.executeUpdate(sqlString):執行給定的SQL 聲明,可以是INSERT 、UPDATE 或 DELETE 聲明,也可以是SQL DDL聲明 ;c.execute(sqlString):執行給定的SQL 聲明。5 )步驟五:處理結果; 使用結果集 (ResultSet)對象的訪問方法獲取數據;a.next():下一個記錄b.first():第一個記錄c.last():最后一個記錄d.previous():上一個記錄while(rs.next()System.out.print(name: + rs.get

14、String(1);System.out.print(tgender: + rs.getString(2);System.out.print(tage: + rs.getInt(3);System.out.println(tgpa: + rs.getFloat(4); 通過字段名或索引取得數據,rs.getString(列名 ) 或者 rs.getString(列名數字) 。 結果集保持了一個指向了當前行的指針,初始化位置為第一個記錄前。6 )步驟六:關閉JDBC 對象 首先關閉記錄集;其次關閉聲明 ;最后關閉連接對象。最經典的關閉這三個對象的程序是:public void close(Res

15、ultSet rs,Statement stm,Connection con)if(rs!=null)tryrs.close();catch(Exception me)if(stm!=null)trystm.close()catch(Exception me)if(con!=null)trycon.close()catch(Exception me)2. 經常使用的一些 JDBC URL答: 1) JDBC-ODBC: jdbc:odbc:2) Oracle: jdbc:oracle:oci: or jdbc:oracle:thin:3) Weblogic MS-SQL: jdbc:weblo

16、gic:mssqlserver4:4) DB2: jdbc:db2:MyTest or jdbc.db2:/localhost:6789/MyTest(用戶名和密碼 )需要3.Statement的類型:a,答: 1) Statement接口:用來封裝任意一條SQL 語句,但僅僅限于靜態的得到一個 Statement:Statement stm=con.createStatement();Statement stm=con.createStatement(int resultSetType,SQL命令。int resultSetConcurrency); /生成一個指定結果集類型的Stateme

17、nt其中第一個參數:resultSetType可指定為下列三種形式之一:ResultSet.TYPE_FORWARD_ONLY/不可回卷,只能依次從前往后讀。ResultSet.TYPE_SCROLL_INSENSITIVE/可回卷,但對底層數據庫的修改不敏感。ResultSet.TYPE_SCROLL_SENSITIVE/可回卷,并且對底層數據庫的修改敏感。第二個參數: resultSetConcurrencyResultSet.CONCUR_READ_ONLYResultSet.CONCUR_UPDATABLE可指定為下列兩種形式之一:/結果集只讀,不可更新。/結果集可更新。注意:設置以上

18、兩類參數均需要數據庫的支持。b, 得到執行結果:ResultSet rs = stm.executeQuery(selectname,gender,age,gpa from student0506);(返回結果集)int i = stm.executeUpdate(insert into student0506values (tony,male,20,89);(返回改變的行數)boolean b = stm.execute(drop table student0506);(返回是否執行成功)2) PreparedStatement接口,Statement的子接口:用來封裝一條帶參數的SQL 語

19、句,可以用來代替參數。a 、得到一個PreparedStatement:PreparedStatement pstm=con.prepareStatement(insertinto student0506 values(?,?,?,?);con.prepareStatement()方法同樣可以在后面給2 個表示結果集類型的參數,設置與上相同。b 、設置 SQL 語句中的參數 , 并執行 SQL 語句:pstm.setString(1,tony);pstm.setString(2,male);pstm.setInt(3,20);pstm.setFloat(4,89.5f);pstm.execut

20、eUpdate();3) CallableStatement接口 , PreparedStatement的非 SQL 語句,常常用來執行SQL 存儲過程(一系列的的子接口 , 用來封裝被數據庫支持SQL 命令組成的集合,用來完成一系列的工作)。a,得到一個CallableStatement:CallableStatement cs=con.prepareCall(String sql);如果sql帶參數,就在新建時傳給它,不帶參數? 可用代替。例如:CallableStatement cstm=con.prepareCall(“callreturn_student”);cstm.seStrin

21、g(1,” 8613034 ” );cstm.registerOutParameter(2,Types.REAL);/調用外部參數,存儲類型的REAL 型。cstm.execute();float gpa=cstm.getFloat(2);return_student(String str,float gpa)select gpa from Student where id=str4. Statement接口的比較StatementPreparedStatementCallableStatement寫代碼位置客戶端客戶端服務器端(數據庫端生成)存代碼位置客戶端服務器端服務器端(在服務器端轉化)

22、編寫代碼技術Java ,SQL 操作Java ,SQL 操作數據庫的程序語言,如PL/SQL可配置性高第一次高,以后低低可移植性高假設支持PreparedStatement的話高傳輸效率低第一次低,以后高高5. 數據表和類對應的三種關系:答: 1) 類映射成表;2) 屬性映射成列 ;3) 類與類之間的關系映射成表; 4 )一個實例映射成一行。6. 類間關系的幾種表設計:答: 1)為每個類創建一個表;最接近面向對象的思想,且能支持多態,且維護容易,但是這需要很多時間去維護很多表,花更多的時間去讀寫這個表,直接從一個表來得到一個記錄比較困難。2) 為每個實體類創建一個表(抽象類則不);比較容易得到

23、一個記錄,但是如果你改動了一個類,則必須改變這個表和這個類的子類的表。3) 為一張完整的類的層次結構建一張表。支持多態,且維護容易,比較容易直接從一個表來得到一個記錄。但是任何一個類的修改都會影響該表,且這個表會異常龐大等。7. SQL 數據類型及其相應的 Java 數據類型答: SQL 數據類型Java數據類型說明-INTEGER或者INTint通常是個32 位整數SMALLINTshort通常是個16 位整數NUMBER(m,n) DECIMAL(m,n)Java.sql.Numeric合計位數是m 的定點十進制數,小數后面有n 位數DEC(m,n)Java.sql.Numeric合計位數

24、是m 的定點十進制數,小數后面有n 位數FLOAT(n)double運算精度為n 位二進制數的浮點數REALfloat通常是 32位浮點數DOUBLEdouble通常是 64位浮點數CHARACTER(n) 或 CHAR(n)String長度為 n的固定長度字符串VARCHAR(n)String最大長度為n 的可變長度字符串BOOLEANboolean布爾值DATEJava.sql.Date根據具體設備而實現的日歷日期TIMEJava.sql.Time根據具體設備而實現的時戳TIMESTAMPJava.sql.Timestamp根據具體設備而實現的當日日期和時間BLOBJava.sql.Blo

25、b二進制大型對象CLOBJava.sql.Clob字符大型對象ARRAYJava.sql.Array三 JDBC 的高級特性1. 元數據答:關于數據庫的一些信息,例如類型或者容量。可以通過JDBC API訪問:1) 數據庫元數據 ;a.使用 connection.getMetadata關于數據庫的信息。方法得到DataMetaData對象,從而獲取b.能夠使用DataMetaData.isReadOnly()此類方法獲取關于數據庫信息。2) 結果集元數據 ;a.使用 ResultSet.getMetadatab.能夠使用getColumnCount方法返回 ResultSetMetaData

26、此類方法獲取信息對象。2. 數據庫的事務處理答: 1)一系列的sql命令作為一個不可分的操作;2) JDBC API中使用事務處理步驟:a.設置是否需要系統自動提交事務,如果不需要則用false 作為參數調用Connection.setAutoCommit()方法 ;b. 執行一或多個 sql 命令 ;c.調用 Cmit()方法完成改變;d.恢復上次提交后的改變,調用Connection.rollback()方法,則從上一次提交開始回滾。例子如下:trycon.setAutoCommit(false);Statement stm = con.createStatement();stm.exec

27、uteUpdate(insert into student(name, age, gpa)values(gzhu, 30, 4.8);mit();catch(SQLException e)trycon.rollback();catch(Exception e) 3. 數據庫的并發控制答: 1)設置隔離級別方法:調用Connection對象的setTransactionIsolation()方法。2 )數據庫的隔離級別可以避免以下問題: 臟讀( Dirty reads): A 去修改數據庫,沒有提交,B 去訪問,發現數據是訪問之前的數據,叫臟讀。 不可重復讀( Non-repeatable re

28、ads): A 始終不停的去讀數據,他認為他對數據庫是獨占的,這時B 去修改數據庫,A 發現數據庫更改了,叫不可重復讀。 幻象讀( Plantom reads): A 修改了數據庫,同時B 也修改,對于A 來說,A最終數據不是他預期的,對他來說產生了幻象。發生這三種情況的最主要原因都是在同一時間,有多個線程對同一數據庫進行了操作,所以我們要在效率和安全之間找一個平衡點。3) 隔離級別靜態變量a. TRANSACTION_NONE :不支持事務(三種都有可能發生);b.TRANSACTION_READ_UNCOMMITTED :允許未提交前讀數據(最低級別)c.TRANSACTION_READ_

29、COMMITTED :只允許提交后讀數據(避免臟讀);d. TRANSACTION_REPEATABLE_READ :支持可重復讀取數據(避免臟讀和不可重復讀) ;e. TRANSACTION_SERIALIZABLE :序列化讀(最嚴格的級別,即每一個事務都必須排序等待)。3) 示例:con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);con.getTransactionIsolation()可以得到當前連接數據庫的隔離級別。四、 JDBC2.0核心特性1. JDBC 2.0應用程序編程接口增強功能答: 1

30、) ResultSet增強:a. 可以回卷 ;傳統的遍歷一個ResultSet,只可能一步一步的next,游標永遠指向當前,叫不可回卷。而新增的功能游標可以向前向后移動,并且可以給定一個絕對和相對位置。b. 可以修改,即修改 ResuleSet ,可以直接修改到底層數據庫(需要底層數據庫支持) ;設置示例:stm = con.createStatementResultSetConcurrency);con.prePareStatementResultSetConcurrency);con. prePareCall( sqlResultSetConcurrency);( int ResultSe

31、tType,int( sql, int ResultSetType,int, int ResultSetType,intResultSetType:結果集類型(可否回卷),包括ResultSet.TYPE_FORWARD_ONLY; ( ResultSet.TYPE_SCROLL_INSESITIVE ;不可回卷 )(可回卷,但對底層數據庫的再一次修改不敏感)ResultSet.TYPE_SCROLL_SESITIVE(可回卷且敏感)ResultSetConcurrency:并發條件,是否可以修改到底層數據庫。包括:ResultSet.CONCUR-READ-ONLY;(不可更新)Result

32、Set.CONCUR-UPDATEABLE(可更新)需要創建一個可更新的resultset,需要做以下操作:第一,指定createStatement的參數第二, sql語句必須返回一個可更新的結果集返回可更新的結果集,可使用下面兩種方法:select t.*, t.rowid from t_user tselect * from t_user for update例如: rs.updateString( 1 , “9113015” );rs.updateFloat(“ gpa”,4.8 );rs.updateRow(); /一定要做這條語句,否則不會提交到數據庫rs.absolute( 10

33、); /光標移到要刪除的這一行rs.delectRow();/刪除行rs.movetoInsertRow(); /插入的行rs.updateString( 1 , “9113015” );rs.updateFloat(“ gpa”,4.8 );rs.insertRow();上述更新中是有限制的,包括: 只能引用一張表,不能引用到多個表; 不能包含任何連接操作(子查詢或自連接); 必須要把主鍵查出來 必須要把有非空約束且沒有默認值的列查出來。CONCUR_READ_ONLY (默認)此常量表明該結果集是只讀的CONCUR_UPDATABLE表明結果集可進行更新(指用戶自己對該結果集進行更新,并將

34、更新的結果自動commit)TYPE_FORWARD_ONLY (默認)next()指結果集只能進行前向滾動操作,即只能調用方法TYPE_SCROLL_INSENSITIVEabsolute()結果集可以進行前向或者后向的滾動,并可進行等定位操作該結果集對于其它用戶修改不敏感當 A 用戶使用指定了 TYPE_SCROLL_INSENSITIVE的結果集取得結果后。有其它用戶修改了該查詢條件的結果集,此時,A 用戶的結果集在進行各種操作時,仍然使用第一次查詢得到的結果集。TYPE_SCROLL_SENSITIVEabsolute()結果集可以進行前向或者后向的滾動,并可進行等定位操作該結果集對于

35、其它用戶修改敏感當 A 用戶使用指定了 TYPE_SCROLL_SENSITIVE 的結果集取得結果后。有其它用戶修改了該查詢條件的表的數據,此時, A 用戶的結果集在進行各種操作時,會將自己的結果集與數據庫中的數據進行同步,然后再顯示。HOLD_CURSORS_OVER_COMMIT (默認)在 commit動作后,仍然保持數據庫的連接CLOSE_CURSORS_AT_COMMIT在一個 commit動作后,關閉數據庫連接/ 以下三種常量很少使用,了解即可FETCH_FORWARD結果集只能前向操作(從第一行到最后一行)FETCH_REVERSE結果集只能后向操作(從最后一行到第一行)FET

36、CH_UNKNOWN結果集操作方式未知2) Statement很多的 sql增強了批量修改能力(batch updates);群命令,可以一次執行,如下應用實例:Statement stm=con.createStatement();Stm.addBatch(“ insert into student(name,age,gpa) values( gzu ,30,4.9)” );/要用addBatch來添加sql命令。Stm.addBatch(“ insert into student(name,age,gpa) values( wang ,40,4.5)” );int results=st.e

37、xecuteBatch();/一定要用該語句來執行mit();如果有一條出錯,則全部回滾。3)更高級的數據類型( 例: Blob,Clob,Array等,這些都是SQL 支持的數據類型)。BLOB :大的二進制數據CLOB:大的文本對象Array:數組類型blob clob從數據庫的存取寫入數據庫 :1) . 插入空 BLOB 字段值 :insert into tbl_blob(id,fileName,blobData)values(?,?,empty_blob()2) . 獲取空 BLOB 字段值 :select blobData from tbl_blob where fileName=

38、? for update3) . 構造文件輸入流 , 從空 BLOB 對象獲取二進制輸出流,并將文件內容寫入OutputStream out =blob.getBinaryOutputStream();4). 更新記錄,將BLOB 對象寫入oracle數據庫update tbl_blob set blobData=? wherefileName=?pstmt.setBlob(1,blob);pstmt.setString(2,args0);pstmt.executeUpdate();從數據庫中讀出:1) SELECT blobData +FROM tbl_blob +WHERE fileNam

39、e = ?2) Blob b = rs.getBlob(1);3) InputStream in=b.getBinaryStream();6,JDBC 2.0標準擴展 (JNDI服務需要第三方類庫的支持)答: 1) JNDI(Java Naming and Directory Interface):解決離散狀態下Object的查找 , 相當于一系列的鍵值對,為每一個DataSource起一個名字 ;4)DataSource:封裝在應用程序中可用到的一條數據資源對象,需JNDI的支持。5)ConnectionPool:在內存中保存了多條連接,應用程序可重復利用這些連接,提高性能的重要方法。應用實

40、例:Context cyx=new InitialContext();/InitialContext()借口的實現類,是一個具體的中間件廠商提供的,如果我們要使用JNDI服務的話,要安裝中間件。(如tomcatDataSource ds=(DataSource)ctx.lookup(“ jdbc/my_oracle” );Connection con=ds.getConnection(userid,userpasswd可以不用 );)8,RowSet(RowSet對 rowset的操作需要第三方類庫的支持是默認支持更新和回滾的ResultSet)。它是一個接口,一共有五個子接口。1) 查詢a.

41、 Register jdbc driversb. Create database connection through DriverManagerc. Prepare statementd. Execute statemente. =填充 RowSet =CachedRowSetImpl crs=null; crs = new CachedRowSetImpl(); crs.populate(rs);f. handle resultwhile(crs.next()System.out.print(id: + crs.getString(1);System.out.print(tname: +

42、crs.getString(2);2) 更新a. Register jdbc driversb. =Create database connection & execute sql= crs = new CachedRowSetImpl();crs.setUrl(args1);crs.setUsername(args2);crs.setPassword(args3);crs.setCommand(select * from tbl_user);crs.execute();c. = 更新操作 =crs.moveToInsertRow();/?crs.updateInt(id, 10098347)

43、;crs.updateString(name, Shakespeare);crs.updateString(password,pass);crs.insertRow();/?crs.moveToCurrentRow();/crs.acceptChanges();/d. = handle result= while(crs.next()System.out.print(id: + crs.getString(1);System.out.print(tname: + crs.getString(2);System.out.println();在 jdk1.4 的生之后,引入了的五個實現類,java

44、x.sql包中有一個RowSet接口,但是沒有具體實現的類。javax.sql.rowset包中的五個子接口和com.sun.rowsetjdk1.5中 RowSet的五個子接口分別是jdk1.5誕包里面的對應JdbcRowSet,CachedRowSet,WebRowSet,JoinRowSet和FilteredRowSet。RowSet對象可分為兩類:有連接的和無連接的。JdbcRowSet是唯一一個有連接的實現,和傳統的 ResultSet一個樣,有連接的實現是基于Jdbc驅動的連接,數據庫的連接是貫穿整個對數據庫的操作。而無連接的實現是基于Reader和 Writer流的連接,在需要讀取數據和寫入數據的時候才建立連接,在整個操作過程中都是斷開連接的,后面四個接口對象都是無連接的實現。JdbcRowSet接口:這個接口基本上和ResultSet有類似的功能,只不過它的結果集默認是ResultSet.TYPE_SCROLL_INSENSITIVE和 Resul

溫馨提示

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

評論

0/150

提交評論