存储和检索布尔对象到MySql数据库

时间:2016-01-31 21:35:34

标签: java mysql

这是我在这里的第一个问题,但在向你询问之前,我已经在互联网上进行了搜索而没有解决方案。

我想将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一样?有没有办法让我可以像对象一样存储布尔值,而不是原始类型?

谢谢大家。

1 个答案:

答案 0 :(得分:0)

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

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

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