29
Como conectar java con access. Bueno es muy sensillo. lo p`rimero que nesecitamos es son dos clases una llamada AccesoBD.java y Conector.java despues hacer un ODBC driver de access en panel de control, en Herramientas Administrativas, despues en Orígenes de datos (ODBC). Dentrop de "Orígenes de datos (ODBC)", en la pestaña de DSN de usuario, le damos agregar. En la nueva ventana seleccionamos "Driver do Microsoft Access (*.mdb)" despues tenemos que hacer lo siguiente le damos un nombre al ODBC este debe de ser el mismo que coloquemos en la clase Conector.java y tambien tenemos que seleccionar el lugar donde esta hubicada la base de datos. Lo siguiente en la clase Conector.java en la siguiente linea debemos de poner el nombre que le dimos al driver en la parte de arriba. conectorBD = new AccesoBD("sun.jdbc.odbc.JdbcOdbcDriver","jdbc:odbc :ODBCMiBaseDeDatos","",""); y eso es todo aqui les dejo un ejemplo de una de mis clases en las que hago uso de estas dos clases. Esta se llama MultiProducto.java en ella vienen varias consultas y update y delete. espero les sirva esta ayuda que les doy. EL PUENTE JDBC-ODBC En este artículo se explica la manera de implementar el puente JDBC-ODBC para que una aplicación escrita en Java pueda acceder una base de datos en MS Access. El puente JDBC-ODBC también puede implementarse para conectar a Java con bases de datos como FoxPro. Se mostrará también la manera de crear y configurar un origen de datos con nombre DSN. Introducción a el Puente JDBC-ODBC. Existiendo ODBC drivers, estos pueden utilizarse para aplicaciones Java por medio de el puente JDBC-ODBC proporcionado por Sun. Usar el puente JDBC-ODBC no es una solución ideal dado que requiere de la instalación de drivers ODBC y entradas de registro. Los drivers ODBC a su vez son implementados nativamente lo que compromete el soporte multiplataforma y la seguridad de applets. El puente es por si mismo un driver basado en tecnología JDBC que está definida en la clase sun.jdbc.odbc.JdbcOdbcDriver. El puente JDBC-ODBC debe ser considerado como una solución transitoria. Sun Microsystems y las tecnologías DataDirect estan trabajando para hacerlo más confiable y robusto, pero ellos no lo consideran un producto recomendado. Con el desarrollo de drivers puros en Java, el puente se volverá innecesario. Lo ideal es “Java Puro”: no código nativo, no características de plataforma dependiente. Sin embargo puede utilizarse si se requiere desarrollar inmediatamente sin poder esperar a que el fabricante de la base de datos utilizada proporcione el driver JDBC. Los drivers parcialmente nativos, como el puente JDBC-ODBC, le permiten crear programas que pueden fácilmente ser adaptados a drivers puros en Java tan pronto como estén disponibles. Fuente: Sun Microsystems www.sun.com/ Hasta aquí con la pequeña introducción acerca del puente JDBC-ODBC. La última parte de esta introducción nos habla de adaptar nuestras aplicaciones basadas en puentes JDBC-ODBC a drivers puros JDBC. Esto es verdadero, sin casi nada de cambio en el código. Personalmente he creado proyectos que trabajan inicialmente con Access y el puente JDBC-ODBC,

Como Conectar Java Con Access

  • Upload
    thevios

  • View
    1.240

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Como Conectar Java Con Access

Como conectar java con access.

Bueno es muy sensillo. lo p`rimero que nesecitamos es son dos clases una llamada AccesoBD.java y Conector.java despues hacer un ODBC driver de access en panel de control, en Herramientas Administrativas, despues en Orígenes de datos (ODBC).Dentrop de "Orígenes de datos (ODBC)", en la pestaña de DSN de usuario, le damos agregar.En la nueva ventana seleccionamos "Driver do Microsoft Access (*.mdb)"despues tenemos que hacer lo siguiente le damos un nombre al ODBC este debe de ser el mismo que coloquemos en la clase Conector.javay tambien tenemos que seleccionar el lugar donde esta hubicada la base de datos.Lo siguiente en la clase Conector.java en la siguiente linea debemos de poner el nombre que le dimos al driver en la parte de arriba.

conectorBD = new AccesoBD("sun.jdbc.odbc.JdbcOdbcDriver","jdbc:odbc :ODBCMiBaseDeDatos","","");

y eso es todo aqui les dejo un ejemplo de una de mis clases en las que hago uso de estas dos clases. Esta se llama MultiProducto.java en ella vienen varias consultas y update y delete.espero les sirva esta ayuda que les doy.EL PUENTE JDBC-ODBC

