lunes, 7 de enero de 2008

Java Datastore el Pilar de acceso a los datos

12 Noviembre 2007

Con las disculpas a todos los programadores de Java, la nomenclatura que utilizare para las objetos provienen de la costumbre de programar en PowerBuilder.
Creando el Objeto Java Datastore, este objeto seria un objeto no visual, a continuación la declaración y el constructor:


Como podemos ver, las propiedades principales son :
  • PSqlca Objeto Conexión
  • rs Objeto Resultset
  • rsm Objeto Resultsetmetadata
  • stm Objeto Statatement
El objeto PSqlca me permitirá tener una sola conexión ya que esta sera un parámetro del constructor del objeto, generalmente en las ventanas podre manejar varios objetos datastore con una única conexión permitiéndome de esta manera cierto nivel de control de las transacciones sobre el conjunto de datos en una ventana.

El Objeto rs es el encargado de realizar todas las operaciones de recuperación y manipulación de datos.

El Objeto rsm me permitirá recuperar la metadata de los campos ayudándome a determinar los tipos de datos, nombres de las columnas, tamaño, etc.

Este Objeto implementara principalmente los siguientes métodos:
  • Insertrow
  • Deleterow
  • Retrieve
  • Getvalue
  • Setvalue
  • Close
  • Update
  • Getcolumnname
  • Rowcount
  • Commit
  • Updaterow
Lógicamente que el total de métodos que implementa este Objeto son mucho mas. Internamente se realizan las validaciones de los diferentes tipos de datos realizando las transformaciones cuando sean pertinentes. De todos los métodos que menciono en la lista de repente vale la pena aclarar sobre el método Updaterow(), este método tiene la función de actualizar el registro actual del resultset pero sin realizar un commit para aceptar la transacción, la función Update() es la encargada de procesar la transacción.

Las conexiones que utilizare en el sistemas tendrán desactivada la propiedad autocommit permitiéndome aceptar o rechazar la transacción según sea el caso.

Los Objetos Resultset tienen una forma particular de realizar las inserciones de un registro, esto se realiza en 2 pasos, primero se tiene que llamar a la función moveToInsertRow() la cual nos lleva a un buffer donde se realizara la inicializacion de los campos y de la llave primaria( Es responsabilidad de este objeto inicializarla) , en este momento se utilizaran las funciones updateXXX (xxx dependiendo del tipo de datos), hasta este momento los datos de inserción solo existen en un buffer, para volcar estos datos en el resultset se llama a la función insertRow(), es aquí donde los datos serán volcados a la base de datos.
Aqui se nos presenta un problema como el Objeto datastore sabrá que campos son la llave primaria ? para solucionar este problema el objeto implementa un método cuya función es almacenar en un array de String(Cadenas) los nombres de las columnas que son llaves primarias. Aquí el código del método:


Aqui vemos el uso de diferentes funciones las cuales no describiré ya que seria demasiado extenso el tema, sugiero a los lectores buscar en la ayuda para mas detalles de cada una de ellas.
Una vez conocido que campos son la llave primaria el objeto podrá inicializar sus valor teniendo en cuenta el tipo de datos, si no se inicializaran los valores antes de llamar a la función insertRow() en el momento de la inserción, el controlador Jdbc nos arrojaría un error de que la llave primaria no debe ser nula, el objeto implementa un método para tal caso.

Otro problema interesante con el cual me encontré es como el controlador Jdbc en mi caso Jaybird determinaría cuando un campo es autoincremental en la base de datos. Esto dependerá mucho del motor de base de datos con el cual se este trabajando, en mi caso Firebird implementa los campos autoincrementales haciendo uso de Generadores y disparadores . Jaybird no me detecta correctamente los campos que son incrementales, en este caso tuve que implementar un método en el objeto para que me determine este dato, aquí el código del método:

Nuevamente cabe recalcar que este método solo funcionara con Firebird ademas de tener en cuenta una nomenclatura especifica para los generadores, el cual estará en función de la tabla y columna como se muestra en el código, posiblemente otros controladores Jdbc ya tengan este método implementado. Como se puede apreciar la solución que planteo se basa en el uso del repositorio de Firebird.
El problema subsiguiente por cuestión lógica es recuperar el valor del campo autoincremental para lo cual implemente otro método que realiza esta función, como el manejo del repositorio de Firebird no esta muy difundido también pongo el código aquí:


Como es de pensar este objeto tiene muchos métodos y describirlos todos me demandaría muchas hojas y perdería el sentido genérico que pretendo dar sobre los problemas presentados en el desarrollo de este proyecto.
Con mucho gusto aclarare cualquier duda al respecto sobre este objeto solo tienes que preguntar.

No hay comentarios: