1. Objetivos:
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:
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
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.
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 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:
Máquina: jipla0.gi.ehu.es
BD: cuentas
Usuario: ISO
Password: ISO
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