本教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改,了解Java SE 9及后续版本中更新的语言特性的摘要。
请参阅JDK版本说明,了解有关所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息。
注意:MySQL和Java DB目前不支持RowId
JDBC接口。因此,在本节中没有可用的JDBC教程示例来演示所描述功能。
RowId
对象表示数据库表中一行的地址。然而,需要注意的是,ROWID
类型不是标准的SQL类型。ROWID
值通常是访问单个行的最快方式,并且是表中行的唯一标识符。但是,您不应该将ROWID
值用作表的主键。例如,如果从表中删除了特定行,数据库可能会将其ROWID
值重新分配给稍后插入的行。
以下主题已涵盖:
通过调用接口ResultSet
和CallableStatement
中定义的getter方法,检索java.sql.RowId
对象。返回的RowId
对象是一个不可变对象,您可以将其用作后续引用的唯一标识符行。以下是调用ResultSet.getRowId
方法的示例:
java.sql.RowId rowId_1 = rs.getRowId(1);
您可以将RowId
对象设置为参数化PreparedStatement
对象的参数:
Connection conn = ds.getConnection(username, password); PreparedStatement ps = conn.prepareStatement( "INSERT INTO BOOKLIST" + "(ID, AUTHOR, TITLE, ISBN) " + "VALUES (?, ?, ?, ?)"); ps.setRowId(1, rowId_1);
您还可以在可更新的ResultSet
对象中使用特定的RowId
对象更新列:
ResultSet rs = ... rs.next(); rs.updateRowId(1, rowId_1);
RowId
对象值通常在不同数据源之间不可移植,并且在PreparedStatement
和ResultSet
对象中使用set或update方法时应被视为特定于数据源。因此,不建议从与一个数据源连接的ResultSet
对象获取RowId
对象,然后尝试在与不同数据源连接的不相关ResultSet
对象中使用相同的RowId
对象。
RowId
对象在被标识的行被删除之前是有效的,并且RowId
对象的生命周期在由RowId
的数据源指定的生命周期范围内。
要确定数据库或数据源中RowId
对象的生命周期,请调用方法DatabaseMetaData.getRowIdLifetime
。它返回一个RowIdLifetime
枚举数据类型的值。下面的方法JDBCTutorialUtilities.rowIdLifeTime
返回RowId
对象的生命周期:
public static void rowIdLifetime(Connection conn) throws SQLException { DatabaseMetaData dbMetaData = conn.getMetaData(); RowIdLifetime lifetime = dbMetaData.getRowIdLifetime(); switch (lifetime) { case ROWID_UNSUPPORTED: System.out.println("ROWID类型不支持"); break; case ROWID_VALID_FOREVER: System.out.println("ROWID具有无限生命周期"); break; case ROWID_VALID_OTHER: System.out.println("ROWID具有不确定生命周期"); break; case ROWID_VALID_SESSION: System.out.println( "ROWID类型具有至少在包含会话中有效的生命周期"); break; case ROWID_VALID_TRANSACTION: System.out.println( "ROWID类型具有至少在包含事务中有效的生命周期"); break; } }