En este artículo se explica la manera de implementar el puente JDBC-ODBC para que una aplicación escrita en Java pueda acceder una base de datos en MS Access. El puente JDBC-ODBC también puede implementarse para conectar a Java con bases de datos como FoxPro. Se mostrará también la manera de crear y configurar un origen de datos con nombre DSN.

Introducción a el Puente JDBC-ODBC.

Existiendo ODBC drivers, estos pueden utilizarse para aplicaciones Java por medio de el puente JDBC-ODBC proporcionado por Sun. Usar el puente JDBC-ODBC no es una solución ideal dado que requiere de la instalación de drivers ODBC y entradas de registro. Los drivers ODBC a su vez son implementados nativamente lo que compromete el soporte multiplataforma y la seguridad de applets.

El puente es por si mismo un driver basado en tecnología JDBC que está definida en la clase sun.jdbc.odbc.JdbcOdbcDriver.

El puente JDBC-ODBC debe ser considerado como una solución transitoria. Sun Microsystems y las tecnologías DataDirect estan trabajando para hacerlo más confiable y robusto, pero ellos no lo consideran un producto recomendado. Con el desarrollo de drivers puros en Java, el puente se volverá innecesario.

Lo ideal es “Java Puro”: no código nativo, no características de plataforma dependiente. Sin embargo puede utilizarse si se requiere desarrollar inmediatamente sin poder esperar a que el fabricante de la base de datos utilizada proporcione el driver JDBC. Los drivers parcialmente nativos, como el puente JDBC-ODBC, le permiten crear programas que pueden fácilmente ser adaptados a drivers puros en Java tan pronto como estén disponibles.

Fuente: Sun Microsystems www.sun.com/

Hasta aquí con la pequeña introducción acerca del puente JDBC-ODBC. La última parte de esta introducción nos habla de adaptar nuestras aplicaciones basadas en puentes JDBC-ODBC a drivers puros JDBC. Esto es verdadero, sin casi nada de cambio en el código. Personalmente he creado proyectos que trabajan inicialmente con Access y el puente JDBC-ODBC, posteriormente he migrado estas aplicaciones a servidores como MySQL y SQLServer, para los cuales solo debe implementarse el driver JDBC correspondiente.

Conectando una aplicación Java con Access mediante puente JDBC-ODBC

Supongamos ahora que necesita conectar una aplicación en Java con Access, sea porque es su primer pinino o porque realmente los requerimientos de su sistema se adaptan a esta base de datos. Para este ejemplo, supongamos que la base de datos de Access se crea en el siguiente directorio:

C:\proyectobd1.mdb

Antes de mostrar el código en java para conectar la aplicación a esta base de datos, se mostrará la forma de crear el driver u origen de datos (DSN) de la base de datos, para ello se procede de la siguiente manera (Windows 2000, XP).

Page 2: Como Conectar Java Con Access

1. Hacer click en el botón inicio. 2. Seleccionar Panel de Control. 3. Hacer doble click en el icono de Herramientas administrativas. 4. Hacer doble click en orígenes de datos (ODBC). Aparecerá la pantalla Administrador de orígenes de datos ODBC.

5. De la pantalla anterior elija la pestaña DSN de usuario y posteriormente oprima el botón Agregar… 6. Elija de la lista de drivers desplegada, el driver “Microsoft Access Driver (*.mdb)” y enseguida oprima el botón

finalizar.

7. Aparecerá la pantalla de Configuración de ODBC Microsoft Access, llene los campos de esta pantalla como se muestra a continuación. En esta misma pantalla, en el apartado Base de datos oprima el botón Seleccionar y seleccione el directorio de la base de datos (C:proyectobd1.mdb). Oprima enseguida el botón Avanzadas…

Page 3: Como Conectar Java Con Access

8. En la pantalla de opciones avanzadas debe crear un Nombre de inicio de sesión y Contraseña . En nuestro caso el inicio de sesión será cvazquez y la contraseña vazquez. En el apartado Opciones, seleccione el campo Driver y establezca el Valor de Driver como PDRV o como lo haya llamado.

Oprima el botón Aceptar. Oprima a su vez los botones aceptar de las pantallas subsecuentes. Con esto el driver ya ha sido creado y puede ser accedido desde nuestra aplicación.

El resultado de la creación del driver de la base de datos que se usa en este proyecto de ejemplo es el siguiente:

Nombre de driver: PDRV

Nombre de inicio de sesión: cvazquez

Contraseña: vazquez

Estos campos serán utilizados desde la aplicación en Java para conectarse a la base de datos.

La siguiente clase en Java, contiene los métodos necesarios para conectar nuestra aplicación con la base de datos Access.

Page 4: Como Conectar Java Con Access

