如何在具有旧版JDBC驱动程序的情况下获取已插入行的ID?

3

我希望获得插入行的自增id。我知道有很多关于如何实现这个功能的例子:

链接1 链接2

但我使用的是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部分中使用上述代码,并在catch部分中使用另一种方式。
第二个问题:数据库是否支持此功能是可能的。因此,即使我使用新驱动程序和旧数据库,它仍将不起作用吗?我尝试使用hsql 2.3.2驱动程序,但无法连接到1.8.0.10数据库。
2个回答

2

以下代码示例展示了如何使用包含的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。


我知道如果驱动程序支持此功能,如何检索生成的密钥,并在我的问题中写了它。我的问题是:如果驱动程序(或数据库,我不确定哪个负责此功能)不支持prepareStatement(sql,Statement.RETURN_GENERATED_KEYS),该如何检索生成的密钥。正如我在问题中所写,这段代码在我的情况下会引发异常。也许如果JDBC驱动程序向后兼容(换句话说,我可以使用新驱动程序连接到旧数据库),并且所有DBMS都可以返回生成的密钥,则只需使用JDBC 4驱动程序即可。但我不知道。 - Mariusz

0

HSQL只是一个例子,我正在寻找通用解决方案。 - Mariusz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接