CONEXIÓN A UN GESTOR DE BASE DE DATOS DESDE JAVA CON ODBC Y JDBC

download CONEXIÓN A UN GESTOR DE BASE DE DATOS DESDE JAVA CON ODBC Y JDBC

of 25

Transcript of CONEXIÓN A UN GESTOR DE BASE DE DATOS DESDE JAVA CON ODBC Y JDBC

CONEXIN A UN GESTOR DE BASE DE DATOS DESDE JAVA CON ODBC Y JDBC

Para iniciar este capitulo debemos de tener presente que cuando se intenta conectar Java, con cualquier motor de base de datos necesitamos conocer si la relacin de Conexin de Java con el motor de base de datos es de tipo directa o indirecta. Antes de esto definamos que es un controlador JDBC (Java Database Connectivity), el cual es un interface de comunicacin que permite la ejecucin entre Java y cualquier motor de Base de Datos.

Conexin Directa Entre los manejadores de base de datos que poseen una conexin directa con Java, tenemos a: My Sql, Sybase DB2, Oracle. Ya que estas no necesitan un puente para comunicarse, el trabajo y la conexin son mucho ms rpidos que una conexin indirecta. Conexin Indirecta Entre los gestores de base de datos que necesitan de un puente ODBC para conectarse con Java, tenemos a las marcas, Access, Microsoft SQL Server, Informix, entre otros. Importante: Para realizar una conexin con alguna base de datos debemos de importar el paquete: java.sql.*: Este paquete contiene clases e interfaces diseadas teniendo en mente la arquitectura tradicional cliente-servidor. Su funcionalidad se centra primordialmente en servicios de programacin bsicos de bases de datos, como creacin de conexiones, ejecucin de instrucciones e instrucciones preparadas. Dentro de los paquetes que ms usaremos en estar seccin se encuentran: java.sql.DriverManager.- Esta clase proporciona la funcionalidad necesaria para gestionar uno o mas drivers de base de datos. java.sql.ResultSetMetaData.- Esta interfaz proporciona mtodos para acceder a metadatos del Resultset, como los nombres de las columnas, sus tipos, el nombre de tabla correspondiente y otras propiedades.

java.sql.SQLException.- Esta excepcin representa todas las condiciones de excepcin relacionadas con JDBC. java.sql.Connection.- representa una conexin con una base de datos.

URL JDBC. La nocin de un URL en JDBC es muy similar al modo en que los URL se utilizan en otras situaciones. Para poder entender la base lgica de los URL de JDBC, consideremos una aplicacin que utiliza diversas bases de datos; a cada base de datos se accede mediante diferentes driver, dependiendo del fabricador de base de datos. Los URL de JDBC proporcionan un modo de identificar un driver de base de datos, en el caso de una conexin directa. Un URL de JDBC representa un dirver y la informacin adicional especfica del driver para localizar una base de datos y conectarla a l. La sintaxis del URL de JDBC es como sigue:

Se puede observar que estn separadas en tres partes por dos puntos. Protocolo: jdbc es el protocolo. Este es el nico protocolo permitido en JDBC. Sub-protocolo: el sub-protocolo es utilizado para identificar un driver de base de datos o el nombre de un mecanismo de conectividad de una base de datos, elegido por los proveedores del driver de base de datos. Subnombre: la sintaxis del subnombre es especfica de driver. Un driver puede elegir cualquier sintaxis apropiada para su implementacin.

Por ejemplo en una conexin directa con DB2, y una base de datos de nombre libros, seria:

y para una conexin indirecta con Microsoft SQL Server utilizando un puente de datos JDBC-ODBC de nombre libros, nuestro URL seria:

DRIVER MANAGER.

El propsito de la clase java.sql.DriverManager (gestor de driver) en JDBC es proporcionar una capa de acceso comn encima de diferentes drivers de base de datos utilizados en una aplicacin. En este enfoque las aplicaciones utilizan la clase DriverManager para obtener conexiones, a travs de su argumento URL.Por ejemplo para Ms SQL Server el driver seria: try{ Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); } catch(ClassNotFoundException e){ } El bloque try catch es necesario para establecer la conexin, esto para saber de algn problema existente cuando se ejecute la conexin con el driver dentro del bloque try, el bloque catch, tiene como funcin capturar el tipo de error generado, al no poder conectarse con la base de datos. Nota: La mayora de gestores de base de datos, adems de una URL y Driver, poseen un nombre de usuario (USER) y un respectivo Password (PASS), para poder obtener la conexin hacia una determinada base de datos. Ejemplo: String URL=jdbc:odbc:libros; String user=sa; String pass= ; Connection conn=DriverManager.getConnection(URL,user,password); En muchas ocasiones es necesario especificar el tiempo mximo que debe esperar un driver mientras intenta conectar a una base de datos. Los siguientes dos mtodos pueden ser utilizados par fijar/obtener (set/get) el tiempo lmite de registro: public static void setLoginTimeout(int segundos){ } public static void getLoginTimeout( ){ } Para resumir la teora mencionada mostraremos una clase netamente para la conexin con una base de datos, usaremos en este ejemplo la conexin con SQL Server:

