PROG 11 Apuntes
PROG 11 Apuntes
Caso prctico
Ada ha asignado un proyecto a Mara y a Juan. Se trata de
un proyecto importante, y puede suponer muchas ventas, y
por tanto una gran expansin para la empresa.
En concreto, un notario de renombre en el panorama
nacional, se dirigi a BK programacin para pedirles que les
desarrolle un programa para su notara, de modo que toda la
gestin de la misma, incluyendo la emisin de las
escrituras, se informatizaran. Adems, si el programa es
satisfactorio, se encargar de promocionar la aplicacin ante el resto de sus conocidos
notarios, pudiendo por tanto suponer muchas ventas y por ello, dinero.
Una cuestin vital en la aplicacin es el almacenamiento de los datos. Los datos de los
clientes, y de las escrituras debern guardarse en bases de datos, para su tratamiento y
recuperacin las veces que haga falta.
Como en BK programacin trabajan sobre todo con Java, desde el primer momento Juan y
Mara tienen claro que van a tener que utilizar bases de datos relacionales y JDBC y as lo
comentan con Ada.
1.- Introduccin.
Hoy en da, la mayora de aplicaciones informticas necesitan
almacenar y gestionar gran cantidad de datos.
Esos datos, se suelen guardar en bases de datos relacionales, ya
que stas son las ms extendidas actualmente.
Las bases de datos relacionales permiten organizar los datos en
tablas y esas tablas y datos se relacionan mediante campos
clave. Adems se trabaja con el lenguaje estndar conocido como SQL, para poder realizar las consultas
que deseemos a la base de datos.
Una base de datos relacional se puede definir de una manera simple como aquella que presenta la
informacin en tablas con filas y columnas.
Una tabla es una serie de filas y columnas, en la que cada fila es un registro y cada columna es un
campo. Un campo representa un dato de los elementos almacenados en la tabla (NSS, nombre, etc.)
Cada registro representa un elemento de la tabla (el equipo Real Madrid, el equipo Real Murcia, etc.)
No se permite que pueda aparecer dos o ms veces el mismo registro, por lo que uno o ms campos de la
tabla forman lo que se conoce como
clave primaria.
El sistema gestor de bases de datos, en ingls conocido como: Database Management System
(DBMS), gestiona el modo en que los datos se almacenan, mantienen y recuperan.
En el caso de una base de datos relacional, el sistema gestor de base de datos se denomina: Relational
Database Management System (RDBMS).
Tradicionalmente, la programacin de bases de datos ha sido como una Torre de Babel: gran cantidad de
productos de bases de datos en el mercado, y cada uno "hablando" en su lenguaje privado con las
aplicaciones.
Java, mediante
JDBC (Java Database Connectivity), permite simplificar el acceso a base de datos,
proporcionando un lenguaje mediante el cual las aplicaciones pueden comunicarse con motores de bases
de datos. Sun desarroll este API para el acceso a bases de datos, con tres objetivos principales en
mente:
Ser un API con soporte de SQL: poder construir sentencias SQL e insertarlas dentro de llamadas al
API de Java,
Aprovechar la experiencia de los APIs de bases de datos existentes,
Ser sencillo.
Autoevaluacin
JDBC permite acceder a bases de datos relacionales cuando programamos con Java,
pudiendo as utilizar SQL.
Verdadero.
Falso.
Para saber ms
Si necesitas refrescar o simplemente aprender el concepto de clave primaria, en la wikipedia
puedes consultarlo.
Clave primaria.
Debes conocer
Si no has estudiado nunca bases de datos, ni tienes idea de qu es SQL o el modelo relacional,
sera conveniente que te familiarizaras con l. A continuacin te indicamos un tutorial bastante
ameno sobre SQL y en donde describe brevemente el modelo relacional.
Tutorial SQL.
1.2.- JDBC.
JDBC es un API Java que hace posible ejecutar sentencias SQL.
De JDBC podemos decir que:
Consta de un conjunto de clases e interfaces escritas en
Java.
Proporciona un API estndar para desarrollar aplicaciones de
bases de datos con un API Java pura.
Con JDBC, no hay que escribir un programa para acceder a una base de datos Access, otro programa
distinto para acceder a una base de datos Oracle, etc., sino que podemos escribir un nico programa
con el API JDBC y el programa se encargar de enviar las sentencias SQL a la base de datos apropiada.
Adems, y como ya sabemos, una aplicacin en Java puede ejecutarse en plataformas distintas.
En el desarrollo de JDBC, y debido a la confusin que hubo por la proliferacin de API's propietarios de
acceso a datos, Sun busc los aspectos de xito de un API de este tipo,
ODBC (Open Database
Connectivity).
ODBC se desarroll con la idea de tener un estndar para el acceso a bases de datos en entorno
Windows.
Aunque la industria ha aceptado ODBC como medio principal para acceso a bases de datos en Windows,
ODBC no se introduce bien en el mundo Java, debido a la complejidad que presenta ODBC, y que entre
otras cosas ha impedido su transicin fuera del entorno Windows.
El
nivel de abstraccin al que trabaja JDBC es alto en comparacin con ODBC, la intencin de Sun fue
que supusiera la base de partida para crear libreras de ms alto nivel.
JDBC intenta ser tan simple como sea posible, pero proporcionando a los desarrolladores la mxima
flexibilidad.
Autoevaluacin
JDBC es la versin de ODBC para Linux.
Verdadero.
Falso.
dentro de J2SE
extensin dentro de J2EE
javax.sql,
Cdigo Java para establecer una conexin y ejecutar consulta. [txt 1KB]
En principio, todos los conectores deben ser compatibles con ANSI SQL-2 Entry Level (ANSI SQL-2 se
refiere a los estndares adoptados por el American National Standards Institute (ANSI) en 1992. Entry
Level se refiere a una lista especfica de capacidades de SQL). Los desarrolladores de conectores pueden
establecer que sus conectores conocen estos estndares.
Para saber ms
Lista sobre los conectores JDBC para acceder a muchas las bases de datos listadas.
Conectores JDBC
Autoevaluacin
Para usar programar accesos a MySQL hay que tener el driver JDBC para MySQL en
nuestra aplicacin.
Verdadero.
Falso.
Para saber ms
Para probar con otras bases de datos, puedes instalar tambin Oracle. Aqu puedes ver como
se instala.
Instalar Oracle.
Caso prctico
Mara, Ada y Juan han realizado concienzudamente el
diseo de las tablas necesarias para la base de datos de la
aplicacin de notaras.
Tambin se han decantado por el sistema gestor de bases
de datos a utilizar. Emplearn un sistema gestor de bases
de datos relacional. Una vez instalado el sistema gestor,
tendrn que programar los accesos a la base de datos para
guardar los datos, recuperarlos, realizar las consultas para
los informes y documentos que sean necesarios, etc.
Debes conocer
Puedes descargarte e instalar la herramienta grfica que permite entre otras cosas trabajar para
crear tablas, editarlas, aadir datos a las tablas, etc., con MySQL. Aqu puedes descargarlo:
Descarga de MySQL WorkBench.
Una vez descargado e instalado, veamos cmo crear paso a paso un esquema de base de
datos con MySQL WorkBench, para usar en la aplicacin de notaras, y una tabla, la de
clientes. Lo puedes ver en la siguiente presentacin:
Para saber ms
Aqu puedes ver un vdeo sobre la instalacin de la base de datos Oracle Express y creacin de
tablas.
Para saber ms
En este enlace encontrars de una manera breve pero interesante la historia del SQL
Historia del SQL.
Autoevaluacin
Con las consultas SQL hay que especificar paso a paso cmo recuperar cada dato de la
base de datos.
Verdadero.
Falso.
donde creamos la tabla con cod_dep como clave primaria. Adems, se aade una restriccin para
comprobar que cuando se est dando de alta un registro, lo que se escriba en el campo locsea Madrid,
Barcelona o Murcia.
Y una tabla de empleados, teniendo en cuenta el departamento en el que trabajen:
En el caso de esta tabla, se puede ver que hay un restriccin para comprobar que el salario sea mayor que
0.
Caso prctico
Tanto Juan como Mara saben que trabajar con bases de
datos relacionales en Java es tremendamente sencillo, por
lo que establecer una conexin desde un programa en Java,
a una base de datos, es muy fcil.
Juan le comenta a Mara: -Empleando la tecnologa slo
necesitamos dos simples sentencias Java para conectar la
aplicacin a la base de datos. Mara, preprate que en un
periquete tengo lista la conexin con la base de datos y
salimos a tomar un caf.
Cuando queremos acceder a una base de datos para operar con ella, lo primero
que hay que hacer es conectarse a dicha base de datos.
En Java, para establecer una conexin con una base de datos podemos utilizar
el mtodo getConnection() de la clase DriverManager. Este mtodo recibe
como parmetro la URL de JDBC que identifica a la base de datos con la que
queremos realizar la conexin.
La ejecucin de este mtodo devuelve un objeto Connectionque representa la
conexin con la base de datos.
Cuando se presenta con una URL especfica, DriverManager itera sobre la
coleccin de drivers registrados hasta que uno de ellos reconoce la URL
especificada. Si no se encuentra ningn driver adecuado, se lanza una
SQLException.
Veamos un ejemplo comentado:
Cdigo Java para establecer una conexin con MySQL. [txt 1KB]
Si probamos este ejemplo con NetBeans, o cualquier otro entorno, y no hemos instalado el conector para
MySQL, en la consola obtendremos el mensaje: Excepcin: java.lang.ClassNotFoundException:
com.mysql.jdbc.Driver.
Por tanto, como ya hemos comentado anteriormente, entre el programa Java y el Sistema Gestor de la
Base de Datos (SGBD) se intercala el conector JDBC. Este conector es el que implementa la
funcionalidad de las clases de acceso a datos y proporciona la comunicacin entre el API JDBC y el
SGBD.
La funcin del conector es traducir los comandos del API JDBC al protocolo nativo del SGBD.
Autoevaluacin
Para establecer una conexin con una base de datos se puede usar
Verdadero.
Falso.
getConnection().
Caso prctico
Ada est echando una mano a Juan y Mara en la creacin de
consultas, para los informes que la aplicacin de notara debe aportar a
los usuarios de la misma.
Hacer consultas es una de las facetas de la programacin que ms
entretiene a Ada, le resulta muy ameno y fcil. Adems, y dada la
importancia del proyecto, cuanto antes avancen en l, mucho mejor.
Por suerte, los tres: Ada, Mara y Juan tienen experiencia en consultas
SQL y saben que, cuando se hace una consulta a una base de datos,
hay que afinar y hacerla lo ms eficiente posible, pues si se descuidan
el sistema gestor puede tardar mucho en devolver los resultados.
Adems, algunas consultas pueden devolver un conjunto de registros
bastante grande, que puede resultar difcil de manejar desde el
programa, ya que por norma general tendremos que manejar esos datos registro a registro.
Para operar con una base de datos ejecutando las consultas necesarias,
nuestra aplicacin deber hacer las operaciones siguientes:
Cargar el conector necesario para comprender el protocolo que usa la
base de datos en cuestin.
Establecer una conexin con la base de datos.
Enviar consultas SQL y procesar el resultado.
Liberar los recursos al terminar.
Gestionar los errores que se puedan producir.
Podemos utilizar los siguientes tipos de sentencias:
Statement:
Autoevaluacin
Para poder enviar consultas a la base de datos hemos tenido que conectarnos a ella
previamente.
Verdadero.
Falso.
El mtodo next()del ResultSethace que dicho puntero avance al siguiente registro. Si lo consigue, el
mtodo next() devuelve true. Si no lo consigue, porque no haya ms registros que leer, entonces
devuelve false.
Para saber ms
Puedes consultar todos los mtodos que soporta ResulSet, adems de ms informacin, en la
documentacin de Oracle:
ResulSet
Autoevaluacin
Para obtener un entero almacenado en uno de los campos de un registro, trabajando
con el ResulSetemplearemos el mtodo getInt().
Verdadero.
Falso.
Si queremos aadir un registro a la tabla Cliente, de la base de datos con la que estamos trabajando
tendremos que utilizar la sentencia INSERT INTOde SQL. Al igual que hemos visto en el apartado anterior,
utilizaremos executeUpdatepasndole como parmetro la consulta, de insercin en este caso.
As, un ejemplo sera:
Statement s = con.createStatement();
" (idCLIENTE, NIF, NOMBRE, APELLIDOS, DIRECCIN, CPOSTAL, TELFONO, CORREOELEC)" + " VALU
Autoevaluacin
Al aadir registros a una tabla de una base de datos, tenemos que pasar como parmetro al
executeUpdate(), una sentencia SQL del tipo: DELETE...
Verdadero.
Falso.
Cuando nos interese eliminar registros de una tabla de una base de datos, emplearemos la sentencia
SQL: DELETE. As, por ejemplo, si queremos eliminar el registro a la tabla Cliente, de nuestra base de
datos y correspondiente a la persona que tiene el nif: 66778998T, tendremos que utilizar el cdigo
siguiente.
Autoevaluacin
Al ejecutar el borrado de un registro mediante
borrado elimin alguna fila o no.
Verdadero.
Falso.
executeUpdate(),
no podemos saber si el
Para saber ms
En el siguiente enlace puedes ver cmo se realiza una gestin de la conexin con Oracle,
desde el registro del conector hasta el cierre de la misma. Tambin se comenta sobre MySQL.
Gestin de la conexin en Oracle.
4.6.- Excepciones.
En todas las aplicaciones en general, y por tanto en las que acceden a bases de
datos en particular, nos puede ocurrir c on frecuencia que la aplicacin no funciona,
no muestra los datos de la base de datos que desebamos, etc.
Es importante capturar las excepciones que puedan ocurrir para que el programa
no aborte de manera abrupta. Adems, es conveniente tratarlas para que nos den
informacin sobre si el problema es que se est intentando acceder a una base de
datos que no existe, o que el servicio MySQL no est arrancado, o que se ha
intentado hacer alguna operacin no permitida sobre la base de datos, como
acceder con un usuario y contrasea no registrados, ...
Por tanto es conveniente emplear el mtodo getMessage() de la clase
SQLException para recoger y mostrar el mensaje de error que ha generado
MySQL, lo que seguramente nos proporcionar una informacin ms ajustada
sobre lo que est fallando.
Cuando se produce un error se lanza una excepcin del tipo java.sql.SQLException.
Es importante que las operaciones de acceso a base de datos estn dentro de un bloque trycatchque gestione las excepciones.
Los objetos del tipo SQLException tienen dos mtodos muy tiles para obtener el cdigo del error
producido y el mensaje descriptivo del mismo, getErrorCode()y getMessage()respectivamente.
El mtodo getMessage()imprime el mensaje de error asociado a la excepcin que se ha producido, que
aunque est en ingls, nos ayuda a saber qu ha generado el error que caus la excepcin. El mtodo
getErrorCode(), devuelve un nmero entero que representa el cdigo de error asociado. Habr que
consultar en la documentacin para averiguar su significado.
Autoevaluacin
El cierre de las conexiones y la gestin de excepciones slo hay que efectuarla con
bases de datos MySQL.
Verdadero.
Falso.
Para saber ms
En el siguiente enlace puedes ver ms sobre las excepciones en Java.
Excepciones en Java.
Recurso (2)
Autora: Dantadd.
Licencia: CC-by.
Procedencia:
http://commons.wikimedia.org/wiki/File:Notariavigo.jpg
Autora: h
Licencia:
Proceden
http://www
Autora: sincretic.
Licencia: CC-by-nc-sa.
Procedencia:
http://www.flickr.com/photos/sincretic/1225213419/
Autora: J
Licencia:
Proceden
http://www
Autora: CC-by.
Licencia: Uso educativo no comercial.
Procedencia:
http://www.flickr.com/photos/eiriks/3359730744/
Autora: J
Licencia:
Proceden
http://www
Autora: b
Licencia:
Proceden
http://www