¡Bienvenidos!

Este es un espacio para compartir y producir conocimiento

domingo, 9 de octubre de 2011

Conectar Java a una base de datos Access

En este documento se explicará como realizar una conexión básica a una base de datos de Microsoft access desde JAVA, el procedimiento aquí contenido aplica para cualquier tipo de base de datos siempre y cuando se disponga del driver adecuado, ya que el código de Java en sí no presenta muchas variaciones al cambiar el tipo de base de datos (BD), únicamente se debe especificar el driver y el DSN(Database Source Name) para el acceso a  la BD. En esta entrada se indica como configurar el driver y el DSN en un sistema operativo  windows.

Primero que todo diré muy resumidamente que un driver realiza  una función de traductor entre Java y el lenguaje de acceso a las bases de datos, existen contenedores de drivers, entidades de software capaces de contener varios driver y brindar esa función para facilitar al programador la gestión de los drivers con los que cuenta y los DSN, una vez creado un DSN, asociarlo a un driver y hacerlo accesible desde Java, el programador puede acceder a la base de datos usando sentencias de SQL.


Para empezar debemos configurar el anteriormente mencionado contenedor de drivers, en este ejemplo utilizaremos el JDBC-ODBC (Java Data base Conector)- (Open Data Base Conector) que viene de manera predeterminada con el JDK (Java Development Kit), puede contener un número considerable de drivers y es gratuito. (También existen drivers que pueden ser más eficientes pero no son gratuitos y requieren un pago y/o licencia).


Se explicará la forma de configurar el JDBC en windows. Primero iremos a Panel de Control, la ruta de acceso podría variar de acuerdo a la versión de windows que se use, por ejemplo, en windows vista accedemos desde la pantalla principal del panel de control a sistema y mantenimiento, una vez ahí dentro buscamos "herramientas administrativas", y luego vamos a "orígenes  de datos ODBC", pero la ruta debe ser muy similar en otras versiones de windows, una forma fácil de acceder es ingresar a panel de control y desde la pantalla principal escribir en el campo de búsqueda "ODBC", el sistema le mostrará la ubicación de la herramienta de configuración de ODBC y se podrá acceder a ella, a continuación se muestra un screenshot que lo ilustra:

 

Ahora entramos dando click a "configurar orígenes de datos(ODBC)" y damos privilegios de usuario si son requeridos y obtendremos la siguiente pantalla:

Nuestro objetivo es crear un DSN al cual hacer referencia desde java, por esta razón seleccionamos la pestaña "DSN de usuario" en caso de no salir seleccionada por defecto, luego hacemos click en "agregar", el sistema nos solicitará que indiquemos el tipo de driver a utilizar, el cual depende del tipo de base de datos, en nuestro caso es una base de datos de Microsoft Access por lo tanto seleccionamos el driver correspondiente, verificamos la extensión del archivo, (los archivos de access tienen una extensión .mdb):

A continuación nos pedirá el ingreso del nombre del origen de datos, es decir, el DSN, el cual será utilizado como identificador en la conexión de Java con la DB, no necesariamente debe coincidir con el nombre de la base de datos, el campo descripción es opcional y es para describir la función del driver y documentación, si se requiere una autenticación para ingresar a la base de datos vamos a la casilla ("avanzadas..") y especificamos los campos necesarios correspondientes al nombre de usuario y contraseña.

 Damos click en seleccionar para indicar cual será la base de datos asociada a ese DSN, luego buscamos el directorio de nuestra base de datos y damos click en aceptar. Ahora nos debe salir en la pantalla de los DSN nuestro nuevo nombre de origen de datos, en mi caso curso1 ( el cual corresponde a un ejemplo dado en un curso de aprendizaje virtual del SENA que tomé). Una vez hecho esto ya podemos hacer uso de este DSN para desde Java consultar y modificar la base de datos.

Primero que todo importamos el paquete java.sql, para ver sus especificaciones y  las clases que ofrece puede consultarse la página: http://download.oracle.com/javase/7/docs/api/ , aquí encontrará la API (Application Programmer Interface) que ofrece una descripción de las clases, interfaces y los métodos disponibles en Java.

