使用 RowId 对象

原文: https://docs.oracle.com/javase/tutorial/jdbc/basics/sqlrowid.html

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

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

涵盖以下主题:

通过调用接口ResultSetCallableStatement中定义的 getter 方法检索java.sql.RowId对象。返回的RowId对象是一个不可变对象,您可以将其用作后续引用作为行的唯一标识符。以下是调用ResultSet.getRowId方法的示例:

  1. java.sql.RowId rowId_1 = rs.getRowId(1);

您可以将RowId对象设置为参数化PreparedStatement对象中的参数:

  1. Connection conn = ds.getConnection(username, password);
  2. PreparedStatement ps = conn.prepareStatement(
  3. "INSERT INTO BOOKLIST" +
  4. "(ID, AUTHOR, TITLE, ISBN) " +
  5. "VALUES (?, ?, ?, ?)");
  6. ps.setRowId(1, rowId_1);

您还可以在可更新的ResultSet对象中更新具有特定RowId对象的列:

  1. ResultSet rs = ...
  2. rs.next();
  3. rs.updateRowId(1, rowId_1);

RowId对象值通常不能在数据源之间移植,并且在PreparedStatementResultSet对象中分别使用 set 或 update 方法时应视为特定于数据源。因此,不建议从ResultSet对象获取RowId对象并连接到一个数据源,然后尝试在不相关的ResultSet对象中使用相同的RowId对象,并连接到不同的数据源。

只要未删除标识的行且RowId对象的生命周期在RowId的数据源指定的生命周期范围内,RowId对象就有效。

要确定数据库或数据源的RowId对象的生命周期,请调用方法DatabaseMetaData.getRowIdLifetime。它返回RowIdLifetime枚举数据类型的值。以下方法 JDBCTutorialUtilities.rowIdLifeTime 返回RowId对象的生命周期:

  1. public static void rowIdLifetime(Connection conn)
  2. throws SQLException {
  3. DatabaseMetaData dbMetaData = conn.getMetaData();
  4. RowIdLifetime lifetime = dbMetaData.getRowIdLifetime();
  5. switch (lifetime) {
  6. case ROWID_UNSUPPORTED:
  7. System.out.println("ROWID type not supported");
  8. break;
  9. case ROWID_VALID_FOREVER:
  10. System.out.println("ROWID has unlimited lifetime");
  11. break;
  12. case ROWID_VALID_OTHER:
  13. System.out.println("ROWID has indeterminate lifetime");
  14. break;
  15. case ROWID_VALID_SESSION:
  16. System.out.println(
  17. "ROWID type has lifetime that " +
  18. "is valid for at least the " +
  19. "containing session");
  20. break;
  21. case ROWID_VALID_TRANSACTION:
  22. System.out.println(
  23. "ROWID type has lifetime that " +
  24. "is valid for at least the " +
  25. "containing transaction");
  26. break;
  27. }
  28. }