import java.sql.*;  public class cConnection {   /*Atributos*/ private String url = "jdbc:odbc:";   private String driver = "PDRV";   private String usr = "cvazquez";   private String pswd = "vazquez";   private Connection con;   /*Constructor, carga puente JDBC-ODBC*/   public cConnection() { loadDriver(); }   /** * Carga el driver de la conexión a la base de datos */ private void loadDriver() { try { //Instancía de una nueva clase para el puente //sun.jdbc.odbc.JdbcOdbcDriver //El puente sirve entre la aplicación y el driver. Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); } catch(ClassNotFoundException e) { System.out.println("Error al crear el puente JDBC-ODBC"); } }   /** *Obtiene una conexión con el nombre del driver especificado *@param driverName Nombre del driver de la base de datos *@return */ public Connection mkConection() { url = url + driver; System.out.println("Estableciendo conexión con " + url); try { //Obtiene la conexión con = DriverManager.getConnection( url,usr,pswd); } catch(SQLException sqle) { System.out.println("No se pudo establecer la conexión"); return null; }   System.out.println("Conexión establecida con:t " + url);   //Regresa la conexión </span>

Page 5: Como Conectar Java Con Access

return con; }   /* Cerrar la conexión.*/  public boolean closeConecction() { try { con.close(); } catch(SQLException sqle) { System.out.println("No se cerro la conexión"); return false; }   System.out.println("Conexión cerrada con éxito "); return true; } }

El siguiente fragmento de código muestra la manera de establecer la conexión con la base de datos.

//Crear un objeto de la clase de conexióncConnection conect = new cConnection();  //Obtener la conexiónConnection con = conect.mkConection();  if(con == null{   //Error al establecer la conexión }

Si la conexión fue realizada con éxito, podemos ejecutar sentencias SQL. El siguiente fragmento de código muestra la ejecución de la sentencia SQL select (suponiendo que tablas de la base de datos fueron creadas con anterioridad).

ResultSet rs = null;  Statement stm = con.createStatement();  String strSQL = "SELECT * FROM mitabla";  //Ejecuta la consulta SQLrs = stm.executeQuery(strSQL);  //Trabajar con el result set…  //Cerrar todors.close();  stm.close();  

Page 6: Como Conectar Java Con Access

boolean isClosed = conect.closeConecction()  if(!isClosed){   //Error al cerrar la conexión}

JDBC y ODBC

La capacidad para acceder a bases de datos desde Java la ofrece la API JDBC (Java DataBase Conectivity). JDBC es un estándar para manejar bases de datos en Java. ODBC es un estándar de Windows para manejar bases de datos, de forma que cualquier programa en Windows que desee acceder a bases de datos genéricas debe usar este estándar. La necesidad de crear un estándar propio para acceder a bases de datos desde Java se explica porque el estándar ODBC está programado en C y un programa que use este estándar, por lo tanto, depende de la plataforma.

Controladores JDBC-ODBC

Necesitamos acceder a un origren de datos ODBC pero contamos con una API que usa el estándar JDBC. Para solventar este problema las empresas realizan drivers que traducen el ODBC a JDBC. Hay varios tipos de Driver, pero para nuestro ejemplo usaremos los llamados puentes JDBC-ODBC. Estamos de suerte porque el JDK de Windows incorpora el driver necesario para conectar bases de datos Access.

Crear un nuevo DSN (Data Source Name)

Para realizar la conexión a una base de datos ODBC necesitaremos crear un perfil DSN desde el panel de control y posteriormente accederemos a la base de datos a partir del nombre del perfil. En el perfil DSN lo que se hace es indicar el driver a utilizar, así como el archivo o archivos del origen de datos. Estos son los pasos a llevar a cabo para configurar un perfil DSN.

1.- Iremos a Panel de Control. Ello se hace desde Inicio->Configuración o desde MiPC.

2.- Ahora hacemos doble-click en el icono de Fuentes de datos ODBC (32 bits).

3.- En nuestra pantalla aparecerá ahora la pestaña DSN usuario seleccionada. Para crear un nuevo perfil haremos click en Agregar...

4.- A continuación se nos pide que ingresemos el controlador que vamos a usar en el nuevo perfil. En nuestro caso será Microsoft Access Driver (*.mdb).

5.- Una vez aquí sólo nos queda dar un nombre al origen de datos y especificar el archivo .mdb de origen. Tras aceptar la ventana ya tenemos creado un perfil con lo que ya podemos comenzar a programar.

Clases, objetos y métodos básicos

Lo que necesitamos para hacer nuestro programa es la API JDBC incluida en la última versión del JDK. El paquete a utilizar y el cual deberemos importar es el paquete java.sql

Las primeras líneas de código suelen ser rutinarias ya que siempre serán muy similares.

Cargar el Driver

Page 7: Como Conectar Java Con Access

Lo primero es hacer una llamada al Driver JDBC-ODBC para cargarlo. Eso se consigue con las siguientes líneas de código:

try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); }catch(Exception e){ System.out.println("No se ha podido cargar el Driver JDBC-ODBC"); }

