# 使用 RowId 对象

> 原文： [https://docs.oracle.com/javase/tutorial/jdbc/basics/sqlrowid.html](https://docs.oracle.com/javase/tutorial/jdbc/basics/sqlrowid.html)

**注**：MySQL 和 Java DB 目前不支持`RowId` JDBC 接口。因此，没有 JDBC 教程示例可用于演示本节中描述的功能。

`RowId`对象表示数据库表中行的地址。但请注意，`ROWID`类型不是标准 SQL 类型。 `ROWID`值非常有用，因为它们通常是访问单行的最快方式，并且是表中行的唯一标识。但是，不应将`ROWID`值用作表的主键。例如，如果从表中删除特定行，则数据库可能会将其`ROWID`值重新分配给稍后插入的行。

涵盖以下主题：

*   [检索 RowId 对象](#retrieving_rowid_objects)
*   [使用 RowId 对象](#using_rowid_objects)
*   [RowId 有效期的生命周期](#lifetime_rowid_validity)

通过调用接口`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`](gettingstarted.html) 返回`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;
    }
}

```