【问题标题】:Saving java object to PostgreSQL将 java 对象保存到 PostgreSQL
【发布时间】:2010-11-28 04:08:38
【问题描述】:

我想将我的 java 对象保存到 postgresql 列,我正在寻找一种简单的方法来做到这一点。

  1. 什么类型的列存储对象?
  2. 我听说过序列化,但我有点迷路了。如何序列化/反序列化对象?

【问题讨论】:

    标签: java sql postgresql serialization jdbc


    【解决方案1】:

    没有特定的列类型。 DB之类的PostgreSQL不理解Java。序列化确实是其中一种方式。您需要做的就是让相关类实现Serializable,如下所示:

    public YourClass implements Serializable {
        // ...
    }
    

    然后您就可以将其写入ObjectOutputStream 并从ObjectInputStream 读取。然后,您可以使用 PreparedStatement#setBinaryStream() 将其持久化到二进制列。在 PostgreSQL 中,这是 bytea 类型。

    YourClass instance = getItSomehow();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(instance);
    oos.close();
    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
    
    Connection connection = null;
    PreparedStatement preparedStatement = null;
    
    try {
        connection = database.getConnection();
        preparedStatement = connection.prepareStatement(SOME_SQL);
        preparedStatement.setBinaryStream(bais);
        // ...
    

    不用说,这不是最佳做法。而是将您的对象(javabean?)映射到一个完整的表,其中每一列代表对象的一个​​属性。例如

    public class Person {
        private Long id;
        private String firstname;
        private String lastname;
        private Integer age;
        // ...
    }
    

    然后将其映射到这样的表:

    CREATE TABLE Person (
        id SERIAL PRIMARY KEY,
        firstname VARCHAR(255),
        lastname VARCHAR(255),
        age NUMERIC(3)
    )
    

    这更清晰,更易于维护、可重用和自动化。

    【讨论】:

    • 这个链接java2s.com/Code/Java/Database-SQL-JDBC/…说得很简单,就是不用任何ByteArrayInputStream、ObjectOutputStream等类。你能告诉我这是否有问题吗?
    • 我遇到过这个寻求类似的答案,似乎出于某种原因我的编译器有问题:preparedStatement.setBinaryStream(bais);它无法解析该方法。我已经阅读了文档,似乎参数与规范一致,所以我不确定问题是什么。
    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多