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

ktm*_*124 7 java mysql spring jdbc jdbctemplate

我无法使用JdbcTemplate将 MySQL的VARBINARY字段作为String 读取.我们将字符串缩写("ABC","XYZ","LMN"等)存储为VARBINARY(不要问我原因).奇怪的是,当我使用Connection类/ PreparedStatement路由和普通的旧ResultSets与SqlRowSet时,我读取字符串没有问题.也就是说,

此代码有效:

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 
Run Code Online (Sandbox Code Playgroud)

但是这段代码没有:

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 
Run Code Online (Sandbox Code Playgroud)

为什么SqlRowSet和ResultSet为VARBINARY生成不同的String表示形式?如何使用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));
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*eel 7

所述[B@3a329572等是的结果toString()的字节数组上.A 在JDBC中VARBINARY表示byte[].最有可能当你直接访问它时PreparedStatement,驱动程序会执行new String(getBytes(idx)),而JdbcTemplate可能会执行getObject(idx).toString()相反的操作,从而产生类似的输出[B@3a329572.

所以要解决这个问题,getBytes()在JdbcTemplate上做一个,然后自己将其转换为字符串或者(更好),直接使用字节数组或者将列数据类型改为VARCHAR.