【问题标题】:Store and retrieve Boolean Object to a MySql database将布尔对象存储和检索到 MySql 数据库
【发布时间】:2016-01-31 21:35:34
【问题描述】:

这是我在这里的第一个问题,但在问你之前,我已经在互联网上搜索了所有答案。

我想将 Java 对象存储在 MySql 数据库中,为此我对所有对象使用数据类型 BLOB。 MySql 表是:

CREATE TABLE settaggi_variabili_pc (`id` int(11) NOT NULL AUTO_INCREMENT, PC1 BLOB, PC2 BLOB, PC3 BLOB, PC4 BLOB, PC5 BLOB, PC6 BLOB, PC7 BLOB, PC8 BLOB, PC9 BLOB, PC10 BLOB, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=latin1;

我必须在其中存储 Java 对象,例如 Color、Font 和 Boolean:

prpdStmnt = con.prepareStatement("UPDATE settaggi_variabili_pc SET PC1=?, PC2=?, PC3=?, PC4=?, PC5=?, PC6=?, PC7=?, PC8=?, PC9=?, PC10=? WHERE id=?");
for (int i = 0; i < vDati.size(); i++)
{   
    Variabile_variabili_pc vpc = (Variabile_variabili_pc) vDati.get(i);
    Object o = null;
    if (vpc.getOggetto() instanceof Color)
        o = (Color) vpc.getOggetto();
    else if (vpc.getOggetto() instanceof Font)
        o = (Font) vpc.getOggetto();
    else if (vpc.getOggetto() instanceof JSwitchButton)
        o = (Boolean)((JSwitchButton) vpc.getOggetto()).isSelected();

    prpdStmnt.setInt(11, i + 1);
    for (int x = 1; x <= 10; x++)
    {
        prpdStmnt.setObject(x, o);  
    }

    prpdStmnt.executeUpdate();

JSwitchButton 是一个扩展 AbstractButton 的自定义类。 所有这些代码都可以正常工作。

我的问题是当我尝试检索布尔对象时,代码如下:

ritorno = db.eseguiQuery("SELECT PC1, descrizione FROM settaggi_variabili_pc");
try
{   
    while(ritorno.next())
    {
        InputStream is = ritorno.getBlob(1).getBinaryStream();
        ObjectInputStream ois = new ObjectInputStream(is);
        o = ois.readObject();

        if (o.getClass().equals(Color.class))
            System.out.println("Object type Color");
        else if (o.getClass().equals(Font.class))
            System.out.println("Object type Font");
        else if (o.getClass().equals(Boolean.class))
            System.out.println("Object type Boolean");
    }
}

catch (SQLException e)
{
    e.printStackTrace();
} catch (IOException e)
{
    e.printStackTrace();
} catch (ClassNotFoundException e)
{
    e.printStackTrace();
}

ObjectInputStream 读取布尔对象时,代码返回java.io.EOFException 错误。出现此错误是因为布尔对象在存储操作期间被转换为 MySql 数据库中的 TINYINT 值,并且未存储为布尔对象。

所以问题是:如何将 Boolean 对象存储到 BLOB MySql 类型,以及如何像使用 Color 或 Font 一样再次将其检索到 Boolean 对象?有没有办法让我可以像 Object 而不是原始类型一样存储布尔值?

谢谢大家。

【问题讨论】:

  • 第一次问得好!为此+1。虽然,我不知道您对这个系统的具体要求,但您应该知道在数据库中存储大量 blob 对性能来说是一种过度杀伤力。我认为您应该尝试以更好的设计进行思考。
  • 我的目的是存储 Java 对象,所以当我检索它时,我已经准备好在代码中使用的对象。 MySql 表只有 11 列和大约 20 行。所有这些对象都是配置客户端的“属性”:当客户端启动程序时,它会选择他的所有属性并相应地配置自己。

标签: java mysql


【解决方案1】:

首先,正如@Jorge Campos 指出的那样,您所拥有的不是 用于将内容存储在数据库中的良好结构。即使对于您的应用程序,简单的配置数据也最好以某种纯文本格式存储( INI Files 或类似格式。如果您真的必须 em> 使用数据库,您当然应该考虑使用位于 MySQL 之上的object oriented database 甚至是Object-Relational Mapping (ORM) 工具(例如Hibernate)。

得到一个实际的答案,只需更改上面代码中的else if (o.getClass().equals(Boolean.class)) 行(注意粗体),使用更合适的类,例如 IntegerByte - 这样当从 MySQL 返回 TINYINT 时,您将能够表示它。

顺便说一句,我认为您将从The StackExchange code review site https://codereview.stackexchange.com/ 中受益。您的代码非常草率,肯定会从审查中受益。如果您真的愿意,您可以在不更改数据库的情况下审查您的代码。

【讨论】:

  • 执行ObjectInputStream ois = new ObjectInputStream(is); 时出现EOFException,而不是else if..... 行。问题是在 InputStream 我只有 1 个字节。
  • @rafee 尝试使用任何用于包装该数据类型的类型。我的猜测是Byte
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 2011-08-16
  • 2017-04-03
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多