java - 如何在 JDBC 中获取插入 ID?

标签 java sql jdbc insert-id

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

最佳答案

如果是自动生成的 key ,那么你可以使用Statement#getGeneratedKeys()为了这。您需要在与用于 INSERT 的相同的 Statement 上调用它。您首先需要使用 Statement.RETURN_GENERATED_KEYS 创建语句通知 JDBC 驱动程序返回 key 。

这是一个基本的例子:

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,您可以使用 RETURNING 子句或 SELECT CURRVAL(sequencename)(或任何特定于 DB 的语法)调用 CallableStatement这样做)直接在同一事务中的 INSERT 之后获取最后生成的 key 。另见 this answer .

关于java - 如何在 JDBC 中获取插入 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48920226/

相关文章:

java - 记录重复消息一次

java - 如何在资源父类的构造函数中访问HttpServletRequest?

sql - 在没有循环的情况下在 SQL 中添加迄今为止的工作日

php - 错误 : This feature is not available for the database you are using

jdbc - 使用 logstash 将数据从 MySQL 索引到 ElasticSearch 时,它显示 Java heapspace 错误

java - 计算数组中数字的频率

java - 通过Java配置运行Spring MVC的问题

php - 我使用 mysql_real_escape_string 对吗?

java - Mysql Drop Table as PreparedStatement 不适合我

java - 通过在java中读取mySQL表创建JSON文件