Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将java对象保存到PostgreSQL_Java_Sql_Postgresql_Serialization_Jdbc - Fatal编程技术网

将java对象保存到PostgreSQL

将java对象保存到PostgreSQL,java,sql,postgresql,serialization,jdbc,Java,Sql,Postgresql,Serialization,Jdbc,我想将我的java对象保存到postgresql列,我正在寻找一种简单的方法 存储对象的列的类型是什么 我听说了连载,但我有点迷路了。如何序列化/反序列化对象 没有特定的列类型。DB就像PostgreSQL不懂Java一样。序列化确实是一种方法。您需要做的就是让所讨论的类实现Serializable,如下所示: public YourClass implements Serializable { // ... } 然后您可以将其写入ObjectOutputStream并从ObjectI

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

  • 存储对象的列的类型是什么
  • 我听说了连载,但我有点迷路了。如何序列化/反序列化对象

  • 没有特定的列类型。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?)映射到一个fullworthy表,其中每列表示对象的一个属性。例如

    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)
    )
    

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

    此链接非常简单,即不使用任何ByteArrayInputStream、ObjectOutputStream等类。你能告诉我这是否有问题吗?我遇到了这个答案,试图做类似的事情,似乎出于某种原因,我的编译器对:preparedStatement.setBinaryStream(bais);它无法解析该方法。我已经阅读了文档,看起来参数与规范一致,所以我不确定问题出在哪里。