【发布时间】: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 行。所有这些对象都是配置客户端的“属性”:当客户端启动程序时,它会选择他的所有属性并相应地配置自己。