2010-11-28 3 views
2

Je veux enregistrer mon objet java dans la colonne postgresql et je cherche un moyen simple de le faire.Enregistrement de l'objet java dans PostgreSQL

  1. Quel type de colonne stocke les objets?
  2. J'ai entendu parler de la sérialisation, mais je suis un peu perdu. Comment puis-je sérialiser/désérialiser un objet?

Répondre

5

Il n'y a pas de type de colonne spécifique. DB comme PostgreSQL ne comprend pas Java. La sérialisation est en effet l'un des moyens. Tout ce que vous devez faire est de laisser la classe en question la mise en œuvre Serializable comme ceci:

public YourClass implements Serializable { 
    // ... 
} 

Ensuite, vous serez en mesure d'écrire à un ObjectOutputStream et lire à partir d'un ObjectInputStream. Vous pouvez ensuite utiliser PreparedStatement#setBinaryStream() pour le conserver dans une colonne binaire. Dans PostgreSQL, c'est le type 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); 
    // ... 

Inutile de dire que ce n'est pas la meilleure pratique. Mappez plutôt votre objet (javabean?) Sur une table complète dans laquelle chaque colonne représente une propriété de l'objet. Par exemple.

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

qui est ensuite mis en correspondance avec une telle table:

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

qui est beaucoup plus clair et mieux maintenable, et automatisable reuseable.

+0

Ce lien, http://www.java2s.com/Code/Java/Database-SQL-JDBC/HowtoserializedeserializeaJavaobjecttothMySQLdatabase.htm l'a mis très facilement, c'est-à-dire sans utiliser les classes ByteArrayInputStream, ObjectOutputStream, etc. Pouvez-vous s'il vous plaît me dire s'il y a un problème avec ça? –

+0

Je suis tombé sur cette réponse cherchant à faire semblable, et il semble que pour une raison quelconque mon compilateur conteste: preparedStatement.setBinaryStream (bais); Il ne peut pas résoudre la méthode. J'ai lu dans les documents, et il semble que le paramètre est en accord avec la spécification, donc je ne suis pas sûr de savoir quel est le problème. –

+0

@Rome_Leader Voir https://stackoverflow.com/a/4299800/1548776 –