当前位置: 首页 > 知识库问答 >
问题:

如何在JDBC中获取插入ID?

唐彦
2023-03-14

我想用Java中的JDBC在数据库中插入一条记录(在我的例子中是Microsoft SQL Server)。同时,我想获得insert ID。如何使用JDBC API实现这一点?

共有3个答案

沈英勋
2023-03-14

我正在从基于单线程JDBC的应用程序中访问Microsoft SQL Server 2008 R2,并在不使用RETURN_GENERATED_KEYS属性或任何PreparedStatement的情况下提取最后一个ID。看起来像这样:

private int insertQueryReturnInt(String SQLQy) {
    ResultSet generatedKeys = null;
    int generatedKey = -1;

    try {
        Statement statement = conn.createStatement();
        statement.execute(SQLQy);
    } catch (Exception e) {
        errorDescription = "Failed to insert SQL query: " + SQLQy + "( " + e.toString() + ")";
        return -1;
    }

    try {
        generatedKey = Integer.parseInt(readOneValue("SELECT @@IDENTITY"));
    } catch (Exception e) {
        errorDescription = "Failed to get ID of just-inserted SQL query: " + SQLQy + "( " + e.toString() + ")";
        return -1;
    }

    return generatedKey;
} 

这篇博文很好地隔离了三个主要的SQL Server“last ID”选项:http://msjawahar.wordpress.com/2008/01/25/how-to-find-the-last-identity-value-inserted-in-the-sql-server/-还不需要另外两个。

锺离锦
2023-03-14

>

  • 创建生成的列

    String generatedColumns[] = { "ID" };
    

    把这个基因专栏交给你的陈述

    PreparedStatement stmtInsert = conn.prepareStatement(insertSQL, generatedColumns);
    

    使用ResultSet对象获取GeneratedKeys on语句

    ResultSet rs = stmtInsert.getGeneratedKeys();
    
    if (rs.next()) {
        long id = rs.getLong(1);
        System.out.println("Inserted ID -" + id); // display inserted record
    }
    

  • 车胤运
    2023-03-14

    如果它是自动生成的密钥,那么可以使用语句#getGeneratedKeys()进行此操作。您需要在与用于插入的语句相同的语句上调用它。首先需要使用语句创建语句。RETURN_生成的_密钥通知JDBC驱动程序返回密钥。

    以下是一个基本示例:

    public void create(User user) throws SQLException {
        try (
            Connection connection = dataSource.getConnection();
            PreparedStatement statement = connection.prepareStatement(SQL_INSERT,
                                          Statement.RETURN_GENERATED_KEYS);
        ) {
            statement.setString(1, user.getName());
            statement.setString(2, user.getPassword());
            statement.setString(3, user.getEmail());
            // ...
    
            int affectedRows = statement.executeUpdate();
    
            if (affectedRows == 0) {
                throw new SQLException("Creating user failed, no rows affected.");
            }
    
            try (ResultSet generatedKeys = statement.getGeneratedKeys()) {
                if (generatedKeys.next()) {
                    user.setId(generatedKeys.getLong(1));
                }
                else {
                    throw new SQLException("Creating user failed, no ID obtained.");
                }
            }
        }
    }
    

    请注意,JDBC驱动程序是否工作取决于它。目前,大多数最新版本都可以工作,但如果我没有记错的话,Oracle JDBC驱动程序仍然有点麻烦。MySQL和DB2已经支持它很多年了。PostgreSQL不久前开始支持它。我无法评论MSSQL,因为我从未使用过它。

    对于Oracle,您可以在同一事务中的INSERT之后直接调用CallableStatement,使用RETURNING子句或SELECT CURRVAL(sequencename)(或任何特定于数据库的语法)来获取最后生成的密钥。请参见此答案。

     类似资料:
    • 问题内容: 如何在JDBC中获取插入ID? 问题答案: 如果它是自动生成的密钥,那么你可以使用它。你需要Statement使用与用于相同的名称进行调用INSERT。首先,你需要创建用于通知JDBC驱动程序以返回键的语句。 这是一个基本示例: 请注意,你是否依赖JDBC驱动程序。当前,大多数最新版本都可以使用,但是如果我没错,Oracle JDBC驱动程序仍然有些麻烦。MySQL和DB2已经支持它很

    • 问题内容: 我想在Java中使用JDBC在数据库(本例中为Microsoft SQL Server)中进行记录。同时,我想获取插入ID。如何使用JDBC API实现此目的? 问题答案: 如果它是自动生成的密钥,那么你可以使用它。你需要使用与用于相同的名称进行调用。首先,你需要创建用于通知JDBC驱动程序以返回键的语句。 这是一个基本示例: 请注意,你是否依赖JDBC驱动程序。当前,大多数最新版本都

    • 问题内容: 问题标题怎么说。使用诸如之类的查询时,我是否需要提供表名或任何其他信息以指定我正在谈论的表/数据库? 问题答案: 返回当前会话中生成的最新标识。在大多数情况下,您可能需要使用它,它返回当前作用域中生成的最新标识。 例如,如果您向 table1中 插入一行,但是该插入触发了将行插入到 table2中 的触发器,则它将从 table2 返回标识,而将从 table1 返回标识。

    • 问题内容: 我正在使用JDBC批处理插入插入许多记录。有什么方法可以获取每个记录的生成密钥吗?我可以配合批量插入使用吗? 我在用 我正在考虑与循环一起使用以获得所需的结果。还有其他解决方案吗? 问题答案: 似乎Oracle 12c不支持根据以下页面将自动生成的密钥与批处理更新结合使用: http://docs.oracle.com/cd/E16655_01/java.121/e17657/jdbc

    • 保存课程()应该启动验证导师()来创建和/或验证导师的当前输入信息是否可以添加到课程实体构造器中。mMentorViewModel.save导师(mMentor)应该通过Schuldler存储库,而Schuludler存储库使用数据库中的MentorDAO来插入新的导师。 我读过这个方法Android Room-使用auto generate获取新插入行的id,但是我缺少一些关于如何获取新创建的m

    • 这是我的密码 我想获取特定记录的最后一个插入id。我试过使用雄辩的ORM。但它不起作用。 任何帮助都将不胜感激。 非常感谢。