java - 返回新行 INSERT 时在 H2 数据库中默认生成的主键值,用于 UUID 类型列
问题描述
当使用UUID数据类型作为表的主键,并要求 H2在插入新记录时默认生成每个 UUID 值,如何访问新生成的 UUID 值的值?
我在 Java 应用程序中使用普通的 JDBC 4.x,如果这有助于解决方案。
我知道SCOPE_IDENTITY
函数返回一个在标记为自动递增序列号long
的列上生成的键。IDENTITY
但是我使用 UUID 而不是递增的数字作为我的主键列类型。
解决方案
指定生成列的名称
准备语句时,您可以选择传递为其生成默认值的列名数组。对于您的单个主键列,这意味着一个值的数组。
见方法:Connection::prepareStatement( String sql, String[] columnNames )
示例代码。
// here you can specify the list of returned attributes, in your case just the data
String[] returnedAttributes = {"data"};
String insertQuery = "insert into test(id) values(1);";
try
(
PreparedStatement insertStatement = conn.prepareStatement(insertQuery, returnedAttributes);
)
{
int rows = insertStatement.executeUpdate();
if (rows == 0)
{
throw new SQLException("Failed of insertion");
}
try (ResultSet rs = insertStatement.getGeneratedKeys()) {
if (rs.next())
{
java.util.UUID uuid = (java.util.UUID) rs.getObject("data");
System.out.println(uuid);
}
}
}
笔记
要获取您必须使用的 UUID 类型getObjct(..)
并将其转换为H2 UUID Typejava.util.UUID
文档中所述
通用唯一标识符。这是一个 128 位的值。要存储值,请使用 PreparedStatement.setBytes、setString 或 setObject(uuid)(其中 uuid 是 java.util.UUID)。ResultSet.getObject 将返回一个 java.util.UUID。
我的示例基于您在问题中共享的链接默认情况下为 H2 数据库引擎中 UUID 类型列上的每一行生成 UUID 值
推荐阅读
- javascript - 在 React/Node 项目中查找所有硬编码的字符串
- node.js - 将基于 Go-Swagger 的 API 与 Zapier 集成时出现错误 400
- android - 如何使用 OkHttpClient 真正断开与 WebSocket 的连接?
- python - 无法在不指定主键的情况下更新文档
- discord - @commands.has_permissions(administrator=True) 不能正常工作?
- python - “日期时间”列上的最小值和最大值在熊猫中未显示正确结果
- python - 是否有内置函数可以根据条件将对象列表拆分为两个列表?
- java - Spring Data JPA 在保存时通过 id 进行许多选择
- python - 带有对象检测标签的 IndexError
- javascript - 使用 mp4 文件的 Uint8Array() 块调用 appendBuffer() 后,SourceBuffer 对象上触发错误事件