使用 RowId 对象
注意 :MySQL 和 Java DB 当前不支持RowId
JDBC interface。因此,没有 JDBC 教程示例可用来演示本节中描述的功能。
RowId
对象代表数据库表中某一行的地址。但是请注意,ROWID
类型不是标准的 SQL 类型。 ROWID
值很有用,因为它们通常是访问单行的最快方法,并且是表中行的唯一标识。但是,不应将ROWID
值用作表的主键。例如,如果从表中删除特定行,则数据库可能会将其ROWID
值重新分配给以后插入的行。
涵盖以下主题:
检索 RowId 对象
通过调用interfaceResultSet
和CallableStatement
中定义的 getter 方法来检索java.sql.RowId
对象。返回的RowId
对象是一个不变的对象,您可以将其作为行的唯一标识符用于后续引用。以下是调用ResultSet.getRowId
方法的示例:
java.sql.RowId rowId_1 = rs.getRowId(1);
使用 RowId 对象
您可以将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
对象,然后try通过连接到另一数据源的不相关的ResultSet
对象中使用同一RowId
对象。
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 type not supported");
break;
case ROWID_VALID_FOREVER:
System.out.println("ROWID has unlimited lifetime");
break;
case ROWID_VALID_OTHER:
System.out.println("ROWID has indeterminate lifetime");
break;
case ROWID_VALID_SESSION:
System.out.println(
"ROWID type has lifetime that " +
"is valid for at least the " +
"containing session");
break;
case ROWID_VALID_TRANSACTION:
System.out.println(
"ROWID type has lifetime that " +
"is valid for at least the " +
"containing transaction");
break;
}
}