用Java读取MySQL二进制(16)UUID

这应该是一个非常简单的问题,我只是缺少一些基本的东西,而且我正在’其中一天……’不能使用Hibernate或其他ORM。 使用Java PreparedStatement。

MySQL的东西:

CREATE TABLE `article` ( `articleID` binary(16) NOT NULL, `publisherID` bigint(20) DEFAULT NULL, PRIMARY KEY (`articleID`), ) ENGINE=InnoDB DEFAULT CHARSET=utf8$$ insert into article ( articleID, publisherID ) values ( (UNHEX(REPLACE(UUID(),'-',''))), 1111 ); 

Java的东西

 PreparedStatement ps = connection.prepareStatement( "select articleID, publisherID from article" ); ResultSet rs = ps.executeQuery(); while( rs.next()) { byte[] artIDArr = rs.getBytes( "articleID" ); UUID artID = UUID.nameUUIDFromBytes( artIDArr ); } rs.close(); ps.close(); 

现在,从数据库中读取UUID …

  select hex(articleID) from article; 1C711C50E4773873AB1533401E2F420C A1FCD341EE9311E297B700FFB00BB509 A95E06B6EEE611E297B700FFB00BB509 

但是抛弃我在java代码中读到的内容:

 6c825dc9-c98f-37ab-b01b-416294811a84 de6337f9-f276-3e30-b9a3-8d9338a1977f 57ccb5af-1a66-329f-b069-69638e1af24f 

现在,这是因为我在将它们存储为二进制文件之前从UUID中删除破折号,并且补液假设它们在那里吗?

将MySql中存储为二进制(16)的UUID读取到Jav UUID对象的正确方法是什么?

编辑:如果我将preparedStatment查询更改为“选择hex(articleID)作为articleID …”并将其作为字符串读取,它当然是DB包含的内容,但是UUID会抛出exception,因为字符串缺少短划线。 ..

 UUID artID = UUID.nameUUIDFromBytes(artIDArr); 

使用MD5和补丁字节。 使用类似的东西

 static UUID toUUID(byte[] bytes) { if (bytes.length != 16) { throw new IllegalArgumentException(); } int i = 0; long msl = 0; for (; i < 8; i++) { msl = (msl << 8) | (bytes[i] & 0xFF); } long lsl = 0; for (; i < 16; i++) { lsl = (lsl << 8) | (bytes[i] & 0xFF); } return new UUID(msl, lsl); } UUID artID = toUUID(artIDArr); 

所以我只是通过在查询中用hex()函数调用包装二进制(16)来解决这个问题。 不确定哪个更高效,让DB处理转换或翻转Java中的位。 无论哪种方式,完成。

  PreparedStatement ps = connection.prepareStatement( "select hex(articleID) as articleID, publisherID from article" ); ResultSet rs = ps.executeQuery(); while( rs.next()) { String artIDStr = rs.getString( "articleID" ); UUID artID = getUUIDFromString( artIDStr ); 

我将Eggen的答案标记为正确,因为他付出了努力并且可能有效。 8)