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

Java 如何使用JDBC getGeneratedKeys获取生成的UUID类型?,java,mysql,jdbc,uuid,Java,Mysql,Jdbc,Uuid,这是特定于MySQL和我正在使用MySQL本身的UUID()函数的UUID类型的id。它给我的不是nullresultSet,而是next()值总是空的 代码如下: String insertQuery = "INSERT INTO fixtures " + "(id, whatever1, whatever2, whatever3, whatever4, " ...

这是特定于MySQL和我正在使用MySQL本身的
UUID()
函数的
UUID
类型的id。它给我的不是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 for statement.executeQuery并从结果集中检索值。下面是一段代码片段,展示了如何执行此操作:

            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;
            }

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

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

不是100%确定(这就是我评论的原因),但是IIRC,MySQL Connector/J将只返回autoincrement值(如果有的话)。由于您不使用,因此不会返回任何内容。此外,不确定名称是否与列名匹配,因此我将使用第一列(或检查resultset的元数据)侧注,鉴于注释中的类名,您使用的是MySQL Connector/J的开发版本。您可能希望坚持使用已发布的版本(最新版本为5.1.45)。没有可用的键/自动增量值。检查数据库和驱动程序版本以获得最佳结果。使用“检索作为结果创建的任何自动生成的密钥”,但没有自动生成的密钥,因为您自己指定了密钥(使用函数UUID)Yeah。如果找不到解决方案,这就是我计划使用的解决方案。但我只是不想在mysql中已有可用函数的情况下,将UUID生成依赖于我的应用程序语言。根据您的评论,没有生成键,但实际提供了-
String yourSQL=“insert into Table1(Id,Col2,Col3)值(SEQ.nextval,,?”也以与我相同的方式提供id。如果没有生成(自动增量)键,则结果集为空。如果
id
INT AUTOINCR
并且不是由INSERT提供的,那么结果集将被填充。我不确定是否有办法使用UUID密钥生成结果集。到目前为止,以JPA为例,我遇到的所有UUID密钥都是在java端生成的。有了JPA/Hibernate,我们就有了注释支持,这使得大部分工作都在应用程序端完成。所以他们的生成器注释有助于解决这个问题。但我正在尝试为AWS Lambda编写代码,所以我只想让微服务尽可能轻。因此,我们选择了纯JDBC。