07 noviembre, 2006

JDBC - Acceso a Bases de Datos

JDBC es la API Java a través de la cual podemos conectarnos a las bases de datos para ejecutar sentencias SQL.

Nuestro programa Java se conecta a la base de datos utilizando un driver JDBC. La especificación habla de cuatro tipos de driver pero en la práctica solo utilizaremos dos:

  • El driver de Tipo IV – Es un driver escrito en Java y lo utilizaremos para conectarnos a la base de datos a través de un socket. Como se conecta directamente al listener de la base de datos no requiere ningún tipo de instalación adicional en el cliente.
  • El driver JdbcOdbcBridge – Es un driver que viene con J2se y sirve para conectar el programa java a ODBC y desde allí a la base de datos. Este driver nos permite acceder (por ejemplo) a Access, a archivos DBF (de Clipper, DBase), etc.

En los ejemplos que vamos a ver a continuación vamos a considerar que existen las siguientes tablas:


Ejecutar Querys

Veamos un programa que hace una consulta sobre la tabla DEPT.






El Driver
String driver="oracle.jdbc.driver.OracleDriver";

Esta línea define la clase que implementa el driver de tipo IV provisto por el fabricante de la base de datos que vayamos a utilizar. Es decir: debemos disponer de la clase OracleDriver (en este caso) y además debe estar definida en el CLASSPATH. Oracle provee esta clase en un archivo llamado classes12.jar.

El URL
String url="jdbc:oracle:thin:@192.168.1.3:1521:xe";

El URL es lo que se conoce como “String de Conexión”. Basicamente se trata de un string en el que se definen algunos parámetros de la conexión. El formato es totalmente arbitrario por lo tanto es diferente para cada base de datos.

  • jdbc:oracle – Para Oracle comienza así
  • thin – Es el driver de tipo IV. Oracle lo llama thin
  • 192.168.1.3 – Host donde está la base de datos
  • 1521 – Puerto donde escucha el listener. Para Oracle por defecto es 1521
  • xe – SID (Service ID)
Si queremos conectarnos con Access entonces debemos definir un DSN (o una Fuente de Datos) de ODBC y luego cambiar el driver y el URL de la siguiente forma:
  • String url = “jdbc:odbc:ACCESS
  • String driver = “sun.jdbc.odbc.JdbcOdbcDriver”
donde ACCESS es el DSN que configuramos en el ODBC.

El siguiente gráfico muestra como crear una fuente de datos (en Windows 2000).

  1. El ícono "Origenes de Datos (ODBC)" se encuentra en "Panel de Control -> Herramientas Administrativas".
  2. Luego seleccionamos el driver para Access "Microsoft Access Driver (*.mdb)" y presionamos el botón "Finalizar".
  3. En el "Nombre del Origen de Datos" escribimos el nombre que vamos a asignar. En nuestro ejemplo es: ACCESS.
  4. Luego presionamos "Seleccionar" y buscamos la base de datos (*.mdb) que vamos a relacionar con el nombre que elegimos.

ResultSetMetaData

Volviendo a JDBC, en el ejemplo anterior consideramos un SELECT típico, en el cual conocemos las columnas y el tipo de datos de las mismas. A continuación veamos un SELECT genérico donde no sabemos cuantas columnas tiene la tabla ni de que tipo de datos son.



Vemos que el objeto rsmd cuya clase es ResultSetMetaData tiene el método getColumnCount() que indica la cantidad de columnas que trajo el resultado.


Ejecutar Updates

Veamos como ejecutar un update. Consideramos UPDATE a toda sentencia que no es un SELECT. Por lo tanto podemos ejecutar INSERT, UPDATE, DELETE y las sentencias DDL como CREATE, ALTER, etc.




Ejecutar Sentencias Preparadas (PreparedStatement)

Las sentencias preparadas son sentencias parametrizadas.



En lugar de utilizar un Statement utilizamos un PreparedStatement. Esta clase permite parametrizar la sentencia que vamos a ejecutar.

Tiene dos ventajas importantes sobre el Statement:

1 – Si necesitamos ejecutar varias veces la misma sentencia entonces es mas eficiente una sentencia preparada ya que queda preparada en el motor de la base de datos y por lo tanto le daremos menos trabajo.

2 – Aunque solo necesitemos invocar la sentencia una única vez es mas práctica porque podemos setearle los valores utilizando tipos de dato (o clases) Java.
Para esto estan los métodos setString, setInt, setDate, etc.


Veamos como setear una fecha en un campo de tipo DATE.