使用 RowId 对象
原文: https://docs.oracle.com/javase/tutorial/jdbc/basics/sqlrowid.html
注: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 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;
}
}