Con esto ya tenemos cargado el Driver. Ahora básicamente trabajaremos con tres objetos. Estos objetos son: Connection, Statement y ResultSet. El objeto Connection se obtiene al realizar la conexión a la base de datos. El objeto Statement se crea a partir del anterior y nos permite ejecutar SQL para hacer consultas o modificaciones en la base de datos. En caso de hacer una consulta (SELECT ... FROM ...) se nos devolverá un objeto que representa los datos que deseamos consultar; este objeto es un objeto ResultSet (Hoja de resultados).

El objeto Connection

Debemos realizar la conexión a nuestro origen de datos. Para ello debemos crear un objeto Connection de la siguiente forma:

Connection con = DriverManager.getConnection("jdbc:odbc:Nombre_Perfil_DSN", "Nombre_Usuario", "Contraseña");

Los dos últimos parámetros pueden ser cadenas vacías "" a no ser que la base de datos las requiera. Con esto ya hemos realizado una conexión a nuestra base de datos. Pero esto todavía no es suficiente. Ahora vamos a crear un objeto Statement con el que podremos ejecutar y hacer consultas SQL. Si hasta ahora todo ha sido rutinario a partir de ahora vamos a poder crear código más adaptado a las necesidades de nuestro programa.

El objeto Statement

Como se ha dicho, un objeto Statement se crea a partir del objeto Connection antes obtenido. También como se ha dicho un objeto Statement nos permite hacer consultas SQL que nos devuelven una hoja de resultados. Pues bien, según como deseamos que sea esa hoja de resultados (modificable, o no, sensible a las modificaciones o no,...) deberemos crear de una forma u otra el objeto Statement. Más adelante se explican las diferencias entre crearlos de una u otra forma. De momento nos limitaremos ha hacerlo de la forma más sencilla.

Statement stat = con.createStatement();

De esta forma muy simple hemos creado un objeto Statement. Ahora podemos usar este objeto Statement para hacer modificaciones en la base de datos a través del lenguaje SQL. Para realizar modificaciones, es decir, instrucciones INSERT, UPDATE o DELETE, se usa el método executeUpdate pasando como parámetro una cadena de texto String que contenga la instrucción SQL.

Para hacer una consulta, es decir, una instrucción SELECT debemos usar otro método: el método executeQuery que como el anterior se le ha de pasar un String que contenga la instrucción. Este método nos devuelve un objeto ResultSet que contiene los datos obtenidos. Este objeto será diferente según como hayamos creado el objeto Statement. En el ejemplo anterior hemos usado un método muy simple de Connection para crear el objeto Statement, pero hay otras formas de crearlo. Estas son y estas son las características que aportan a la hoja de resultados de una consulta:

El método anteriormente utilizado es el siguiente: createStatement(), pero existe el mismo método al que le podemos pasar dos parámetros. En la documentación se expresa así: createStatement(int resultSetType, int resultSetConcurrency). Los posibles valores a pasar son campos de la clase ResultSet. Por ejemplo para el parámetro resultSetType podemos elegir que el objeto ResultSet se pueda mover (entre registros) sólo hacia delante (ResultSet.TYPE_FORWARD_ONLY), que se pueda mover pero que cuando se actualice, aunque los cambios ya hayan sido reflejados en la base de datos, el ResultSet no los 'sienta' (ResultSet.TYPE_SCROLL_INSENSITIVE) o que se pueda mover y que los cambios si que se reflejen también en él (ResultSet.TYPE_SCROLL_SENSITIVE). Para el parámetro resultSetConcurrency podemos establecer dos valores diferentes: ResultSet.CONCUR_READ_ONLY si queremos que los datos se puedan leer pero no actualizar, y ResultSet.CONCUR_UPDATABLE si queremos permitir que la base de datos sea actualizable mediante el objeto ResultSet. Si no se usa el método sin parámetros el objeto será TYPE_FORWARD_ONLY y CONCUR_READ_ONLY.

El objeto ResultSet: Hoja de resultados

Moverse por la hoja de resultados

Page 8: Como Conectar Java Con Access

Al hablar de posición del cursor nos referimos a la posición dentro de los datos del objeto ResultSet. Lo primero que hay que saber es que el cursor tiene tantas posiciones como filas tenga la consulta y dos más que se sitúan antes de la primera fila y después de la última. Nada más crear un objeto ResultSet, la posición del cursor es la anterior a la primera fila.

