如何使用旧驱动程序获取JDBC中插入行的ID?

时间:2014-12-04 10:39:25

标签: sql jdbc hsqldb

我想得到插入行的自动增量ID。我知道有很多例子如何做到这一点:

link1 link2

但我使用HSQL 1.8.0.10并遵循以下代码:

PreparedStatement ps = conn.prepareStatement("insert into dupa (v1) values(3)", Statement.RETURN_GENERATED_KEYS);

投掷预期:

java.sql.SQLException: This function is not supported

如果驱动程序不支持上述解决方案,如何获取id。是否有其他方法可以获得插入行的自动增量键?我想尽可能多地处理司机。因此,想要在try部分中使用obove代码,并在catch部分中使用其他方式。

第二个问题:数据库可能不支持此功能。所以即使我使用新的驱动程序和旧数据库它仍然无法正常工作?我尝试使用hsql 2.3.2驱动程序,但我无法连接到1.8.0.10数据库。

2 个答案:

答案 0 :(得分:0)

您必须使用某些特定于供应商的解决方案,即在mysql中您将调用LAST_INSERT_ID函数。

我没有有效安装HSQL来测试它,但你可以试试这个主题中投票最多的解决方案:how to return last inserted (auto incremented) row id in HSQL?

答案 1 :(得分:0)

以下代码说明了如何使用附带的JDBC 4驱动程序从HSQLDB 2.2.9及更高版本中检索生成的密钥。此方法返回两个元素long []。第一个元素包含已更新的行数;第二个包含生成的密钥(如果有):

    static final long[] doUpdate( ... ) {

        final long[] k = new long[] {0, KEY_UNDEFINED};
        PreparedStatement ps = null;

        try {
            ps = CXN.get().prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

            JdbcValue jv;
            for (int i = 0; i < data.size(); i++) {
                jv = data.get(i);
                jv.type().setJdbcParameter(i + 1, ps, jv);
            }

            k[NUM_OF_ROWS] = (long) ps.executeUpdate();

            if (k[NUM_OF_ROWS] > 0L) {
                try (ResultSet rs = ps.getGeneratedKeys()) {
                    final String identColName = idCol.colName();
                    while (rs.next()) {
                        if (k[ROW_CREATED] != KEY_UNDEFINED) throw new AssertionError();
                        k[ROW_CREATED] = rs.getLong(identColName);
                    }
                }
            }

        } catch (SQLException e) { ... }

        finally {
            try { if (ps != null) ps.close(); } catch (SQLException e) { }
        }

        return k;
    }

我无法说这种方法是否适用于旧版本的HSQLDB。