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

推荐答案

如果它是自动生成的密钥,那么您可以为此使用Statement#getGeneratedKeys().您需要在与INSERT相同的Statement上呼叫它.您首先使用need创建语句,使用Statement.RETURN_GENERATED_KEYS通知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不久前开始支持它.我无法 comments MSSQL,因为我从未使用过它.

对于Oracle,您可以在同一事务中的INSERT之后直接调用带有RETURNING子句的CallableStatementSELECT CURRVAL(sequencename)(或任何特定于DB的语法),以获取最后生成的密钥.另见第this answer页.

Java相关问答推荐

在FML中删除关键帧动画

Mongo DB Bson和Java:在子文档中添加和返回仅存在于父文档中的字段?

在Java中将Charsequence数组更改为String数组或List String<>

RESTful框架类字段是安全的还是不安全的

如何判断一个矩阵是否为有框矩阵?

FALSE:它应该在什么时候使用?

相同的Java SerializedLambda为implMethodKind返回不同的结果

SonarLint:只能有条件地调用方法(S)

MimeMessage emlMessage=new MimeMessage(Session,emlInputStream);抛出InvocationTargetException

声明带有泛型的函数以用作查找映射中的值

Lombok@Nonnull是否也对供应商有影响?

如何创建模块信息类文件并将其添加到JAR中?

如何在@CsvSource中传递空格作为值

如何使这两种方法合二为一?

如何在IntelliJ IDEA的Build.sbt中添加外部JAR文件?

如何在ApacheHttpClient 5中为单个请求设置代理?

如何在Spring Boot Auth服务器上正确配置CORS?

让标签占用JavaFX中HBox的所有可用空间

Java编译器是否进行了持续的折叠优化,以及如何进行判断?

设置背景时缺少Android编辑文本下划线