版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、JDBC 驅動開發(fā)準則該準則來源“ <<JDBC API Tutorial And Reference,Third Edition>> 中的附錄 A : For Driver Writers ”。希望能夠對大家有所幫助,尤其是開發(fā)數(shù)據(jù)庫驅動的,希望能有一個整體的開發(fā)概念,根據(jù)準則中的描述,深入到每個開發(fā)要點和細節(jié),結合實際的 DBMS 作出正確的選擇。作者: Maydene Fisher,Jon Ellis,Jonathan Bruce 譯者:湯泳( Miker.Tang )由于時間的倉促和翻譯的不到位,有許多地方值得推敲,請大家及時反饋 ,謝謝!對所有驅動的要求這部分
2、為 JDBC 驅動的標準實現(xiàn)提供了要求。一般地,不要求 JDBC 驅動提供數(shù)據(jù)庫管理系統(tǒng)不支持的特性。準則( Guidelines )以下的準則適用于 JDBC 1.0,JDBC 2.0 和 JDBC 3.0 API 的實現(xiàn)。Ø JDBC API 需要支持 SQL92 標準指定的 SQL 命令。參見“ 支持 SQL92擴展標準”以獲取更多的細節(jié)。Ø 驅動必須支持 escape syntax 。“ 支持 SQL92 擴展標準”給予了 escape syntax 更多的細節(jié)。Ø 驅動必須支持事務。Ø 驅動應該提供對潛在數(shù)據(jù)源實現(xiàn)的每個特性的訪問能力,包括 J
3、DBC API 擴展的特性。當不能支持某個特性時,相應的方法要拋出 SQLException 。目的是對于使用 JDBC API 的應用程序能夠訪問同樣的特性集。Ø 如果一個 DatabaseMetaData 的方法暗示了支持某個給定的特性,那么就像在相關的規(guī)范中描述的那樣,通過標準的語法和語義必須要支持。這也許需要驅動提供到數(shù)據(jù)源原生 API 或不同于標準的 SQL 語義的映射。Ø 如果支持某個特性,相關的 metadata 方法必須要實現(xiàn)。例如:如果 JDBC API 的實現(xiàn)支持 RowSet 接口,那么也要實現(xiàn) RowSetMetaData 接口。Ø 如果不
4、支持某個特性,相應的 DatabaseMetaData 中的方法也必須要給出說明。試圖訪問不支持的特性將導致 SQLException 被拋出。 在接口中實現(xiàn)方法 JDBC 1.0 API的接口中所有的方法必須要實現(xiàn)以便至少支持 ANSI SQL 92 和 X/Open SQL CLI 。 JDBC 2.0 API 和 JDBC 3.0 API 必須要實現(xiàn)來支持 ANSI SQL 92,ANSI SQL 99 相關的部分和 X/Open SQL CLI 。 除基本的標準以外,如果 DBMS 不支持某個特性,驅動也不必支持。例如:如果 DBMS 不支持 SQL 99 中的數(shù)據(jù)類型,那么實現(xiàn)支持這
5、些新的類型( Array,Blob,Clob,Ref,SQLData,SQLInput,SQLOutput 和 Struct )的接口就是可選的?;蛘撸绻?DBMS 不支持某個可選包的特性,諸如 connection pooling ,那么支持 connection pooling ( Connection Event,ConnectionEventListener,ConnectionPoolDataSource,PooledConnection )的接口就是可選的。如果某個方法支持 DBMS 不包括的特性,那么該方法的實現(xiàn)將拋出 SQLException 。 Metadata接口應該被完
6、全實現(xiàn)。 DatabaseMetaData 接口的目的是告訴用戶 DBMS 支持哪些特性和不支持哪些特性,因此每個方法都要實現(xiàn)。同樣地, ResultSetMetaData 和 ParameterMetaData 接口要完全被實現(xiàn)。提供 javax.sql.RowSet 實現(xiàn)的驅動提供商也應該提供一個 javax.sql.RowSetMetaData 接口的完全實現(xiàn)。注意:在 JDBC 可選包中的接口已經是 JDBC 3.0 API 的一部分,并且 JDBC 驅動應該實現(xiàn)來作為核心的 JDBC API 。但是, RowSet 接口和支持它的接口并不包含在里面,因為它們可以實現(xiàn)在 JDBC AP
7、I 的上層,這樣就不作為驅動實現(xiàn)的一部分了。 支持分布式事務的 JDBC 驅動必須支持 XAConnection 和 XADataSource 接口。 兼容 JDBC 1.0 API 的要求為了兼容 JDBC 1.0 API ,驅動實現(xiàn)需要做以下:Ø 堅持上面的準則和要求。Ø 完全實現(xiàn)下列接口:java.sql.Driverjava.sql.DatabaseMetaData 除了在 JDBC 2.0 API 或 JDBC 3.0 API 引入的方法java.sql.ResultSetMetaData除了在 JDBC 2.0 API 或 JDBC 3.0 API 引入的方法&
8、#216; 包括下列所需的接口: java.sql.CallableStatement java.sql.Connection java.sql.PreparedStatement java.sql.ResultSet java.sql.Statement兼容 JDBC 2.0 API 的要求為了兼容 JDBC 1.0 API ,驅動實現(xiàn)需要做以下:Ø 符合 JDBC 1.0 API 的要求。Ø 完全實現(xiàn) DatabaseMetaData 接口,包括在 JDBC 2.0 API 中增加的下列方法:deletesAreDetectedgetConnectiongetUDTsi
9、nsertsAreDetectedothersDeletesAreVisibleothersInsertsAreVisibleothersUpdatesAreVisibleownDeletesAreVisibleownInsertsAreVisibleownUpdatesAreVisiblesupportsBatchUpdatessupportsResultSetConcurrencysupportsResultSetTypeupdatesAreDetected Ø 實現(xiàn)下面 ResultSetMetaData 中其他的方法: getColumnClassName getColumn
10、Type getColumnTypeName兼容 JDBC 3.0 API 的要求為了兼容 JDBC 3.0 API ,驅動實現(xiàn)需要做以下:Ø 符合 JDBC 2.0 API 的要求Ø 包括以下所需的接口:java.sql.ParameterMetaDatajava.sql.Savepoint Ø 完全實現(xiàn) DatabaseMetaData 接口,包括在 JDBC 3.0 API 中增加的下列方法:supportsSavepointssupportsNamedParameterssupportsMultipleOpenResultssupportsGetGener
11、atedKeysgetSuperTypesgetSuperTablesgetAttributesgetResultSetHoldabilitysupportsResultSetHoldabilitygetSQLStateTypegetDatabaseMajorVersiongetDatabaseMinorVersiongetJDBCmajorVersiongetJDBCMinorVersion已經被實現(xiàn)的 API下面的類和異常在 JDBC 3.0 API 中已經完全被實現(xiàn)了:· java.sql.BatchUpdateException· java.sql.DataTrun
12、cation· java.sql.Date· java.sql.DriverManager· java.sql.DriverPropertyInfo· java.sql.SQLException· java.sql.SQLPermission· java.sql.SQLWarning· java.sql.Time· java.sql.Timestamp· java.sql.Types· javax.sql.ConnectionEvent· javax.sql.RowSetEvent其他
13、的要求除了滿足上面列舉的要求外, JDBC 驅動也必須符合下面列舉的要求:實現(xiàn) Static Initializer每個 Driver 類應該包含一個特殊的靜態(tài)區(qū)域,有時被稱作 Static Initializer ,當使用 DriverManager 來加載 Driver 類時, Driver 類的 Static Initializer 被調用。當加載 Driver 類時, Static Initializer 完成以下兩件事:1 創(chuàng)建 Driver 類的實例。2 通過調用 DriverManager.registerDriver 注冊新創(chuàng)建的 Driver 實例。下面的代碼演示了 Stat
14、ic Initializer : public class MyDriver implements java.sql.Driver static java.sql.DriverManager.registerDriver(new MyDriver(); . . . 當完成以上兩件事之后,用戶通過調用 Class.forName ( Driver 類名作為參數(shù))方法能夠加載和注冊 JDBC 驅動。 注意:Static Initializer 僅僅適用使用 DriverManager 加載驅動的方式。通過 DataSource API 加載驅動不會使用 DriverManager 自動地注冊,而且
15、在實現(xiàn)上也不應該包含 Static Initializer 。 DriverManager 和 DriverPropertyInfo 類包括 Driver 接口也許在將來會被削弱。 支持 SQL92 擴展標準 支持 Scalar 函數(shù)支持 Scalar 函數(shù)需要一些額外的解釋。 JDBC 支持數(shù)字型,字符串型,時間型,日期型, System 和轉換成 Scalar 值的函數(shù)。對于那些想要比“ Statements 中的 SQL Escape Syntax ”更多信息的人來說, X/Open Group CLI 規(guī)范提供了關于 Scalar 函數(shù)語義更多的信息。以下是這些函數(shù)的列表。如果 DBM
16、S 支持 Scalar 函數(shù),驅動也應該支持。因為不同的 DBMS 對 Scalar 函數(shù)語法上的支持會有不同,所以驅動就是或者將 Scalar 函數(shù)映射成合適的語法,或者是在驅動中直接實現(xiàn)這些函數(shù)。用戶通過調用 metadata 中的方法應該能發(fā)現(xiàn)哪些函數(shù)被支持。例如:方法 DatabaseMetaData.getNumericFunctions 應該返回一個逗號分隔的被 Open Group CLI 支持的 numeric 函數(shù)列表。類似地,方法 DatabaseMetaData.getStringFunctions 應該返回一個 string 函數(shù)列表,等等。以下是按照種別列出的 Sca
17、lar 函數(shù):NUMERIC FUNCTIONSFunction NameFunction ReturnsABS(number)Absolute value of numberACOS(float)Arccosine, in radians, of floatASIN(float)Arcsine, in radians, of floatATAN(float)Arctangent, in radians, of floatATAN2(float1, float2)Arctangent, in radians, of float2/ float1CEILING(number)Smallest i
18、nteger >= numberCOS(float)Cosine of floatradiansCOT(float)Cotangent of floatradiansDEGREES(number)Degrees in numberradiansEXP(float)Exponential function of floatFLOOR(number)Largest integer <= numberLOG(float)Base e logarithm of floatLOG10(float)Base 10 logarithm of floatMOD(integer1, integer2
19、)Remainder for integer1/ integer2PI()The constant piPOWER(number, power)numberraised to (integer) powerRADIANS(number)Radians in numberdegreesRAND(integer)Random floating point for seed integerROUND(number, places)numberrounded to placesplacesSIGN(number) to indicate numberis < 0;0 to indicate nu
20、mberis = 0;1 to indicate numberis > 0SIN(float)Sine of floatradiansSQRT(float)Square root of floatTAN(float)Tangent of floatradiansTRUNCATE(number, places)numbertruncated to placesplaces STRING FUNCTIONSFunction NameFunction ReturnsASCII(string)Integer representing the ASCII code value of the lef
21、tmost character in stringCHAR(code)Character with ASCII code value code, where codeis between 0 and 255CONCAT(string1, string2)Character string formed by appending string2to string1; if a string is null, the result is DBMS-dependentDIFFERENCE(string1, string2)Integer indicating the difference betwee
22、n the values returned by the function SOUNDEXfor string1and string2INSERT(string1, start, length, string2)A character string formed by deleting lengthcharacters from string1beginning at start, and inserting string2into string1at startLCASE(string)Converts all uppercase characters in stringto lowerca
23、seLEFT(string, count)The countleftmost characters from stringLENGTH(string)Number of characters in string, excluding trailing blanksLOCATE(string1, string2, start)Position in string2of the first occurrence of string1, searching from the beginning of string2; if startis specified, the search begins f
24、rom position start. 0 is returned if string2does not contain string1. Position 1 is the first character in string2.LTRIM(string)Characters of stringwith leading blank spaces removedREPEAT(string, count)A character string formed by repeating string counttimesREPLACE(string1, string2, string3)Replaces
25、 all occurrences of string2in string1with string3RIGHT(string, count)The countrightmost characters in stringRTRIM(string)The characters of string with no trailing blanksSOUNDEX(string)A character string, which is data source-dependent, representing the sound of the words in string; this could be a f
26、our-digit SOUNDEX code, a phonetic representation of each word, etc.SPACE(count)A character string consisting of countspacesSUBSTRING(string, start, length)A character string formed by extracting lengthcharacters from stringbeginning at startUCASE(string)Converts all lowercase characters in stringto
27、 uppercaseTIME and DATE FUNCTIONSFunction NameFunction ReturnsCURDATE()The current date as a date valueCURTIME()The current local time as a time valueDAYNAME(date)A character string representing the day component of date; the name for the day is specific to the data sourceDAYOFMONTH(date)An integer
28、from 1 to 31 representing the day of the month in dateDAYOFWEEK(date)An integer from 1 to 7 representing the day of the week in date; 1 represents SundayDAYOFYEAR(date)An integer from 1 to 366 representing the day of the year in dateHOUR(time)An integer from 0 to 23 representing the hour component o
29、f timeMINUTE(time)An integer from 0 to 59 representing the minute component of timeMONTH(date)An integer from 1 to 12 representing the month component of dateMONTHNAME(date)A character string representing the month component of date; the name for the month is specific to the data sourceNOW()A timest
30、amp value representing the current date and timeQUARTER(date)An integer from 1 to 4 representing the quarter in date; 1 represents January 1 through March 31SECOND(time)An integer from 0 to 59 representing the second component of timeTIMESTAMPADD(interval, count, timestamp)A timestamp calculated by
31、adding countnumber of interval(s) to timestamp; intervalmay be one of the following: SQL_TSI_FRAC_SECOND, SQL_TSI_SECOND, SQL_TSI_MINUTE, SQL_TSI_HOUR, SQL_TSI_DAY, SQL_TSI_WEEK, SQL_TSI_MONTH, SQL_TSI_QUARTER, or SQL_TSI_YEARTIMESTAMPDIFF(interval, timestamp1, timestamp2)An integer representing the
32、 number of interval(s) by which timestamp2is greater than timestamp1; intervalmay be one of the following: SQL_TSI_FRAC_SECOND, SQL_TSI_SECOND, SQL_TSI_MINUTE, SQL_TSI_HOUR, SQL_TSI_DAY, SQL_TSI_WEEK, SQL_TSI_MONTH, SQL_TSI_QUARTER, or SQL_TSI_YEARWEEK(date)An integer from 1 to 53 representing the w
33、eek of the year in dateYEAR(date)An integer representing the year component of date SYSTEM FUNCTIONSFunction NameFunction ReturnsDATABASE()Name of the databaseIFNULL(expression, value)valueif expressionis null ; expressionif expressionis not nullUSER()User name in the DBMSCONVERSION FUNCTIONSFunctio
34、n NameFunction ReturnsCONVERT(value, SQLtype)valueconverted to SQLtypewhere SQLtypemay be one of the following SQL types: BIGINT, BINARY, BIT, CHAR, DATE, DECIMAL, DOUBLE, FLOAT, INTEGER, LONGVARBINARY, LONGVARCHAR, REAL, SMALLINT, TIME, TIMESTAMP, TINYINT, VARBINARY, or VARCHAR 提供 Positioned Update
35、s 和 Deletes 鎖定JDBC 3.0 核心 API 為 position 結果集游標提供了不同的方法,因此,在結果集中很容易更新或刪除一個特別的行。但是, JDBC 1.0 API 僅僅提供了簡單的游標支持,這也就使得 positioned Update 或 Delete 有點復雜。 當使用 executeQuery 執(zhí)行查詢的時候,返回結果集且游標位于第一行記錄的前面。直到結果集對象或創(chuàng)建該結果集的 Statement 關閉為止,游標將保持有效。如果驅動不支持游標的 position 方法,那么應用程序必須通過調用 ResultSet.getCursorName 方法來獲取游標的名稱
36、。這個游標的名稱能夠被使用在 position Update 或 Delete 語句中。 注意:所有 DBMS 都支持 position Update 和 Delete 。應用程序能夠使用 DatabaseMetaData.supportsPositionedUpdate 和 DatabaseMetaData.supportsPostionedDelete 方法來決定當前的連接是否支持。因為許多 DBMS 在 Select 語句( in Select For Update )中都不支持“ for update ”,所以驅動必須要檢查并且實現(xiàn)這個語義。這個語法( for update )的目的是
37、通知生成的結果集將使用 position Update 和 Delete 。 另外, JDBC 3.0 API 允許應用程序指定結果集對象的持久性( Holdability ),這就允許在事務過程中創(chuàng)建的結果集對象在事務被提交的生命周期以外被維護。這也意味著 JDBC 驅動必須考慮額外的鎖定功能。 當支持 position update 和 delete 時, DBMS/Driver 必須確保被篩選的行能夠被鎖定以便 postion update 不會導致更新異?;蚴瞧渌牟l(fā)問題。 支持多線程java.sql 和 javax.sql 中對象的所有操作都需要多線程的安全。它們必須能正確地處理幾
38、個線程同時調用同一個對象。換句話說,在一個線程中執(zhí)行的命令不應該阻塞在另一個線程中的執(zhí)行。特別地,當使用多線程時, JDBC 驅動應該能正確地操作。一個具體使用多線程的例子是一個長時間運行的命令能夠被取消。通過使用一個線程執(zhí)行該命令而另一個線程能夠取消掉來達到目的。盡管在實際中能夠預想決大多數(shù) JDBC 對象將以單線程的方式被訪問,但是也需要支持多線程的方式。一些數(shù)據(jù)庫的 API ,如 ODBC ,提供了異步執(zhí)行 SQL 語句的機制。這就允許一個應用程序在后臺開啟數(shù)據(jù)庫的操作,然后處理其他的工作(例如管理用戶的接口)來等待后臺操作的完成。因為 Java 編程語言提供了多線程的環(huán)境,因此提供異步
39、命令的執(zhí)行似乎就沒有必要了。如果想要異步地執(zhí)行命令,程序開發(fā)人員能夠很容易地創(chuàng)建一個隔離的線程。一些驅動也許允許更多的并發(fā)執(zhí)行,但是開發(fā)人員應該能夠設想出完全的并發(fā)執(zhí)行場景。如果該驅動需要某種形式的同步,那么驅動應該要提供。在這種情形下,唯一的不同應該是應用程序并發(fā)運行的次數(shù)會降低。例如:在同一連接中的兩個命令對象能夠并發(fā)地執(zhí)行,并且它們的結果集對象能夠被并發(fā)地處理(從開發(fā)者的角度看)。一些驅動將完全提供這種并發(fā)能力。其他的也許執(zhí)行一個命令并且在處理下個結果集之前一直等到第一個處理完成。為截斷的輸入?yún)?shù)拋出異常如果輸入的參數(shù)被截斷,那么 DataTruncation 的異常應該被拋出,參見“
40、Data Truncation ”,獲取更多的信息。為 SQL99 數(shù)據(jù)類型使用默認的行為( JDBC 2.0 ) 差異性 由于在數(shù)據(jù)庫功能和語法上的差異,在驅動的實現(xiàn)上 JDBC 允許一些差異。數(shù)據(jù)庫所使用的 SQL 也許不同。例如:對于 Outer Joins ,不同的數(shù)據(jù)庫提供了不同的支持。而且,許多 SQL 特性也許在不同的數(shù)據(jù)庫間存在差異。 Java.sql.DatabaseMetaData接口提供了許多的方法,通過使用這些方法,用戶能夠確切地知道當前的數(shù)據(jù)庫支持哪些 SQL 特性。對于驅動開發(fā)人員來說,必須確保 DatabaseMetaData 的方法能夠返回準確的信息,即 DBM
41、S 支持哪些特性和不支持哪些特性。處理不支持的功能 當數(shù)據(jù)庫不支持某種功能時,驅動需要作出相應的處理。例如:一些數(shù)據(jù)庫不支持存儲過程的 OUT 參數(shù)。在這種情形下, CallableStatement 方法中針對 OUT 參數(shù)的方法( registerOutParameter 和相應的 getter 方法)將不能應用,并且當用戶調用時,要拋出 SQLException 。基本屬性的差異 在一些基本的屬性方面也允許有差異,例如:事務的隔離級別。當前數(shù)據(jù)庫的默認屬性和這些屬性的范圍可以通過 DatabaseMetaData 的方法獲取。增加的功能 數(shù)據(jù)庫廠商可能會增加額外的功能,這樣就會創(chuàng)建 JD
42、BC 類的子類來提供這些額外的功能。例如: Foobah 公司支持了 SQL99 中的 NCHAR 和 NVCHAR 類型,該公司也許會定義一個新的 JAVA 類型 foobah.sql.FooBahType 來擴展 java.sql.Types 。驅動的安全性 使用 SQLException 作為異常 如果 DBMS 不支持某個功能,方法中要拋出 SQLException 。 有些情形下, Java RunTimeException 和 SQLException 也許會重疊。例如:如果一個方法希望一個參數(shù)是 java.sql.Types ,結果卻提供了其他的類型,那么, IllegalArg
43、umentException或 SQLException。這樣,推薦拋出SQLException,因為那將給予JDBC更多對Error的控制。實現(xiàn)的建議預檢索行記錄 提供“ Finalize ”方法 避免實現(xiàn)上的依賴 2.實現(xiàn) Connection 和 Statement Pooling在數(shù)據(jù)庫應用程序中獲取數(shù)據(jù)源的連接是一個更加昂貴的操作。因此,為了重用物理連接,實現(xiàn)池化連接的機制能夠在性能上提供利益。 JDBC API 提供了一個類( ConnectionEvent )和三個接口( ConnectionEventListener , ConnectionPoolDataSource 和 P
44、ooledConnection )來作為連接池的實現(xiàn)策略。 這些 API 決定了連接池如果工作的一般的準則,但是并沒有提出連接池如何實現(xiàn)的具體細節(jié)。而且, JDBC 3.0 規(guī)范并沒有定義在何處實現(xiàn),留出了很大的實現(xiàn)自由。典型地,一個應用程序服務器將實現(xiàn)連接池和分布式事務的管理。驅動提供商會實現(xiàn) DataSource 和 ConnectionPoolDataSource 接口以便它們能和實現(xiàn)連接池的 J2EE 應用程序服務器協(xié)同工作。如果一個 JDBC 驅動包含了對連接池管理的實現(xiàn),那么它應該提供一種方式,使得能夠關閉驅動的實現(xiàn)。這樣,應用程序能夠選擇使用應用程序服務器的實現(xiàn),這樣可以防止建立
45、兩個連接池。 類似地,重用PreparedStatement對象能夠增強性能,尤其當prepared statement很大并且要被使用多次的時候。驅動和DBMS也許會花費很多的資源來預編譯(原文:precompiling)Statement并且為了執(zhí)行來準備一個策略,因此為Statement準備一次而不是多次是更加地有效。當創(chuàng)建Statements的連接被池化的時候,Statements也許會被池化。JDBC 3.0規(guī)范為ConnectionPoolDataSource增加了一些屬性,這些屬性能夠創(chuàng)建Statement Pool的初始大小,和在池中被維護的Statement的最小數(shù)目,等等。
46、這些屬性在實現(xiàn)中被設置,并且不是暴露給應用程序開發(fā)人員的API一部分。從應用程序開發(fā)人員的視角考慮,對于Statement Pooling沒有新的API。實現(xiàn)連接池和 Statement Pooling 必須對用戶完全透明。一個例外是驅動應該有關閉自己對連接池實現(xiàn)的能力,以便使用應用程序服務器的實現(xiàn)。應用程序能夠透明地創(chuàng)建,使用和關閉連接,不管是否使用了連接池。同樣地,應用程序每次創(chuàng)建新的 PreparedStatement 對象的方式也要透明。唯一的不同是如果程序員知道連接池有效,那么他 / 她也許會更好地使用 prepared statements 。但是,一般地,在性能地改善上應用程序會
47、開啟使用連接池和 Statement Pooling 。JDBC 測試套件 驅動提供商通過使用JDBC測試套件能夠測試它們的驅動是否和J2EE平臺兼容。有兩個版本:· JDBC Test Suite 1.2.1: tests for conformance with the JDBC 2.0 API· JDBC Test Suite 1.3.1: tests for conformance with the JDBC 3.0 API這些測試套件覆蓋了經過兼容J2EE測試的驅動功能。它們是免費地并且可以從以下網(wǎng)址下載: 如何安裝和運行測試套件的文檔在以下的網(wǎng)址:通過測試套件暗
48、示了一個驅動是兼容其他符合J2EE規(guī)范的產品,但是并不意味這個驅動能夠被標記兼容J2EE。驅動必須要通過一個外部的測試組織來測試是兼容的。完全的驅動認證過程的說明在如下的網(wǎng)址:The JDBC web pages maintain a database of JDBC drivers, which users can search to find drivers that satisfy their requirements. Search criteria include the type of driver, which versions of the JDBC Specification are supported, and which drivers have been certified to be compatible with the J2EE platform. The database is maintained
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆山西省大同市煤礦第二學校物理高二上期末學業(yè)質量監(jiān)測模擬試題含解析
- 2025屆衡水市第十三中學高三上物理期中聯(lián)考模擬試題含解析
- 2025屆銅陵市重點中學物理高一上期末考試模擬試題含解析
- 2025屆甘肅省定西市高一物理第一學期期末預測試題含解析
- 湖南省張家界市(2024年-2025年小學五年級語文)人教版期末考試((上下)學期)試卷及答案
- 性激素類藥與抗生育藥課件
- 急診神經定位課件
- 2024個人房屋抵押貸款合同
- 急性心衰的診治護理課件
- 2024年油田管廢料出售合同范本
- 天然氣脫硫(課堂運用)
- 幼兒園教師師德師風考核表(共2頁)
- 《施工組織設計專項施工方案資料》古建筑油漆彩畫施工方案
- 城鎮(zhèn)職工醫(yī)療保險運行中的問題分析及措施
- 阿拉丁神燈介紹ppt[共27頁]
- 人教版英語選擇性必修一Unit 1 People of Achievement(Reading and Thinking)教案(2課時)
- 學校食堂五常法管理制度
- 畢業(yè)設計500kv變電站設計
- 講故事社團活動教案
- 五四制新青島版二年級科學上冊14《身邊的動植物資源》課件
- 高層建筑結構抗震設計理念及方法
評論
0/150
提交評論