本教程是针对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;
}
}