package javacodebook.jdbc.serializer;

import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;

public class SerializeObjectsToDB {

    public static void main(String[] args) {
        try {
            Class.forName("org.postgresql.Driver");
            Connection con =
                DriverManager.getConnection(
                    "jdbc:postgresql:test",
                    "postgres",
                    "postgres");

            // Datenbank von alten Einträgen reinigen
            con.createStatement().executeUpdate(
                "DELETE FROM serialized");

            // Ein PreparedStatement für das Einfügen der
            // serialisierten Objekte vorbereiten
            PreparedStatement statement =
                con.prepareStatement(
                    "INSERT INTO serialized(id,object) "
                        + "VALUES(?,?)");

            // Ein paar Objekte zum Speichern vorbereiten
            Vector toSave = new Vector();
            toSave.add("There's one");
            toSave.add(new Integer(2));
            toSave.add(new StringBuffer("..."));

            // Die Objekte erst in den Speicher serialisieren...
            ByteArrayOutputStream mem =
                new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(mem);
            out.writeObject(toSave);
            out.close();

            statement.setInt(1, toSave.hashCode());
            // ...dann als Byte-Array in das PreparedStatement
            // packen
            statement.setBytes(2, mem.toByteArray());
            statement.execute();

            // Danach werfen wir die Objekte weg...
            toSave = null;

            ResultSet result =
                con.createStatement().executeQuery(
                    "SELECT id,object FROM serialized");
            while (result.next()) {
                System.out.println("ID:   " + result.getInt(1));

                // ...und holen sie aus der Datenbank wieder raus
                ObjectInputStream in =
                    new ObjectInputStream(
                        result.getBinaryStream(2));
                System.out.println("Object: " + in.readObject());
            }

            // Die Tabelle machen wir wieder sauber
            con.createStatement().executeUpdate(
                "DELETE FROM serialized");

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
