Sin título

Transcripción

Sin título
LABORATORIO ACCESO AL NIVEL DE DATOS DESDE LA
LÓGICA DE NEGOCIO USANDO UN SGBD RELACIONAL
-Arquitectura física en 2 niveles: cliente gordo/servidor flaco-
1. OBJETIVOS:
 Comprender cómo se puede separar la presentación y el nivel de lógica de negocio,
del nivel de datos.
 Mostrar cómo se pueden desplegar los tres niveles (presentación, lógica de negocio
y datos) en una arquitectura física de dos niveles (cliente gordo con presentación y
lógica de negocio y servidor flaco con el nivel de datos) .
2. TAREAS:
Este laboratorio es una continuación del anterior y consiste en crear una nueva clase que
implemente el nivel de lógica del negocio accediendo a una BD que contenga los usuarios
(nombres de usuario y password) 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. Si no tenéis la solución a mano, se puede
comenzar usando la solución subida a Moodle, que también se encuentra aquí:
SOLUCIÓN LABORATORIO 2 (el fichero .zip se descomprime directamente como una
carpeta de nombre workspace; al abrir eclipse, seleccionar esa carpeta como workspace y
así tendréis todo listo para empezar a trabajar).
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 o XP: hay que acceder al Panel de control =>
Herramientas administrativas => Orígenes de datos ODBC
b) O simplemente ejecutar el comando: odbcad32 (Menú Inicio => 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. Esta nueva clase se encargará de gestionar la conexión
con la BD. Compilar la nueva clase (si da error, recordar que esta clase tiene que tener
implementado el método hacerLogin). Ahora desarrollar los siguientes pasos, compilando
después de cada paso:
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.
• Puente JDBC/ODBC --> Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
• JDBC de MySQL--> Class.forName(“com.mysql.jdbc.Driver”);
• JDBC de ORACLE--> Class.forName(“oracle.jdbc.driver.OracleDriver");
Nota: Al compilar vereis que es necesario atrapara una excepción. Si no lo podéis
solucionar, prestar atención a la primera línea de la excepción.
3.2. Crear una conexión. Después de inicializar los drivers, es necesario crear una
conexión. Para obtener un objeto de tipo Connection se utiliza el DriverManager.
•
Puente JDBC/ODBC (para este paso):
Connection c = DriverManager.getConnection("jdbc:odbc:NombreBD");
•
JDBC (para un paso posterior donde accederemos al servidor):
Connection c = DriverManager.getConnection(String dir, String usu, String cl);
// dir = identifica la BD, jdbc:subprotocolo//servidor:puerto/BDs
// usu = usuario de acceso a la BD
// cl = clave de acceso a la BD
// "jdbc:mysql://jipla0.si.ehu.es/grupo0","grupo0","grupo0"
3.3. Crear una sentencia. Una vez que se tiene un objeto del tipo Connection, se
pueden crear sentencias ( objetos de tipo statement).
// c es un objeto Connection
Statement s = c.createStatement();
// Ejecuta una sentencia SQL INSERT, UPDATE o DELETE
int i = s.executeUpdate(String sql); //devuelve el número de tuplas
modificadas
// Ejecuta una sentencia SQL SELECT
ResultSet r = s.executeQuery(String sql); //devuelve el resultado en un
ResultSet
Crear una sentencia que recupere la primera tupla de la tabla y compilar.
Nota: para asignar valores a los String en las consultas SQL, se utiliza la
concatenación de Strings, que se efectúa con el signo +: "SELECT...WHERE
usuario= ' " + invitado+" ' ..." (ojo con las comillas simples y dobles!!)
Moverse por el ResultSet. Cada una de estas sentencias puede devolver cero o
más tuplas, que son devueltas como objetos del tipo ResultSet. Mediante el método
next() nos podemos mover a la siguiente tupla, o bien posicionarnos en la primera si
todavía no se ha utilizado el objeto ResultSet. La función next() devuelve true o
false en función de si hay una tupla o no, de forma que se puede iterar mediante la
sentencia while (r.next()) para 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 en la consulta SELECT. Además de getString() están disponibles
getBoolean(), getByte(), getDouble(), getFloat(), getInt(), getLong(), getNumeric(),
getObject() (para cuando no se conoce el tipo de datos), getShort(), getDate(),
getTime() y getUnicodeStream(), cada uno de los cuales devuelve la columna en el
formato correspondiente, si es posible.
3.5 Sentencias parametrizables. Probar a recuperar la primera tupa y luego la
segunda. ¿Que sucede? (recordar que un objeto statement sólo puede tener
asociado un objeto resultset)
Para evitar 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, ”Donosti”); // pone Donosti en el primer parámetro (ciudad)
s.setInt (2, 25); // pone 25 en el segundo parámetro (edad)
ResultSet r = s.executeQuery();
Implemetar el método hacerLogin para que consulte en la BD si existe o no el
usuario y password pasados por referencia. Compilar y atrapar las excepciones.
3.6. Cerrar la conexión. Después de haber trabajado con una sentencia o una
conexión es recomendable cerrarlas mediante el método close() (disponible tanto
para el objeto connection como para el objeto statement).
Crear un método que cierre la conexión, compilar y atrapar 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.
5. Manejo de JDBC remoto
Hasta el momento, hemos trabajado con ODBC de forma local. Ahora lo vamos a
hacer 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:
• Máquina: jipla0.si.ehu.es
• BD: grupo0
• Usuario: grupo0
• Password: grupo0
Para conectarnos a la base de datos, debemos cargar el driver JDBC de MySQL de
la siguiente forma:
•
Primero, hay que descargar el driver desde
http://dev.mysql.com/downloads/connector/j/5.0.html y c a r g a r l o d e l a
siguiente forma: Project -> Properties -> Java Build Path -> Libraries -> Add
External JARs...
Posteriormente, hay que cargar también el driver desde código de la siguiente
forma:
Class.forName("com.mysql.jdbc.Driver");
Finalmente, creamos la conexión con la base de datos:
Connection c = DriverManager.getConnection
("jdbc:mysql://jipla0.si.ehu.es/grupo0","grupo0","grupo0");
Probar a ejecutar la aplicación.
6. Atributo "numIntentosFallidos"
Hasta el momento no hemos usado el atributo “numIntentosFallidos” de la tabla “0”.
Modificar la clase de lógica de 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 (recordar el 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 allá una descripcion más detallada de cada uno de los pasos
llevados a cabo en este laboratorio: Laboratorio_Detallado
Como siempre, eliminar la carpeta que hayáis usado como workspace y
que contiene el proyecto generado y todos sus archivos asociados.

Documentos relacionados