Java SQL在MySQL数据库中使用HashMap属性保存类的最佳方法是什么

时间:2014-04-08 10:53:07

标签: java sql hashmap

我不知道在数据库中保存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

1 个答案:

答案 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