JdbcTemplate:将MySQL VARBINARY字段作为字符串访问



我有麻烦阅读MySQL的VARBINARY字段作为使用JdbcTemplate的字符串。我们将字符串缩写("ABC","XYZ","LMN"等)存储为varbinaryys(不要问我为什么)。奇怪的是,当我使用连接类/PreparedStatement路由和普通的旧ResultSets vs. 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 

但是这段代码没有:

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产生不同的String表示?我怎样才能得到使用JdbcTemplate/SqlRowSet的"正确"表示?

谢谢!

<

解决方案/strong>

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。

如果我像下面这样使用,它是好的。

  • org。mybatis 3.2.8
  • mysql-connector-java 5.1.38 || mariadb-connector-java
  • Java Bean,私有字符串myVarbinary;

my_varbinary(64)用于SessionID/NameOfEnglis h,因此我不需要考虑character_set和编码/解码。

最新更新