Ahora si deseamos conectarnos con MySQL, el proceso es similar que el anterior hecho para Ms SQL Server, solo debemos de cambiar el contenido de Driver, URL, user, pass tal como se muestra: String Driver = "com.mysql.jdbc.Driver"; String URL = "jdbc:mysql://localhost:3306/libros"; String user = "root"; String pass = "root"; // la contrasea puede variar segn el usuario. En esta parte debemos observar, la diferencia que hay con los parmetros antes puestos para establecer la conexin con Ms SQL Server. Como la conexin con MySQL con Java es directa, observamos que en la parte de URL, no hay ningn puente ODBC. Debemos de recordar que para cada manejador de base de datos de conexin directa existen drivers distintos, el cual debemos de instalar antes. Pero para las ultimas versiones del NetBeans y otros IDEs para java, los driver mas usados estn contenidos dentro de la instalacin del Netbeans. SENTENCIAS SQL

En esta seccin es recomendable que el lector tenga conocimiento en como realizar consultas o listados en SQL, tal como el uso del SELECT tambin para Insertar (INSERT), modificar (UPDATE) y eliminar (DELETE).

Podemos utilizar un objeto Connection para ejecutar instrucciones SQL creando un Statement, un PreparedStatement o un CallableStatement. Estos objetos abstraen instrucciones SQL normales, instrucciones preparadas y procedimientos almacenados respectivamente. Una vez hemos obtenidos unos de esos objetos de instrucciones, podemos ejecutar la instruccin y leer resultados gracias a un objeto ResultSet.

Pasos para la ejecutar una sentencia SQL con Java: 1. getConnection() : primero obtenemos la conexin. 2. PreparedStatement : prepara un comando SQL. 3. executeQuery() : ejecuta la instruccin SQL que se preparo en lo anterior. 4. ResultSet : lleva a memoria los datos de una consulta SQL. 5. next() : lee fila por fila los datos que estn en memoria. EJEMPLO DE APLICACIN Utilizando la base de datos BDNOTAS: en el cual est contenida las siguientes tablas y columnas:

Se pide que al ingresar por teclado el cdigo de un alumno, este muestre los siguientes detalles: Idalumno, nomAlumno, Apealumno, nomCurso, exaParcial, exaFinal, Promedio, Observacin (aprobado/desaprobado).

Ingresaremos al Netbeans, creamos un nuevo Proyecto JavaAplication, le ponemos un nombre, y dentro de este proyecto crearemos 2 paquetes (Java Package), el primer paquete de nombre Clases, contendr todas las clases necesarias para implementar este programa; el segundo paquete de nombre Formulario, contendr el diseo de nuestro formulario haciendo uso de objetos.

Dentro del paquete Clases, crearemos las siguientes clases:

Procedemos al llenado de la clase alumno, esta clase solo estableceremos los atributos del alumno, pedidos, tal como su cdigo, nombre, apellido, curso, examen parcial, examen final, luego con estos atributos, podemos crear mtodos para el promedio final, as como para el nombre completo del alumno, ya que si observamos en los campos de la base de datos estos estn por separados, luego para generar los colores de la observacin (aprobado/desaprobado).

Hacemos doble clic sobre la clase Alumnos.java el cual nos saldr la ventana para editar el cdigo, procedemos al llenado de la clase: Clase Alumnos: aqu hemos establecidos los atributos y mtodos a utilizar en esta aplicacin:

Para completar esta parte de la clase Alumno.java, necesitamos crear sus mtodos accesores Set y Get, para esto nos ubicamos en cualquier parte del cdigo, damos clic derecho buscamos Refactor Encapsulate fields, y nos saldr la ventana en donde seleccionaremos todo Select All, luego damos Refactor.

Quedando el cdigo de la clase Alumno.java, como sigue:

