罗明的博客
... ...
讨论Eclipse, Java, Linux, Google产品
              

兼容性

第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章“语句”中讲述。

  • 驱动必须支持事务。详见第9章“事务”。

  • 驱动应该提供对底层数据源所有特性的访问,包括扩展了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/兼容性  



版权所有 罗明
posted on 2005-10-06 11:17 罗明 阅读(2112) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: