acceso al nivel de datos desde la lógica del negocio usando un sgbd relacional.

arquitectura física en 2 niveles: cliente gordo/servidor flaco

1. Objetivos: 

 2.Tareas a realizar:

Este laboratorio es una continuación del anterior y consiste en crear una nueva clase que implemente el nivel de lógica del negocio y que acceda a una BD que contenga los nombres de usuarios y passwords con permiso de acceso al sistema, para ello llevaremos a cabo los siguentes pasos:

 1.- Crear un proyecto con las clases del laboratorio anterior: Lanzador, LanzadorFrame, Presentacion, e InterfaceLogicaNegocio. En realidad, se puede comenzar usando la solución que se encuentra aquí:  SOLUCIÓN LABORATORIO 2

 2. Manejo de ODBC local. Crear una BD Access (cuentas.mdb) que contenga una tabla “cuenta” con atributos “usuario” (del tipo texto), “password” (del tipo texto) y  numIntentosFallidos” (del tipo numérico) y añadir algunas tuplas de ejemplo.

 2.1. Definir una fuente de datos ODBC llamada  BDPasswLabLog3N y asociadla a la BD anterior.  Para ello:

    a)  En Windows 2000: hay que acceder al Panel de control => Herramientas administrativas => Orígenes de datos ODBC

    b)  En Windows XP: hay que acceder al Panel de control =>  Herramientas administrativas => Orígenes de datos ODBC

    c)  O simplemente ejecutando el comando: odbcad32 (Menú Inicio del Sistema Operativo => Ejecutar => odbcad32)

2.2. Dentro del Administrador de ODBC hay que definir el nombre de la fuente de datos BDPasswLabLog3N y seleccionar la BD cuentas.mdb.

Dentro de la pestaña DNS del usuario (User DNS) pinchar en Agregar (Add) y seleccionar "Microsoft Access Driver". Esto hará que surja un ventana en la cual pondremos como nombre del origen de datos BDPasswLabLog3N y mediante el botón Seleccionar buscaremos la BD cuentas.

   

3.- Añadir una nueva lógica de negocio llamada EntradaSistemaBD que implemente la interface InterfaceLogicaNegocio,la cual se encargara de gestionar la BD. Compilad la nueva clase y llevad a cabo los siguientes pasos compilando en cada paso:

Nota: Si en el paso anterior tenéis problema de compilación recordad implementar el método hacerLogin.

3.1. Inicilizar los driver. La clase que se encarga de inicializar o cargar los drivers es  DriverManager perteneciente al paquete Java.sql.*. La carga (Class.forName) dependera del controlador.

Nota: Al compilar vereis que es necesario atrapara una excepción. Si no lo podeis solucionar presetad atención a la primera línea de la excepción.


3.2. Crear una conexión. Luego de inicializar los drivers, es necesario crear una conexion para ello se utiliza el DriverManager para obtener un objeto del tipo conexión, Connection.

 

Puente JDBC/ODBC --> Connection c =  DriverManager.getConnection("jdbc:odbc:NombreBD");
JDBC                        -->  Connection c = DriverManager.getConnection(String d, String u, String c);

                                         // d = identifica la BD, jdbc:subprotocolo//servidor:puerto/BDs

                                         // u = identifica el usuario

                                         // c = identifica la clave

                                        // "jdbc:oracle:thin:@g010128.si.ehu.es:1521:ISO", "ISO", "ISO"

                                        // "jdbc:mysql://jipla0.gi.ehu.es/ISO","ISO","ISO"

 

3.3. Crear una sentencia. Una vez que se tiene un objeto del tipo Connection, se pueden crear sentencias (statements).

// c es un objeto Connection
Statement s = c.createStatement();      

// Ejecuta una sentencia SQL INSERT, UPDATE o DELETE
int i = s.executeUpdate(String sql);    

// Ejecuta una sentencia SQL SELECT y devuelve el resultado en un objeto ResultSet

ResultSet r = s.executeQuery(String sql);

Cread una sentencia que recupere la primera tupla de la tabla y compilad.

Nota: Recordad que los String se concatenan con el signo +, es decir, "usuario=" + "invitado"

Moverse por el ResultSet. Cada una de estas sentencias puede devolver cero o más resultados, los mismos son devueltos como objetos del tipo ResultSet. Mediante ResultSet.next() nos podemos mover al «siguiente» elemento del resultado, o bien sobre el primero si todavía no se ha utilizado. La función next() devuelve true o false si el elemento existe, de forma que se puede iterar mediante la sentencia while ( resultado.next()) de este modo se puede tener acceso a todos los elementos.

Para tener acceso a la diferentes columnas se utilizan los métodos getXXX(). El acceso se puede hacer por el nombre de la columna o bien mediante su ubicación relativa. Además de getString() están disponibles getBoolean(), getByte(), getDouble(), getFloat(), getInt(), getLong(), getNumeric(), getObject(), getShort(), getDate(), getTime() y getUnicodeStream(), cada uno de los cuales devuelve la columna en el formato correspondiente, si es posible.

3.5. Probar a recuperar la primera tupa y luego la segunda. ¿Que sucede?. Hay que reescribir el código, es posible parametrizar las sentencias SQL. Un ejemplo de ello se observa a continuación.

    PreparedStatement s =  c.prepareStatement(“Select nombre From Persona

                                  Where ciudad =? and edad=?”);
        s.setString(1, ”San Luis”); // pone San Luis en el primer parámetro
        s.setInt(2, 25); // pone 25 en el segundo parámetro
        ResultSet r = s.executeQuery();

Implemetad el método hacerLogin para que consulte en la base de datos si existe o no el usuario y password pasado por referencia. Compilad y atrapad las excepciones.

3.6. Cerrar la conexión. Después de haber trabajado con una sentencia o una conexión es recomendable cerrarla mediante sentencia.close() o conexión.close().

Cread un método que cierre la conexión, compilad y atrapad las excepciones.

4. Ejecutar la lógica del negocio creada

4.1. Comprobar que dentro de vuestro código se utiliza una fuente de datos ODBC llamada BDPasswLabLog3N.

4.2 Ejecutar la aplicación asignando la nueva lógica del negocio. Intentadlo pero si teneis algun problema, aqui teneis la Solución del laboratorio hasta este paso.

 

5. Manejo de JDBC remoto

Hasta el momento, hemos trabajado con ODBC de forma local. Ahora lo haremos con JDBC de forma remota. Para ello, probaremos a conectarnos con otro sistema de bases de datos como es MySQL. La máquina a la que nos conectaremos es:

Para conectarnos a la base de datos, debemos cargar el driver JDBC de MySQL de la siguiente forma. Primero, añadiremos el driver, que nos lo tenemos que descargar desde http://dev.mysql.com/downloads/connector/j/5.0.html, de la siguiente forma: Project -> Properties -> Java Build Path -> Libraries -> Add External JARs...

Posteriormente, el driver desde código se carga de la siguiente forma:

        Class.forName("com.mysql.jdbc.Driver");

Finalmente, crearemos la conexión con la base de datos:

        Connection c  = DriverManager.getConnection("jdbc:mysql://jipla0.gi.ehu.es/cuentas","ISO","ISO");

Probad a ejecutar la aplicación.

 

6. Atributo "numIntentosFallidos"

Hasta el momento no hemos hecho uso del atributo “numIntentosFallidos” de la tabla “cuenta”. Modificar la clase del negocio para incrementar en uno el número de intentos fallidos al introducir incorrectamente el password de un usuario e inicializa a cero el mismo cuando se entra correctamente en el sistema. Si teneis algún problemar recurir al punto 3.3 de este laboratorio.
 

        Statement st;
        st = c.createStatement();
        boolean login = r.next();
        if (login) st.executeUpdate("update cuenta set numIntentosFallidos=0 where usuario='"+usuario+"'");
        else st.executeUpdate("update cuenta set numIntentosFallidos=numIntentosFallidos+1 where usuario='"+usuario+"'");
        return login;

Probad a ejecutar la aplicación.

 

En este enlace se encuentra la solución del laboratorio: SOLUCION LABORATORIO 3

En este enlace se allá una descripcion más detallada de cada uno de los pasos llevados a cabo en este laboratorio: Laboratorio_Detallado

 

Una vez que acabemos el laboratorio hay que eliminar del disco duro la carpeta de trabajo con el proyecto, los fuentes .java, las clases .class, y el workspace