这是我在这里的第一个问题,但在向你询问之前,我已经在互联网上进行了搜索而没有解决方案。
我想将Java对象存储在MySql数据库中,并且这样做我正在为所有对象使用数据类型BLOB。 MySql表是:
git log --diff-filter=R master..branch
在那里,我必须存储像Color,Font和Boolean这样的Java对象:
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;
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();
是一个扩展AbstractButton的自定义类。
所有这些代码都正常。
我的问题是当我尝试检索布尔对象时,这是代码:
JSwitchButton
当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
错误。这个错误来自于布尔对象,在存储操作期间,被转换为MySql数据库中的TINYINT值,并且它不存储为布尔对象。
所以问题是:如何将布尔对象存储到BLOB MySql类型中,如何将其再次检索到布尔对象,就像我使用Color或Font一样?有没有办法让我可以像对象一样存储布尔值,而不是原始类型?
谢谢大家。
答案 0 :(得分:0)
首先,正如@Jorge Campos指出的那样,你所拥有的是不用于在数据库中存储内容的良好结构。即使对于您的应用程序,简单的配置数据最好以某种平面文本格式存储(即 INI Files或类似。如果您真的必须 使用数据库时,您当然应该考虑使用位于MySQL上的object oriented database甚至是Object-Relational Mapping (ORM)工具(例如Hibernate)。
开始实际的回答,只需在上面的代码中更改行else if (o.getClass().equals(
布尔 .class))
(请注意粗体),使用更合适的类,例如Integer
或Byte
- 这样当从MySQL返回TINYINT时,您将能够代表它。
顺便说一句,我认为你会从The StackExchange code review site https://codereview.stackexchange.com/中受益。您的代码非常草率,并且肯定会受益于审核。如果您真的想要,可以在不更改数据库的情况下检查代码。