如何将Java中的字节存储到PostgreSQL的bytea中?

3

在Java中,当我尝试将一个类型为“byte”的变量插入到PostgreSQL中类型为“bytea”的变量时,出现了问题。

这是我在PostgreSQL中的表:

CREATE TABLE mesa (
   id_mesa              serial PRIMARY KEY,
   tag                  varchar(50),
   modelo               varchar(50),
   menor_complemento    smallint NOT NULL,
   peso_min             smallint NOT NULL,
   peso_max             smallint NOT NULL,
   som                  bytea NOT NULL,
   rotina               bytea NOT NULL,
   address64bits        bytea NOT NULL UNIQUE
);

我在Java中编写的代码如下:

private Mesa mesa;
//construtor
public MesaDAO (Mesa mesa) {
    this.mesa = mesa;
}
(...)
String stm = "INSERT INTO mesa(tag, modelo, menor_complemento, peso_min, "
            + "peso_max, som, rotina, address64bits) "
            + "VALUES(?,?,?,?,?,?,?,?)";
    try {
        pst = con.prepareStatement(stm);
        pst.setString(1, mesa.getTag());
        pst.setString(2, mesa.getModelo());
        pst.setInt(3, mesa.getMenorComplemento());
        pst.setInt(4, mesa.getPesoMin());
        pst.setInt(5, mesa.getPesoMax());
        pst.setByte(6, mesa.getSom());
        pst.setByte(7, mesa.getRotina());
        pst.setBytes(8, mesa.getAddress64Bits());
        pst.executeUpdate();
        (...)

这些台地类型包括:

public class Mesa{
  private Integer idMesa;
  private String tag;
  private String modelo;
  private Integer menorComplemento;
  private Integer pesoMin;
  private Integer pesoMax;
  private byte som;
  private byte rotina;
  private byte[] address64Bits;
  (...)
}

然后,当我尝试插入一些内容时,它会抛出一个PSQLException,指出“som”列是“bytea”,但表达式是“smallint”。我还认为在那之后的两行代码中也会出现相同的SQLException。
所以我不知道该如何修复它,如果有人能帮助我,我会很高兴!
提前感谢您,
编辑:
感谢大家帮我,我将在此处提供解决方案:将变量“som”和“rotina”更改为“byte []”类型,然后使用pst.getBytes(...)而不是pst.getByte(...)。
澄清:
我正在使用XBee(API模式),因此我需要通过串行端口发送字节值。因此,我只是验证从数据库获取的值是否与我插入的值相同。总之,我想知道如何从数据库中恢复字节以通过串行端口发送它们。

1
请展示一下 mesa 对象的类型。 - Diversity
如果som是一个byte,那么为什么要将其存储为byte[](这就是bytea的作用)?根据您的Java变量,som应该是一个类型为integer的列。 - user330315
2
如果你真的需要将单个字节存储为BLOB(这就是bytea的作用),你需要使用setBytes()传递一个byte[]而不是setByte() - user330315
是的,我不确定bytea是否总是byte[]。我认为它也可以是1个字节。 - Renato Pereira
1
你从打印字节数组中期望什么?另外,字节数组怎么可能被格式化?字节数组就是这样:一些原始的字节。你需要告诉它将如何被解释。 - Ingo
显示剩余4条评论
1个回答

1

使用PostgreSQL编写Java代码

pst.setBinaryStream(6, mesa.getSom());
pst.setBinaryStream(7, mesa.getRotina());
pst.setBinaryStream(8, mesa.getAddress64Bits());`

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接