Para mover el cursor a la posición siguiente usaremos el método next() que nos devuelve una variable booleana: sí, si se ha podido mover; no, si no ha sido posible el desplazamiento. Nos devolverá false si estamos en el útimo registro (el posterior al último). Para movernos hacia atrás tenemos un método muy similar: el método previous() que al igual que el anterior nos devuelve un valor booleano que será false si estamos en el registro anterior al primero. Estos métodos nos permiten movernos de forma relativa por la hoja de resultados; si deseamos movernos a un registro determinado usaremos el método absolute(int numero_fila), que también nos devuelve un valor boolean. Además tenemos otros métodos que son: afterLast(), que mueve el cursor a la fila posterior a la última; beforeFirst() que mueve el cursor a la fila anterior a la primera; last() que mueve el cursor a la última fila; first() que mueve el cursor a la primera fila. Todos ellos devuelven un valor booleano.

Obtener datos de la hoja de resultados

Para acceder a los datos de la hoja de resultados usamos los métodos get...(int numeroColumna) o get...(String nombreColumna). Estos métodos nos devuelven el valor que indica el nombre del método (por ejemplo tenemos: getString, getInt, getDate, ...) indicando el número o el nombre de la columna. Hay que tener en cuenta que el número de columna es el número de columna en la hoja de resultados y por tanto se establece con el orden en el que se han incluido las columnas en la instrucción SELECT. Por ejemplo si hemos hecho la consulta de la siguiente forma: SELECT Nombre, Apellidos ... la columna Nombre será la primera y la columna Apellidos será la segunda independientemente de cómo estén situadas en la base de datos. Si hacemos un SELECT * FROM ..., en ese caso las columnas estarán en el orden en el que están en la base de datos.

Modificar la base de datos con el objeto ResultSet

Hemos dicho que mediante el objeto Statement podemos ejecutar sentencias SQL para modificar la base de datos y hacer consultas, por lo que podemos usar el lenguaje SQL para hacer cualquier operación en la base de datos; pero además tenemos métodos especializados que nos permiten hacer estas mismas tareas sin usar el lenguaje SQL. Para ello se usan los métodos especializados del objeto ResultSet. Por tanto si deseamos modificar la base de datos a través de Java, sin utilizar SQL, lo primero que deberemos hacer es realizar una consulta SQL para obtener el objeto ResultSet (parece un poco paradógico). Ahora sólo nos queda usar los métodos especializados de este objeto.

Por ejemplo podemos usar deleteRow() para borrar una fila.

Para actualizar una fila se usan los métodos update...(NombreColumna, valor) o update...(NumeroColumna, valor), así podemos encontrar updateFloat, updateString, ... Para que los cambios se reflejen en la base de datos se debe llamar al método updateRow() o cancelRowUpdates() si queremos cancelar la actualización.

resultset.updateString("Nombre", "PEPE");resultset.updateRow();

Para insertar una fila nos hemos de mover a un lugar del cursor especial con el método toInsertRow(), una vez allí usaremos los métodos update... explicados antes y para reflejar esta actualización llamar al método insertRow().

La capacidad para acceder a bases de datos desde Java la ofrece la API JDBC (Java DataBase Conectivity). JDBC es un estándar para manejar bases de datos en Java. ODBC es un estándar de Windows para manejar bases de datos, de forma que cualquier programa en Windows que desee acceder a bases de datos genéricas debe usar este estándar. La necesidad de crear un estándar propio para acceder a bases de datos desde Java se explica porque el estándar ODBC está programado en C y un programa que use este estándar, por lo tanto, depende de la plataforma.

Controladores JDBC-ODBC

Necesitamos acceder a un origren de datos ODBC pero contamos con una API que usa el estándar JDBC. Para solventar este problema las empresas realizan drivers que traducen el ODBC a JDBC. Hay varios tipos de Driver, pero para nuestro ejemplo usaremos los llamados puentes JDBC-ODBC. Estamos de suerte porque el JDK de Windows incorpora el driver necesario para conectar bases de datos Access.

Crear un nuevo DSN (Data Source Name)

Page 9: Como Conectar Java Con Access

Para realizar la conexión a una base de datos ODBC necesitaremos crear un perfil DSN desde el panel de control y posteriormente accederemos a la base de datos a partir del nombre del perfil. En el perfil DSN lo que se hace es indicar el driver a utilizar, así como el archivo o archivos del origen de datos. Estos son los pasos a llevar a cabo para configurar un perfil DSN.

1.- Iremos a Panel de Control. Ello se hace desde Inicio->Configuración o desde MiPC.

2.- Ahora hacemos doble-click en el icono de Fuentes de datos ODBC (32 bits).

3.- En nuestra pantalla aparecerá ahora la pestaña DSN usuario seleccionada. Para crear un nuevo perfil haremos click en Agregar...