Esto se hace por medio de la sentencia import java.sql.*; 
navegando por la API podemos observar cuatro de las clases que utilizaremos en el programa:
  • DriverManager: utilizado para cargar los drivers
  • Connection: para establecer las conexiones a las bases de datos.
  • Statement: Por medio de esta clase enviamos consultas en el lenguaje de bases de datos
  • ResultSet: Esta clase almacena el resultado de las consultas generadas por un Statement.
La estructura de un programa básico que únicamente consulte una base de datos es la siguiente

se debe disponer de una base de datos que tenga una tabla que se llame "lista" en donde hallan dos columnas, una donde se almacene el nombre de un trabajador (String) y otra donde se almacene su sueldo(double)

//importamos el paquete de Java que permite usar las clases que nos comunican con la base de datos
import java.sql.*;   


public class BaseDeDatos{
   
   
    public static void main(String[] args){
//indicamos el contenedor driver que usaremos     
        try{
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        }catch(ClassNotFoundException ex){
            System.out.println(ex.getMessage());
        }
// con este bloque imprimiremos en consola la lista de drivers disponibles:
            Enumeration<Driver> misdrivers = DriverManager.getDrivers();
            while (misdrivers.hasMoreElements() == true){
                System.out.println(misdrivers.nextElement());
            }
// Creamos la conexión a la base de datos, aquí es importante cambiar la parte donde dice "nombreorigen" por el DSN  que se especificó en la configuración del ODBC 
        try{
            Connection conexion = DriverManager.getConnection("jdbc:odbc:nombreorigen","jdbc","jddb");
            Statement estatuto = conexion.createStatement();
//se ejecuta una consulta en el stament y se almacena el resultado en la variable rs, la cual pertenece a la clase //ResultSet, la consulta se ejecuta sobre una tabla llamada "lista", la cual  debe existir para que no se arroje //una excepción
            ResultSet rs = estatuto.executeQuery("select * FROM lista");                               
            while(rs.next()){
               /*al dar rs.next(), accedemos al siguiente elemento de los resultados, es decir, a la siguiente "fila" o registro, podemos acceder a cada uno de sus diferentes campos, "columnas" conociendo el tipo de datos que contiene, es decir, si es una cadena, un entero, un caracter, etc.. y el nombre o índice que identifica a esa columna, es importante saber que la primera columna recibe el índice de 1, (el 0 no existe y si tratamos de acceder a la columna 0 nos daría error), teniendo esto como base y suponiendo que la tabla contiene dos columnas, una con un nombre (tipo string) y otra con un sueldo (tipo double), podemos acceder a sus elementos de la siguiente forma:
*/
String nombre = rs.getString(1); //porque el nombre es de tipo string y está contenido en la columna 1
double sueldo = rs.getDouble(2); //porque el sueldo es tipo double y está en la columna 2
System.out.println("el trabajador es: "+ nombre + " y gana "+ sueldo);
//también es posible acceder a los resultados si se conoce el nombre de la columna:
String nombre = rs.getString("nombre)";
// Ya tenemos los datos en nuestro poder y podemos hacer lo que queramos con ellos.
            } //fin del while
//Una vez obtenidos nuestros datos cerramos tanto el statement como la connection que abrimos.   
            estatuto.close();
            conexion.close();
//En caso de no poder ejecutar el Query Java nos enviará una excepción la cual debemos atrapar
        }catch(SQLException     e){
            System.out.println(e.getMessage());
        }
       
    }// fin main
} //fin clase

una de las partes más importantes del programa es la siguiente:

ResultSet rs = estatuto.executeQuery("select * FROM lista");
El método executeQuery de la clase statement recibe como parámetro una cadena que represente una consulta válida en SQL, por lo tanto ese "select* FROM lista" dado como ejemplo puede ser cambiado por cualquier consulta válida.

Se indicó como realizar consultas en una base de datos utilizando Java y JDBC, en una entrada posterior se indicará como modificar tablas en las bases de datos.