使用 RowId 对象

注意 :MySQL 和 Java DB 当前不支持RowId JDBC interface。因此,没有 JDBC 教程示例可用来演示本节中描述的功能。

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

涵盖以下主题:

检索 RowId 对象

通过调用interfaceResultSetCallableStatement中定义的 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对象值通常不能在数据源之间移植,并且分别在PreparedStatementResultSet对象中使用 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;
    }
}