繁体   English   中英

如何使用 JDBC getGeneratedKeys 获取生成的 UUID 类型?

[英]How to get a generated UUID type using JDBC getGeneratedKeys?

这是特定于 MySQL 和UUID类型的 id,我正在使用 MySQL 本身的uuid()函数。 它给了我 not null resultSet ,但next()值始终为空。

以下是代码:

String insertQuery = "INSERT INTO fixtures "
                        + "(id, whatever1, whatever2, whatever3, whatever4, "
                        ...
                        + "created_at) "
                        + "VALUES(UUID(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

PreparedStatement preparedStatement = connection.prepareStatement(insertQuery, Statement.RETURN_GENERATED_KEYS);
.
.
.
preparedStatement.setDate(23, sqlDate);
preparedStatement.executeUpdate();
ResultSet keysResultSet = preparedStatement.getGeneratedKeys();
System.out.println(keysResultSet); // com.mysql.cj.jdbc.result.ResultSetImpl@6892b3b6
if(keysResultSet != null && keysResultSet.next()){
     System.out.println("Generated Emp Id: "+keysResultSet.getString("id"));
} else {
     System.out.println("No KEYS GENERATED");
}

没有生成密钥,但实际上提供了:

因此,要么将创建留给数据库:

String insertQuery = "INSERT INTO fixtures "
                        + "(whatever1, whatever2, whatever3, whatever4, "
                        ...
                        + "created_at) "
                        + "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, "
                        + "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

由于我不知道如何在 MySQL 端轻松实现 UUID,我建议在 Java 端使用 UUID 的原始解决方案:

String insertQuery = "INSERT INTO fixtures "
                        + "(id, whatever1, whatever2, whatever3, whatever4, "
                        ...
                        + "created_at) "
                        + "VALUES(?, ?, ?, ?, ?, ?, ?, ?, "
                        + "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
 UUID id = UUID.randomUUID();
 preparedStatement.setString(1, id.toString());

然后获取 UUID 变得无关紧要。

对于 SQL Server 2008 及更高版本,您可以使用自动生成的 UUID 定义主键。 要检索由 INSERT 语句生成的 UUID,请在列定义之后添加 OUTPUT 选项,并将 statement.executeUpdate 替换为 statement.executeQuery 并从 ResultSet 中检索值。 这是一个显示如何执行此操作的代码片段:

            sqlStmt.append("INSERT INTO tableName");
            sqlStmt.append(" (column1");
            sqlStmt.append(", column2");
...
            sqlStmt.append(" OUTPUT inserted.columnUUID");
            sqlStmt.append(" VALUES (?, ?, ?, ?) ");
            statement = connection.prepareStatement(sqlStmt.toString());
            statement.clearParameters();
            int index = 0;
            ResultSet resultSet = statement.executeQuery();
            if (resultSet.next())
            {
                result = resultSet.getString(1);
                companyDB.varUUID = result;
            }

Jop Eggan 的回答解决了这个问题。 但是,如果该方法出现任何错误,您也可以执行以下操作:

String insertQuery = "INSERT INTO fixtures "
                        + "(id, whatever1, whatever2, whatever3, whatever4, "
                        ...
                        + "created_at) "
                        + "VALUES(?, ?, ?, ?, ?, ?, ?, ?, "
                        + "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
 UUID id = UUID.randomUUID();
 preparedStatement.setObject(1, id);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM