兼容性
第6章 兼容性
这一章描述了JDBC类库实现在各个兼容级别要支持的特性。一个JDBC类库实现包含了一个JDBC驱动和底层数据源。兼容性定义了在驱动层之上要实现的特性。
任何没有提到的特性都是可选的。通常,如果底层数据源不支持,驱动不需要实现这个特性。
6.1 定义
为了避免混淆,我们将在兼容性的讨论中使用以下术语:
- JDBC类库实现 --- 一个JDBC驱动和它的底层数据源。驱动可能提供对底层数据源没有实现的特性的支持。它也可能提供标准语法/语义到数据源本地类库的映射。
- 相关规范 --- 这个类库规范以及其他相关的SQL规范。如果一个特性在多个文档里被描述,我们应该考虑被排在最前面的文档。对于JDBC 1.0类库来说,相关的SQL规范包括SQL92和X/Open SQL CLI。对于JDBC2.0和3.0类库,它包括SQL92加上SQL99和X/Open SQL CLI的相关部分。对于JDBC 4.0类库,它包括SQL92以及SQL2003和X/Open SQL CLI的相关部分。
- 支持特性 --- 在相关规范中定义了特性的标准语法和语义,JDBC类库实现要按照语法和语义的规定支持这些特性。
- 扩展 --- 一个没有被相关规范定义的特性,或者是,相关规范中特性的非标准实现。
- 需要的接口 --- 要支持的接口,但不一定要完整实现。接口里没有实现的方法应抛出SQLException,说明不支持该特性。
6.2 指导原则和要求
下列指导原则适合所有级别的兼容性:
- 一个JDBC类库实现必须支持入门级别SQL92(Entry Level SQL92)和“Drop Table”SQL命令(请参照注意事项)。
入门级别SQL92(Entry Level SQL92)是JDBC类库实现要支持的最低SQL级别。对SQL99或SQL2003中特性的访问应该与SQL99或SQL2003规范的相关部分一致。
- 驱动必须支持转义语法。转义语法将在第13章“语句”中讲述。
- 驱动应该提供对底层数据源所有特性的访问,包括扩展了JDBC类库的特性。如果一个特性没有被支持,特性对应的方 法应该抛出SQLException。这样使得JDBC程序可以访问与本地应用相同的特性集。
- 如果从DatabaseMetaData的方法得知驱动支持给定的特性,则驱动要保证特性的语法和语义应该跟相关规范一致。这意味着,如果数据源的本地类库或语法与标准不一致,驱动要提供相应的映射。
- 支持一个特性,还必须实现相关的元数据方法。例如,一个驱动支持RowSet接口,它还要实现RowSetMetaData接口。
- 不支持一个特性,则对应的DatabaseMetaData方法要“拒绝访问”:对不支持特性的方法的访问要抛出SQLException。
注意 :JDBC类库实现要支持“SQL92 - 过渡级别”中定义的DROP TABLE命令,但对CASCADE和RESTRICT选项的支持 是可选的。而且,当要被删除的表有视图(views)和完整性约束时,DROP TABLE的行为也是实现类库的厂商自己定义的。
6.3 JDBC 1.0 类库兼容性
与JDBC 1.0 类库兼容的驱动应满足以下条件:
- 遵守前述指导原则和要求
- 完整实现下列接口:
- java.sql.Driver
- java.sql.DatabaseMetaData(除了在高版本中引入的方法)
- java.sql.ResultSetMetaData(除了在高版本中引入的方法)
- 包含下列需要的接口(“需要的接口”的定义见6.1)
- java.sql.CallableStatement
- java.sql.Connection
- java.sql.PreparedStatement
- java.sql.ResultSet
- java.sql.Statement
6.4 JDBC 2.0 类库兼容性
与JDBC 2.0 类库兼容的驱动应满足以下条件:
- 遵守JDBC 1.0 类库需求
- 在DatabaseMetaData中增加下列方法的实现:
- deletesAreDetected
- getConnection
- getUDTs
- insertsAreDetected
- othersDeletesAreVisible
- othersInsertsAreVisible
- othersUpdateAreVisible
- ownDeletesAreVisible
- ownInsertsAreVisible
- ownUpdatesAreVisible
- supportsBatchUpdates
- supportsResultSetConcurrency
- supportsResultSetType
- updatesAreDetected
- 在ResultSetMetaData里增加下列方法的实现:
- getColumnClassName
- getColumnType
- getColumnTypeName
6.5 JDBC 3.0 类库的兼容性
与JDBC 3.0 类库兼容的驱动应满足以下条件:
- 遵守JDBC 1.0 类库需求
- 包含下列需要的接口:
- java.sql.ParameterMetaData
- java.sql.Savepoint
- 在DatabaseMetaData中增加下列方法的实现:
- supportsSavepoints
- supportsNamedParameters
- supportsMultipleOpenResults
- supportsGetGeneratedKeys
- getSuperTypes
- getSuperTables
- getAttributes
- getResultSetHoldability
- supportsResultSetHoldability
- getSQLStateType
- getDatabaseMajorVersion
- getDatabaseMinorVersion
- getJDBCMajorVersion
- getJDBCMinorVersion
6.6 JDBC 4.0 类库的兼容性
与JDBC 4.0 类库兼容的驱动应满足以下条件:
- 遵守JDBC 3.0 类库需求
- 包含下列需要的接口:
- java.sql.RowId
- java.sql.QueryObjectGenerator
- java.sql.DataSet
- 在DatabaseMetaData里增加下列方法的实现:
- getRowIdLifetime
- supportsStoredFunctionsUsingCallSyntax
- providesQueryObjectGenerator
注意 :这一段将在下一版草案更新
6.7 决定兼容级别
JDBC 类库是Java平台不可或缺的一部分。与JDBC类库规范兼容是与整个平台兼容的一个子集。
注意 :在编写这个文档之际,还没有独立于平台检查JDBC类库兼容级别的。
6.8 不赞成使用的类库
不赞成使用是针对类、接口、构造器、方法或字段来说的,即不再被推荐使用,而且可能在将来某个版本不复存在。
JDBC 2.0类库中不赞成使用的构造器和方法: java.sql.CallableStatement.getBigDecimal(int, int)
java.sql.Date(int, int, int)
java.sql.Date.getHours()
java.sql.Date.getMinutes()
java.sql.Date.getSeconds()
java.sql.Date.setHours(int)
java.sql.Date.setMinutes(int)
java.sql.Date.setSeconds(int)
java.sql.DriverManager.getLogStream()
java.sql.DriverManager.setLogStream(PrintStream?)
java.sql.PreparedStatement.setUnicodeStream(int, InputStream?, int)
java.sql.ResultSet.getBigDecimal(int, int)
java.sql.ResultSet.getBigDecimal(String, int)
java.sql.ResultSet.getUnicodeStream(int)
java.sql.ResultSet.getUnicodeStream(String)
java.sql.Time(int, int, int)
java.sql.Time.getDate()
java.sql.Time.getDay()
java.sql.Time.getMonth()
java.sql.Time.getYear()
java.sql.Time.setDate(int)
java.sql.Time.setMonth(int)
java.sql.Time.setYear(int)
java.sql.Timestamp(int, int, int, int, int, int, int)
也可参考http://www.pgsqldb.org/twiki/bin/view/PgSQL/兼容性
版权所有 罗明