Se aprecia que se han creado los mtodos set y get, para cada atributo de la clase. Se recomienda no copiar, el cdigo tal como se muestra en la figura, ya que por razones de espacio, se estn omitiendo algunos mtodos de acceso y llaves de cierre, lo recomendable es hacerlo, con las sugerencias que expongo lneas arriba. Con esta parte terminamos todo lo que contendr la clase Alumnos.java

Continuando con nuestro programa ahora debemos de crear la conexin, similarmente a lo que expongo en la pagina 4 de este texto, para efectos de este ejemplo haremos la conexin con Ms Sql Server 2000, posteriormente lo Hare con MySQL . Entonces nos ubicamos en la clase Conexin.java que se creo en el paquete Clases de nuestro ejemplo, damos doble clic y editamos el siguiente cdigo:

Paso 4 Para entender de una manera clara lo que se har en esta parte, se debe de tener conocimiento de lo que se expuso con anterioridad, (getConnection, PreparedStatement, ResultSet) tambin usaremos la clase ArrayList & List, para hacer un listado general. El cdigo del proceso se muestra a continuacin: Clase Proceso: Primero creamos un mtodo del tipo List, que ser una lista de la clase Alumnos, el cual recibir como parmetro el cdigo de un alumno, luego este cdigo se asociara con el ? que se encuentra en la sentencia sql, se aprecia que la sentencia se encuentra agrupada en varias cadenas + +, esto por falta de espacio, pero tambin se puede escribir toda esta sentencia en una sola lnea.

Luego dentro de un bloque try catch se prepara la sentencia sql con la clase PreparedStatement. En la parte donde dice: st.setString(1, cod_alumno); - esto se refiere al parmetro que se recibiendo en el mtodo, el numero 1 significa la posicin del ? de la sentencia sql. cod_alumno, es la variable que recibe un valor, el cual se asignara en el ?. Por decir: cod_alumno=A0003, entonces este valor de A0003 se reemplazara por ? que se encuentra en la sentencia sql. Quedando idalumno=A0003 para el sql.

En la parte de ResultSet rs=st.escuteQuery();esto nos quiere decir que cuando ejecutemos una consulta st.escuteQuery(), esta sea llevada a memoria a travs de ResulSet y se almacenara en rs. Luego en el While(rs.next()), estamos recorriendo todo lo que esta memoria, pero por el uso del next(), estamos recorriendo o leyendo fila por fila.

Lo que se hace en esta parte es crear un objeto de la clase Alumnos, para llamar a sus mtodos, cuando hacemos por ejemplo en a.setCodigo(rs.getString(1)); el mtodo rs.getString(1), captura el valor que tiene la memoria en la posicin 1 de la sentencia sql (idalumno). Para luego almacenar estos valores en a.setCodigo. Es decir: observemos que en la consulta sql, las posiciones de los campos, son los siguientes:

Paso 5: esta parte haremos la creacin de un JFrame, para realizar nuestro formulario, Sobre el paquete formulario New JavaFrame Form

Le ponemos de nombre Formulario, luego aparecer esta ventana vaca.

Dentro de esta ventana arrastraremos lo componentes Label, TextField, Table, Button, que estn en la paleta de java.

Quedando tal como se muestra:

En el campo TextField, vamos asignarle el nombre de variable tcod, esto se hace dando clic derecho sobre la caga y seleccionando Change Variable Name, luego saldr el siguiente cuadrito, en donde pondremos:

Para el botn, solo le hemos cambiado el nombre con Edit Text Buscar, y el nombre de variable, le puse BuscarXCodigo. Similar a lo que se hizo con la caja Text Field.

De igual forma debemos de cambiar el nombre de variable de la tabla, para este ejemplo cambimoslo por tabla1. Para ello damos clic derecho en la tabla y escogemos Change Variables Name

Paso 6: Ahora procedemos a crear un evento, para que genere la accin, esto se hace posicionndose sobre el botn Buscar, clic derecho, tal como se muestra:

Luego de esto aparecer el siguiente cdigo:

Dentro del mtodo del botn necesitamos, que al hacer clic en el botn, este obtenga el valor de la cajita Text Fields, para luego pasarlo al mtodo de la clase proceso:

La codificacin completa para el formulario de este programa se muestra a continuacin:

Se puede observar que hemos creado objetos de la clase DefaultTableModel y Proceso (importando sus libreras). Luego dentro del constructor por defecto de la