4.- A continuación se nos pide que ingresemos el controlador que vamos a usar en el nuevo perfil. En nuestro caso será Microsoft Access Driver (*.mdb).

5.- Una vez aquí sólo nos queda dar un nombre al origen de datos y especificar el archivo .mdb de origen. Tras aceptar la ventana ya tenemos creado un perfil con lo que ya podemos comenzar a programar.

Clases, objetos y métodos básicos

Lo que necesitamos para hacer nuestro programa es la API JDBC incluida en la última versión del JDK. El paquete a utilizar y el cual deberemos importar es el paquete java.sql

Las primeras líneas de código suelen ser rutinarias ya que siempre serán muy similares.

Cargar el Driver

Lo primero es hacer una llamada al Driver JDBC-ODBC para cargarlo. Eso se consigue con las siguientes líneas de código:

try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); }catch(Exception e){ System.out.println("No se ha podido cargar el Driver JDBC-ODBC"); }

Con esto ya tenemos cargado el Driver. Ahora básicamente trabajaremos con tres objetos. Estos objetos son: Connection, Statement y ResultSet. El objeto Connection se obtiene al realizar la conexión a la base de datos. El objeto Statement se crea a partir del anterior y nos permite ejecutar SQL para hacer consultas o modificaciones en la base de datos. En caso de hacer una consulta (SELECT ... FROM ...) se nos devolverá un objeto que representa los datos que deseamos consultar; este objeto es un objeto ResultSet (Hoja de resultados).

El objeto Connection

Debemos realizar la conexión a nuestro origen de datos. Para ello debemos crear un objeto Connection de la siguiente forma:

Connection con = DriverManager.getConnection("jdbc:odbc:Nombre_Perfil_DSN", "Nombre_Usuario", "Contraseña");

Los dos últimos parámetros pueden ser cadenas vacías "" a no ser que la base de datos las requiera. Con esto ya hemos realizado una conexión a nuestra base de datos. Pero esto todavía no es suficiente. Ahora vamos a crear un objeto Statement con el que podremos ejecutar y hacer consultas SQL. Si hasta ahora todo ha sido rutinario a partir de ahora vamos a poder crear código más adaptado a las necesidades de nuestro programa.

El objeto Statement

Como se ha dicho, un objeto Statement se crea a partir del objeto Connection antes obtenido. También como se ha dicho un objeto Statement nos permite hacer consultas SQL que nos devuelven una hoja de resultados. Pues bien, según como deseamos que sea esa hoja de resultados (modificable, o no, sensible a las modificaciones o no,...) deberemos crear de una forma u otra el objeto Statement. Más adelante se explican las diferencias entre crearlos de una u otra forma. De momento nos limitaremos ha hacerlo de la forma más sencilla.

Statement stat = con.createStatement();

Page 10: Como Conectar Java Con Access

De esta forma muy simple hemos creado un objeto Statement. Ahora podemos usar este objeto Statement para hacer modificaciones en la base de datos a través del lenguaje SQL. Para realizar modificaciones, es decir, instrucciones INSERT, UPDATE o DELETE, se usa el método executeUpdate pasando como parámetro una cadena de texto String que contenga la instrucción SQL.

Para hacer una consulta, es decir, una instrucción SELECT debemos usar otro método: el método executeQuery que como el anterior se le ha de pasar un String que contenga la instrucción. Este método nos devuelve un objeto ResultSet que contiene los datos obtenidos. Este objeto será diferente según como hayamos creado el objeto Statement. En el ejemplo anterior hemos usado un método muy simple de Connection para crear el objeto Statement, pero hay otras formas de crearlo. Estas son y estas son las características que aportan a la hoja de resultados de una consulta:

El método anteriormente utilizado es el siguiente: createStatement(), pero existe el mismo método al que le podemos pasar dos parámetros. En la documentación se expresa así: createStatement(int resultSetType, int resultSetConcurrency). Los posibles valores a pasar son campos de la clase ResultSet. Por ejemplo para el parámetro resultSetType podemos elegir que el objeto ResultSet se pueda mover (entre registros) sólo hacia delante (ResultSet.TYPE_FORWARD_ONLY), que se pueda mover pero que cuando se actualice, aunque los cambios ya hayan sido reflejados en la base de datos, el ResultSet no los 'sienta' (ResultSet.TYPE_SCROLL_INSENSITIVE) o que se pueda mover y que los cambios si que se reflejen también en él (ResultSet.TYPE_SCROLL_SENSITIVE). Para el parámetro resultSetConcurrency podemos establecer dos valores diferentes: ResultSet.CONCUR_READ_ONLY si queremos que los datos se puedan leer pero no actualizar, y ResultSet.CONCUR_UPDATABLE si queremos permitir que la base de datos sea actualizable mediante el objeto ResultSet. Si no se usa el método sin parámetros el objeto será TYPE_FORWARD_ONLY y CONCUR_READ_ONLY.

