文档

Java™ 教程
隐藏目录
使用RowId对象
路径: JDBC数据库访问
课程: JDBC基础知识

使用RowId对象

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

RowId对象表示数据库表中一行的地址。然而,需要注意的是,ROWID类型不是标准的SQL类型。ROWID值通常是访问单个行的最快方式,并且是表中行的唯一标识符。但是,您不应该将ROWID值用作表的主键。例如,如果从表中删除了特定行,数据库可能会将其ROWID值重新分配给稍后插入的行。

以下主题已涵盖:

检索RowId对象

通过调用接口ResultSetCallableStatement中定义的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对象,然后尝试在与不同数据源连接的不相关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类型不支持");
            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;
    }
}

上一页: 使用数据链接对象
下一页: 使用存储过程