将Java对象保存到PostgreSQL

7

我希望将我的Java对象保存到PostgreSQL列中,我正在寻找一种简单的方法来实现。

  1. 哪种列类型可以存储对象?
  2. 我听说过序列化,但我有点迷茫。如何对对象进行序列化/反序列化?
1个回答

10

没有特定的列类型。像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)
)

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


这个链接,http://www.java2s.com/Code/Java/Database-SQL-JDBC/HowtoserializedeserializeaJavaobjecttotheMySQLdatabase.htm 已经很清楚地说明了如何将一个Java对象序列化和反序列化到MySQL数据库中,而没有使用任何ByteArrayInputStream、ObjectOutputStream等类。请问这样做有什么问题吗? - M-D
我遇到了一个类似的问题,看到了这个答案。但是,由于某种原因,我的编译器对以下代码行存在问题:preparedStatement.setBinaryStream(bais);它无法解析该方法。我已经阅读了文档,发现参数与规范相符,所以我不确定问题出在哪里。 - Rome_Leader

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接