2011-12-06 39 views
1

我有以下代码:Java Oracle:将TreeMap存储为BLOB?

public void StoreMapInDB(TreeMap<DateTime, Integer> map) throws 
     IOException, FileNotFoundException{ 
    try { 
    PreparedStatement insertMap = null; 
    String insertString = "INSERT INTO TESTMAP(ID, NAME) VALUES (1, ?)"; 
    Connection con=null; 
    con.setAutoCommit(false); 
    Class.forName("oracle.jdbc.driver.OracleDriver"); 
    con=DriverManager.getConnection(
    "jdbc:oracle:thin:@XXXXX", 
    "XXX", 
    "XXX"); 
    //This line is incorrect for sure 
    //insertMap.setBlob(1, map.); 
    } catch(Exception e){e.printStackTrace();} 
} 

连接工程和所有数据库。这一次我试图插入地图,即我创建的树形图到类型为BLOB的表中的一列。我怎样才能做到这一点?有什么其他更好的数据类型,我应该看看?

感谢,

回答

5

如果你想要把你的对象为BLOB数据类型,你可以做这样的事情:

// Serialize to a byte array 
ByteArrayOutputStream bos = new ByteArrayOutputStream() ; 
out = new ObjectOutputStream(bos) ; 
out.writeObject(object); 
out.close(); 

// Get the bytes of the serialized object 
byte[] buf = bos.toByteArray(); 
PreparedStatement prepareStatement = connection.prepareStatement("insert into tableName values(?,?)"); 
prepareStatement.setLong(1, id); 
prepareStatement.setBinaryStream(2, new ByteArrayInputStream(buf), buf.length); 
+0

嗯...ü可以阐明你的最后一行是“使用BUF设置的Blob数据类型我试过的东西,但怀疑它的工作(尚未测试)是斑点VAR =(BLOB)地图; –

+1

更新答案 – WeMakeSoftware

+0

非常感谢:D –

1

有两种方法,你可以去这个...

  • this question的答案所示,您可以利用收集可序列化并将其输出到字节数组这一事实。

  • 您可以更改表格的类型,以便不使用二进制字段来存储TreeMap的特定实现,而是将键和值存储为单独的行,然后可以提取这些行并将其用于重建映射后来。此选项更具前瞻性,因为您永远不会依赖TreeMap及其序列化格式。您可以使用(id, key, value)而不是使用列(id, data)。要保存到数据库,您可以遍历映射的entrySet()并使用相同的行ID插入每个键/值对。

+0

感谢队友,但如果我决定按照自己的方式去做,还会有其他问题需要解决。事情是从地图访问的价值和关键是一些方法的关键。所以也许我只是保持这种方式和序列化:)谢谢虽然建议参考职位:) –