我不知道在数据库中保存HashMap的最佳方法是什么(HashMap可能非常大)所以我的第一个想法是将HashMap保存为blob(在列中) ),另一个想法是保存HashMap中与键对应的每个值,但这会使它变得很大我想。
我的示例课程:
public class MyObject {
private int id;
private HashMap<Integer, CustomHash> hashes;
// getters and setters
}
我还听说过序列化类并将其保存在数据库中。有什么建议吗?
也没有使用ORM只有普通的JDBC
编辑:如何将hashmap保存为clob?
CREATE TABLE IF NOT EXISTS myobjects (
id int GENERATED BY DEFAULT AS IDENTITY(START WITH 1) PRIMARY KEY,
hashes clob NOT NULL
);
我的陈述:
PreparedStatement ps = null;
try {
ps = this.connection.prepareStatement("INSERT INTO myobjects (hashes) VALUES (?)");
ps.setClob(1, (Clob) myObject.getHashes());
ps.executeUpdate();
} catch(SQLException sqlEx) {
sqlEx.printStackTrace();
} finally {
DAOUtility.close(this.connection, ps);
}
错误:HashMap无法强制转换为Clob
答案 0 :(得分:1)
免责声明:这不是最佳方式,而是众多在rdbms中保存Map实例的方法之一。
CLOB适用于大字符对象(通常最多2或4 GB)。我在上面提出了建议,因为您提到使用JSON来序列化您的地图。好的,这是一个简单的可能性(使用BLOB):
CREATE TABLE IF NOT EXISTS myobjects (
id int GENERATED BY DEFAULT AS IDENTITY(START WITH 1) PRIMARY KEY,
hashes blob(32K) NOT NULL
);
并使用您的代码段进行插入:
PreparedStatement ps = null;
try {
// serialize your map
ByteArrayOutputStream b = new ByteArrayOutputStream();
ObjectOutputStream output = new ObjectOutputStream(b);
o.writeObject(myObject().getHashes());
ps = this.connection.prepareStatement("INSERT INTO myobjects (hashes) VALUES (?)");
ps.setBinaryStream(1, new ByteArrayInputStream(b.toByteArray()));
ps.executeUpdate();
} catch(IOException ioEx) {
ioEx.printStackTrace();
} catch(SQLException sqlEx) {
sqlEx.printStackTrace();
} finally {
DAOUtility.close(this.connection, ps);
}
请注意,您的值也需要序列化。
这只会允许您在JVM上使用持久化映射。如果您打算直接在数据库中访问地图,我强烈建议您映射地图&#39;到三列(id,key,value)。这将更加透明,但需要更多工作(即更多SQL查询)来存储/检索地图。 HTH