El objeto ResultSet: Hoja de resultados

Moverse por la hoja de resultados

Al hablar de posición del cursor nos referimos a la posición dentro de los datos del objeto ResultSet. Lo primero que hay que saber es que el cursor tiene tantas posiciones como filas tenga la consulta y dos más que se sitúan antes de la primera fila y después de la última. Nada más crear un objeto ResultSet, la posición del cursor es la anterior a la primera fila.

Para mover el cursor a la posición siguiente usaremos el método next() que nos devuelve una variable booleana: sí, si se ha podido mover; no, si no ha sido posible el desplazamiento. Nos devolverá false si estamos en el útimo registro (el posterior al último). Para movernos hacia atrás tenemos un método muy similar: el método previous() que al igual que el anterior nos devuelve un valor booleano que será false si estamos en el registro anterior al primero. Estos métodos nos permiten movernos de forma relativa por la hoja de resultados; si deseamos movernos a un registro determinado usaremos el método absolute(int numero_fila), que también nos devuelve un valor boolean. Además tenemos otros métodos que son: afterLast(), que mueve el cursor a la fila posterior a la última; beforeFirst() que mueve el cursor a la fila anterior a la primera; last() que mueve el cursor a la última fila; first() que mueve el cursor a la primera fila. Todos ellos devuelven un valor booleano.

Obtener datos de la hoja de resultados

Para acceder a los datos de la hoja de resultados usamos los métodos get...(int numeroColumna) o get...(String nombreColumna). Estos métodos nos devuelven el valor que indica el nombre del método (por ejemplo tenemos: getString, getInt, getDate, ...) indicando el número o el nombre de la columna. Hay que tener en cuenta que el número de columna es el número de columna en la hoja de resultados y por tanto se establece con el orden en el que se han incluido las columnas en la instrucción SELECT. Por ejemplo si hemos hecho la consulta de la siguiente forma: SELECT Nombre, Apellidos ... la columna Nombre será la primera y la columna Apellidos será la segunda independientemente de cómo estén situadas en la base de datos. Si hacemos un SELECT * FROM ..., en ese caso las columnas estarán en el orden en el que están en la base de datos.

Modificar la base de datos con el objeto ResultSet

Hemos dicho que mediante el objeto Statement podemos ejecutar sentencias SQL para modificar la base de datos y hacer consultas, por lo que podemos usar el lenguaje SQL para hacer cualquier operación en la base de datos; pero además tenemos métodos especializados que nos permiten hacer estas mismas tareas sin usar el lenguaje SQL. Para ello se usan los métodos especializados del objeto ResultSet. Por tanto si deseamos modificar la base de datos a través de Java, sin utilizar SQL, lo primero que deberemos hacer es realizar una consulta SQL para obtener el objeto ResultSet (parece un poco paradógico). Ahora sólo nos queda usar los métodos especializados de este objeto.

Por ejemplo podemos usar deleteRow() para borrar una fila.

Page 11: Como Conectar Java Con Access

Para actualizar una fila se usan los métodos update...(NombreColumna, valor) o update...(NumeroColumna, valor), así podemos encontrar updateFloat, updateString, ... Para que los cambios se reflejen en la base de datos se debe llamar al método updateRow() o cancelRowUpdates() si queremos cancelar la actualización.

resultset.updateString("Nombre", "PEPE");resultset.updateRow();

Para insertar una fila nos hemos de mover a un lugar del cursor especial con el método toInsertRow(), una vez allí usaremos los métodos update... explicados antes y para reflejar esta actualización llamar al método insertRow()

JDBC desde el primer día

Cuando nos planteamos realizar un programa (en cualquier lenguaje) llegamos a un momento donde se hace necesario utilizar una base de datos.

Para acceder a una base de datos desde Java, aunque es sencillo, se requieren unos conocimientos intermedios.

Os vamos a mostrar como generar el código de acceso a la base de datos sin saber realmente programar esos acceso.

 

Para ello vamos a usar JDBCTest( de Intersolv).

Primero lo descargamos de java.sun.com

 

Debemos estar seguros de tener la variable de entorno classpath de java, apluntando a los directorios de clases

Ejecutamos

java JDBCTest

Page 12: Como Conectar Java Con Access

Vemos una primera pantalla y lo primero que vamos a hacer es registrar  el Driver

Vamos a registrar el Driver de OBDC

 

Vamos a ir creando un programa donde ir introduciendo el código que generamos

