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

Posted

技术标签:

【中文标题】如何使用旧驱动程序获取 JDBC 中插入行的 ID?【英文标题】:How to get the ID of inserted row in JDBC with old driver? 【发布时间】:2015-02-02 04:54:39 【问题描述】:

我想获取插入行的自动增量 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 部分使用上述代码,并在catch 部分使用另一种方式。

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

【问题讨论】:

【参考方案1】:

以下代码说明了如何使用包含的 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 驱动程序。但我不知道。【参考方案2】:

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

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

【讨论】:

HSQL 只是示例。我寻找通用解决方案。

以上是关于如何使用旧驱动程序获取 JDBC 中插入行的 ID?的主要内容,如果未能解决你的问题,请参考以下文章

获取插入行的ID [重复]

JDBC 批量插入,返回 ID

如何在 JDBC 中获取插入 ID?

如何在 MySQL 中获取多个插入行的 ID?

如何在我的内容观察器中获取插入行的 URI?

如何使用openxml获取新插入行的ID?