2014-12-04 27 views
1

我想获得插入行的自动增量ID。我知道有很多的例子,说明如何做到这一点:如何使用旧驱动程序在JDBC中获取插入行的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数据库。

回答

0

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

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

+0

HSQL只是一个例子。我寻找通用解决方案。 – Mariusz 2014-12-05 16:23:22

0

下面的代码说明了如何从HSQLDB 2.2检索生成的密钥。 9和更高版本使用包含的JDBC 4驱动程序。这个方法返回一个两个元素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。

+0

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

相关问题