class basedatos{public static void main (String array[]){basedatos instancia = new basedatos();instancia.ejecuta();}

void depura(String mensaje){System.out.println(mensaje); }

void ejecuta(){depura("Programa simple");

Page 13: Como Conectar Java Con Access

}

Dentro de la función ejecuta, meteremos el código que nos interesa

 

Vemos que JDBCTest va generando el código equivalente a la acción así que solo tenemos que ir haciendo lo que queremos obtener y el código se genera solo.

Obviammente este código no es optimo para una aplicación profesional pero, ordenándolo un poquito en clases, tendremos ejemplos de todo lo que necesitamos hacer.

Page 14: Como Conectar Java Con Access

 

Vamos a crear una base de datos desde cero. En este caso, con access 

La llamamos 

Page 15: Como Conectar Java Con Access

 

Creamos una tabla del modo más simple

Diseño de la tabla

Page 16: Como Conectar Java Con Access

Le asignamos un nombre

Vemos como queda nuestra tabla y pinchamos para introducir datos

 

Registramos la base de datos en el registro ODBC (panel de control o menú de administración de Windows)

Page 17: Como Conectar Java Con Access

Pinchamos en add (añadir)

Seleccionamos sus ficheros

Y ya tenemos la fuente de datos

Page 18: Como Conectar Java Con Access

Volvemos a JDBCTest

// REGISTER DRIVER

try {

Driver d = (Driver)Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();

} catch (Exception e) {

System.out.println(e)

Page 19: Como Conectar Java Con Access

}

// GET CONNECTION

Connection con;

try{

con = DriverManager.getConnection("jdbc:odbc:jdbctest",userName,password);

}catch(Exception e){

System.out.println(e);

}

// GET CONNECTION WARNINGS

SQLWarning warning = null;

try {

warning = con.getWarnings();

if (warning == null){

System.out.println("No Warnings");

return;

}

while (warning != null) {

System.out.println("Warning: "+warning);

warning = warning.getNextWarning();

}

} catch (Exception e){

System.out.println(e);

}

 

 

Vemos que ha conectado

Page 20: Como Conectar Java Con Access

Creamos la petición (ya vemos abajo el código generado)

Page 21: Como Conectar Java Con Access

Ejecutamos unas consulta

Nos aparece la ventana y proponemos una consulta. Listar todos los campos de la tabla contactos.

Y ahora decimos que muestre todos los campos

Page 22: Como Conectar Java Con Access

Y vemos que se ha generado todo el código y nos muestra el resultado

Ahora copiando y pegando el código que nos ha generado obtenemos esto

Page 23: Como Conectar Java Con Access

Vemos en código completo y algunos pequeños cambios necesario (en rojo) para que funcione. En azul esta el código que hemos añadido, todo lo demás, se nos ha generado solo.

import java.sql.*; // SQL library!

class basedatos{public static void main (String array[]){basedatos instancia = new basedatos();instancia.ejecuta();}

void depura(String mensaje){System.out.println(mensaje); }

Page 24: Como Conectar Java Con Access

void ejecuta(){depura("Empezamos");

// REGISTER DRIVERtry {Driver d = (Driver)Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();} catch (Exception e) {System.out.println(e);}

// GET CONNECTIONConnection con = null;try{depura("Recuperamos conexión");con = DriverManager.getConnection("jdbc:odbc:jdbctest","","");}catch(Exception e){System.out.println(e);}

// GET CONNECTION WARNINGSSQLWarning warning = null;try {warning = con.getWarnings();

if (warning == null){System.out.println("No Warnings");// return;}

while (warning != null) {System.out.println("Warning: "+warning);warning = warning.getNextWarning();}} catch (Exception e){System.out.println(e);} 

// CREATE STATEMENT Statement stmt = null;try {stmt = con.createStatement();} catch (Exception e){System.out.println(e);}

// EXECUTE QUERY ResultSet results = null;try {

Page 25: Como Conectar Java Con Access

results = stmt.executeQuery("select * from contactos");} catch (Exception e){System.out.println(e);}

// GET ALL RESULTS StringBuffer buf = new StringBuffer();

try {ResultSetMetaData rsmd = results.getMetaData();int numCols = rsmd.getColumnCount();int i, rowcount = 0;

// get column header infofor (i=1; i <= numCols; i++){if (i> 1) buf.append(",");buf.append(rsmd.getColumnLabel(i));}buf.append("\n");

// break it off at 100 rows maxwhile (results.next() && rowcount < 100){// Loop through each column, getting the column// data and displaying

for (i=1; i <= numCols; i++) {if (i> 1) buf.append(",");buf.append(results.getString(i));}buf.append("\n");rowcount++;}

System.out.println(buf);

results.close();} catch (Exception e) {System.out.println(e);return;} 

depura("Finalizamos"); }}