java - JdbcTemplate:以字符串形式访问 MySQL VARBINARY 字段

标签 java mysql spring jdbc jdbctemplate

我在使用 JdbcTemplate 读取 MySQL 的 VARBINARY 字段时遇到问题。我们将字符串缩写(“ABC”、“XYZ”、“LMN”等)存储为 VARBINARY(不要问我为什么)。奇怪的是,当我使用 Connection 类/PreparedStatement 路由和普通的旧 ResultSets 与 SqlRowSet 时,我在读取 String 时没有问题。也就是说,

此代码有效:

String sql = "select MY_VARBINARY_FIELD from MY_TABLE where KEY1=? and KEY2=?";
PreparedStatement stmt = connectionDev.prepareStatement(sql);
prepStmt1.setInt(1, key1);
prepStmt1.setInt(2, key2);
ResultSet rs = stmt.executeQuery();

while (rs.next()) {
    String s = rs.getString("MY_VARBINARY_FIELD");
    System.out.print(s + " ");
}

**Output:** AHI-1 DKFZp686J1653 FLJ14023 FLJ20069 JBTS3 ORF1 dJ71N10.1 

但是这段代码没有:

String sql = "select MY_VARBINARY_FIELD from MY_TABLE where KEY1=? and KEY2=?";
Object[] params = {key1, key2};
SqlRowSet rows = getJdbcTemplate().queryForRowSet(sql, params);

while (rows.next()) {
    String s = rows.getString("MY_VARBINARY_FIELD");
    System.out.print(s + " ");
}

**Output:** [B@3a329572 [B@4ef18d37 [B@546e3e5e [B@11c0b8a0 [B@399197b [B@3857dc15 [B@10320399 

为什么 SqlRowSet 和 ResultSet 为 VARBINARY 生成不同的字符串表示形式?以及如何使用 JdbcTemplate/SqlRowSet 获得“正确”的表示?

谢谢!

解决方案

Mark Rotteveel(下)回答了这个问题。我让它与此一起工作:

String sql = "select MY_VARBINARY from MY_TABLE where KEY=VALUE";

SqlRowSet rows = getJdbcTemplate().queryForRowSet(sql);

while (rows.next()) {
     byte[] varbinary = (byte[]) rows.getObject("MY_VARBINARY");
     System.out.println(new String(varbinary));
}

最佳答案

[B@3a329572 等是字节数组上的 toString() 的结果。 VARBINARY 在 JDBC 中使用 byte[] 表示。当您直接在 PreparedStatement 上访问它时,驱动程序很可能会执行 new String(getBytes(idx)),而 JdbcTemplate 可能会执行 getObject(idx)。 toString() 而不是,导致输出如 [B@3a329572

因此,要解决此问题,请在 JdbcTemplate 上执行 getBytes(),然后自己将其转换为字符串,或者(更好的是)直接使用字节数组更改将列数据类型改为 VARCHAR。

关于java - JdbcTemplate:以字符串形式访问 MySQL VARBINARY 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14013534/

相关文章:

java - CodeModel - 如何使用枚举值定义注释?

mysql - AWS lambda 处理程序和 MySQL 数据库。第一个客户端连接插入的行对第二个客户端连接不可见

java - 我可以将 Spring @bean 定义为 @Repository 或 @Service 吗?

java - @Value注释不返回值

java - 使用用户名和密码连接到另一个服务的 Spring Security 5.2/WebClient 方式是什么?

java - 位图内存不足问题

java - 签名中的空格是什么意思?

java - 放大 Canvas 中的点,所有内容都基于某个点

MySQL ORDER BY 多列 ASC 和 DESC

sql - mysql 查询没有给出正确的结果