使用 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;}}
