lunes, julio 17, 2006

Guardar un objeto Java en MySQL

Programación:
A continuación voy a proponer un tema de programación interesante: guardar un objeto en base de datos (concretamente en MySQL). Para empezar, la tabla usará un tipo de dato LONGBLOB para guardar el objeto en cuestión. Lo que vamos a hacer es guardar un objeto de Java creado por nosotros tal cual en una tabla MySQL.
La teoría
Bueno, partimos de una tabla con una columna LONGBLOB sin un tipo de tamaño definido. Aquí podríamos meter casi cualquier cosa. Para insertar el objeto tendríamos que hacer:
  1. Crear un PrepareStatment
  2. usar "setObject(1,objeto)" por ejemplo para pasar el objeto
  3. realizar el executeUpdate para la inserción

Vale, hasta aquí no hay ningún problema. "Supuestamente", para obtener el susodicho objeto de la base de datos bastaría con hacer el select convencional y hacer un casting desde el ResultSet. Algo así:
"MiClase obj = (MiClase) rs.getObject(1);" por ejemplo.
Si esto os funciona, no sigáis leyendo, porque a mí no me funcionó. Me dio el típico y fastidioso (por lo poco que dice) ClassCastException. Vale, no se puede recuperar el objeto haciendo un casting directo.
El problema
El casting, lo que devuelve el resultSet.getObject es un array de bytes, al menos eso me deuvelve a mí, y según he visto por otros foros le ocurre a más gente. Bueno, quizás esto es lo que tiene que devolver. Pues entonces un casting directo no vale.
La solución.
No es un gran descubrimiento, pero quizás ya intuyáis cómo sacar el objeto atrapado en el array de bytes: usando ByteArrayInputStream junto con un ObjectInputStream. Este sería el código:

ByteArrayInputStream bai = new ByteArrayInputStream(array);
System.out.println("Creado el ByteArrayInputStream... OK "+bai.getClass());
ObjectInputStream ois = new ObjectInputStream(bai);
System.out.println("Creado el ObjectInputStream... OK "+ois.getClass());

bObjeto = (MiClase) ois.readObject();
(omitidas capturas de excepciones pertinentes).
Ahora, si hacemos un System.out.println(bObjeto.getClass()); nos dará la clase de verdad de nuestro objeto.

Espero que a alguien le haya servido de ayuda.

1 Comments:

At 6:18 p. m., Anonymous Anónimo said...

Genial! me he tirado varios días parado por esta tontería. No pasaba de la maldita excepción de los webos. Muchas gracias

 

Publicar un comentario

<< Home