本章标识了 JDBC 驱动程序实现声称合规所需支持的功能。任何未标识的功能都被视为合规的可选项。
6.1 定义
为了避免歧义,我们在讨论合规性时将使用以下术语:
JDBC驱动程序实现 — 支持JDBC技术的驱动程序及其底层数据源。驱动程序可以提供底层数据源未实现的功能支持。它还可以提供标准语法/语义与数据源实现的本机API之间的映射。相关规范 — 本文档、
API规范和相关的SQL规范。如果某个功能在多个文档中描述,这也是优先级顺序。对于JDBC API,它是SQL92加上SQL:2003和X/Open SQL CLI的相关部分。支持的功能 —
JDBC API实现支持该功能的标准语法和语义(如相关规范中定义)的功能。部分支持的功能 — 某些方法通过标准语法和语义实现,而某些必需方法抛出
SQLFeatureNotSupportedException以表示不支持的功能。扩展 — 任何相关规范未涵盖的功能,或已涵盖功能的非标准实现。
完全实现 — 用于描述接口的术语,其所有方法都已实现以支持相关规范中定义的语义。任何方法都不能因为未实现而抛出异常。
必须实现 — 必须实现的接口,尽管接口上的某些方法被视为可选。未实现的方法必须抛出
SQLFeatureNotSupportedException以表示相应功能不受支持。
6.2 指南和要求
以下指南适用于 JDBC 合规性:
JDBC API实现必须支持Entry Level SQL92,以及SQL命令DROP TABLE(见下方注释)。Entry Level SQL92代表了JDBC API实现必须支持的SQL能力基线。对于基于SQL99或SQL:2003的功能访问,也应以与相应规范兼容的方式提供。驱动程序必须支持转义语法。转义语法在第 13 章"语句"中描述。
驱动程序必须支持事务。有关详细信息,请参阅第 10 章"事务"。
如果
DatabaseMetaData方法指示支持给定功能,则必须通过相关规范中描述的标准语法和语义支持该功能,并满足第 31 页"JDBC 4.2 API合规性"中概述的要求。如果与标准不同,这可能需要驱动程序提供到数据源本机API或SQL方言的映射。如果支持某个功能,则必须实现所有相关的元数据方法。例如,如果
JDBC API实现支持RowSet接口,它还必须实现RowSetMetaData接口。驱动程序应该提供对底层数据源实现的每个功能的访问,包括扩展
JDBC API的功能。其意图是使用JDBC API的应用程序能够访问与本机应用程序相同的功能集。如果
JDBC驱动程序不支持或仅提供对可选功能的部分支持,则相应的DatabaseMetaData方法必须指示该功能不受支持。任何未实现功能的方法都必须抛出SQLFeatureNotSupportedException。
注意 —
JDBC API实现需要支持SQL92 Transitional Level中定义的DROP TABLE命令。不过,对DROP TABLE的CASCADE和RESTRICT选项的支持是可选的。此外,当存在引用被删除表的视图或完整性约束时,DROP TABLE的行为属于实现定义。
6.3 JDBC 4.2 API 合规性
符合 JDBC 规范的驱动程序必须执行以下操作:
遵守上述指南和要求
支持自动加载驱动程序的
java.sql.Driver实现支持
TYPE_FORWARD_ONLY的ResultSet类型支持
CONCUR_READ_ONLY的ResultSet并发支持批处理更新
完全实现以下接口:
java.sql.DatabaseMetaDatajava.sql.ParameterMetaDatajava.sql.ResultSetMetaDatajava.sql.Wrapper
6.3.1 DataSource 接口要求
必须实现 DataSource 接口,但以下可选方法除外:
getParentLogger
6.3.2 Driver 接口要求
必须实现 Driver 接口,但以下可选方法除外:
getParentLogger
6.3.3 Connection 接口要求
必须实现 Connection 接口,但以下可选方法除外:
createArrayOf— 除非驱动程序支持相关数据类型createBlob— 除非驱动程序支持相关数据类型createClob— 除非驱动程序支持相关数据类型createNClob— 除非驱动程序支持相关数据类型createSQLXML— 除非驱动程序支持相关数据类型createStruct— 除非驱动程序支持相关数据类型getNetworkTimeoutgetTypeMap— 除非驱动程序支持相关数据类型setTypeMap— 除非驱动程序支持相关数据类型prepareStatement(String sql, int[] columnIndexes)prepareStatement(String sql, String[] columnNames)setSavepointrollback(java.sql.Savepoint savepoint)releaseSavepointsetNetworkTimeout
6.3.4 Statement 接口要求
必须实现 Statement 接口,但以下可选方法除外:
cancelexecute(String sql, Statement.RETURN_GENERATED_KEYS)execute(String sql, int[] columnIndexes)execute(String sql, String[] columnNames)executeUpdate(String sql, Statement.RETURN_GENERATED_KEYS)executeUpdate(String sql, int[] columnIndexes)executeUpdate(String sql, String[] columnNames)getGeneratedKeysgetMoreResults(Statement.KEEP_CURRENT_RESULT)— 除非DatabaseMetaData.supportsMultipleOpenResults()返回truegetMoreResults(Statement.CLOSE_ALL_RESULTS)— 除非DatabaseMetaData.supportsMultipleOpenResults()返回truesetCursorName
6.3.5 PreparedStatement 接口要求
必须实现 PreparedStatement 接口,但以下可选方法除外:
prepareStatement(String sql, Statement.RETURN_GENERATED_KEYS)getMetaDatasetArray,setBlob,setClob,setNClob,setNCharacterStream,setNString,setRef,setRowId,setSQLXML和setURL— 除非驱动程序支持相关数据类型setNull(int parameterIndex, int sqlType, String typeName)— 除非驱动程序支持相关数据类型setUnicodeStream- 不带长度参数的
setAsciiStream,setBinaryStream,setCharacterStream,setNCharacterStream
6.3.6 CallableStatement 接口要求
如果 DatabaseMetaData.supportsStoredProcedures() 返回 true,则必须实现 CallableStatement 接口,但以下可选方法除外:
getArray,getBlob,getClob,getNClob,getNCharacterStream,getNString,getRef,getRowId,getSQLXML和getURL— 除非驱动程序支持相关数据类型getBigDecimal(int parameterIndex, int scale)getObject(int i, Class type)getObject(String colName, Class type)setArray,setBlob,setClob,setNClob,setNCharacterStream,setNString,setRef,setRowId,setSQLXML和setURL— 除非驱动程序支持相关数据类型setNull(int parameterIndex, int sqlType, String typeName)— 除非驱动程序支持相关数据类型setAsciiStream,setBinaryStream,setCharacterStream,setNCharacterStream— 不带长度参数
6.3.7 ResultSet 接口要求
必须实现 ResultSet 接口,但以下可选方法除外:
getArray,getBlob,getClob,getNClob,getNCharacterStream,getNString,getRef,getRowId,getSQLXML和getURL— 除非驱动程序支持相关数据类型getBigDecimal(int columnIndex, int scale)getUnicodeStreamgetObject(int i, Class type)getObject(String colName, Class type)- 不带长度参数的
updateAsciiStream,updateBinaryStream,updateCharacterStream,updateNCharacterStream
6.4 Java EE JDBC 合规性
Java EE JDBC 合规性包括 JDBC API 合规性,并额外增加以下要求:
必须完全实现以下接口:
javax.sql.DataSourcejavax.sql.ConnectionPoolDataSourcejavax.sql.XADataSource
必须完全实现以下接口:
javax.sql.PooledConnectionjavax.sql.XAConnection
如果实现
RowSet接口,则必须完全实现javax.sql.RowSetMetaData。
JDBC 3.0 之前定义的类和接口必须继续支持使用它们的应用程序。向后兼容性的详细信息在 J2SE 平台规范中提供。