Clase Formulario, estamos agregando las columnas con sus respectivos nombres que deseamos apreciar en la tabla. Recordemos que la variable tabla1 es el que asignamos a la tabla. En el mtodo BuscarXCodigo, estamos capturando el cdigo ingresado por teclado con: String cod=tcod.getText(); Luego dt.setRowCount(0); - se utiliza esto para limpiar la tabla cada vez que hagamos un listado nuevo. Luego estamos utilizando un for del tipo iterativo, Este for que pertenece a la clase Alumnos, recorrer el listado de la clase proceso al recibir un cdigo por teclado. Por ultimo dentro del for, agregaremos el contenido de las filas dentro de un Objeto[] el cual no tiene una longitud limite de datos, esto se hace con: dt.addRow(new Object[]{x.getCodigo(),x.getApellido(),x.getCurso(), x.getExaParcial(),x.getExaFinal(),x.Promedio(),x.Observacion()}); si observamos estamos agregando los datos en cada filas de la columnas que hemos creado en el mtodo constructor por defecto de la clase Formulario. Al Ejecutar esta aplicacin, dando en RUN sobre la clase Formulario se obtiene el siguiente resultado:

TRABAJANDO CON MY SQL FRONT 5.1 Para realizar el trabajo de conexin java con MySQL, debemos de importar las tablas contenidas en el Ms Sql Server, para ello empezaremos abriendo el programa My Sql Front 5.1 (distribucin gratuita). Paso 1: Una vez abierta la sesin con MySQL Front, (para cualquier duda sobre el inicio de sesin con My sql Front consulte el documento sobre instalacin de my sql & My sql front 5.1). Tal como se muestra:

En esta ventana, buscamos en la primera columna donde dice localhost la seleccionamos, luego nos dirigimos en la barra de herramientas del programa, damos clic en Base de Datos nueva base de datos, tal como se muestra:

Luego el sistema mostrara la siguiente ventana:

Paso 2: Luego de dar aceptar, observaremos que la columna de la izquierda apareci nuestra nueva base de datos, la cual est totalmente vaca:

Ahora estamos listos para importar los datos de Ms Sql Server a My Sql, a travs del puente de datos que creamos anteriormente, entonces hacemos lo siguientes, seleccionamos la base de datos que acabamos de crear bdnotas, clic derecho importar Tabla ODBC, tal como se muestra:

Luego saldr la siguiente ventana, que contiene los nombres de todos los puentes de datos que se encuentran en la maquina, para nuestro ejemplo seleccionamos el puente de datos notas, con el cual estuvimos trabajando para la conexin con Ms sql Server.

Paso 3: Luego de seleccionar nuestro puente de datos, damos clic en aceptar, y nos saldr ala siguiente ventana, donde colocaremos el usuario de cmo hemos entrado al sql, ponemos tal como se muestra en la siguiente imagen:

Damos clic en aceptar y saldr las tablas, que contiene ese puente de datos, seleccionamos todas y le damos clic en Adelante >.

Luego damos Adelante, hasta llegar al final de esta peticin luego, apreciaremos que se importaran las tablas a nuestra nueva base de datos bdnotas:

Paso 4: Despus de que haya terminado de importar las tablas, cerramos esta ventana y observaremos que ya se han generado las tablas en nuestra nueva base de datos,

Para asegurarnos que la importacin sali correctamente podemos ejecutar alguna consulta con el Editor de SQL, dentro de esta seccin podemos escribir todas las consultas que queramos, por ejemplo:

Esto seria todo hasta el respecto de la importacin de Ms Sql Server hacia My Sql. CONEXIN CON MYSQL

recordando lo que se dijo anteriormente sobre la conexin de My Sql, y Java debemos de tener presente que solo cambian en la conexin: Driver, URL, user, pass: String Driver = "com.mysql.jdbc.Driver"; String URL = "jdbc:mysql://localhost:3306/bdnotas"; String user = "root"; String pass = " "; Considerando esto, modifiquemos el contenido de los atributos Driver,URL,user,pass, tal como se muestra en lo anterior, una vez realizados los cambios, el cdigo de la clase Conexin.java, quedara como sigue:

Luego antes de correr, el programa es necesario aadir la librera de MySQL a nuestro proyecto, para ello nos dirigimos a la tasita de nuestro proyecto clic derecho sobre ella: Propiedades, tal como se muestra:

Luego nos saldr la siguiente ventana, en la cual escogeremos Librerias, posteriormente, agregaremos la librera de MySQL con el botn AddLibrary. Tal como se muestra:

Al dar clic sobre AddLibrary , aparecer una nueva ventana en donde escogeremos lo siguiente:

Clic en Add Library, se verifica as:

Luego OK a esta ventana, y ahora si podemos correr nuestra aplicacin con las modificaciones hechas: