En los últimos posts hemos trabajado con BBDD, realizando consultas, insertando y actualizando esta utilizando como base el lenguaje de programación Java.
¿Cómo podemos utilizarlo en el aula, programarlo y evaluarlo? Os resultará muy fácil a través del siguiente documento:
En prácticamente todas las aplicaciones que pensemos realizar interacción con base de datos vamos a necesitar dos interfaces iniciales para arrancar nuestra aplicación.
Login A través de esta ventana recogemos el usuario y su contraseña para poder acceder a nuestra aplicación con un determinado usuario recogido desde la BBDD
Registo A través de esta interfaz realizamos la inserción en la base de datos de un nuevo usuario para poder acceder a la aplicación
El siguiente ejemplo es un poco más largo que las anteriores aportaciones sin embargo nos permitirá ver paso a paso y con mucho detalle cómo poder crear dichas dos ventanas.
Si eres educador o profesor utiliza la siguiente plantilla para tus alumnos
Siguiendo la metodología MVC
, crearemos el esqueleto dentro de nuestro ejemplo/aplicación que nos permita separar nuestro código en Modelo, Vistas y la parte de Controlador. De esta forma será mucho más sencillo posteriormente poder mantener nuestro código y realizar ampliaciones futuras.
Paso 2. Creando las interfaces
Tal y como hemos visto en anteriores lecciones, el uso de los Managers (Managers básicos o Managers más avanzados), nos permite estructurar de una forma ordenada todos los elementos de nuestras interfaces, hacienddo que se redistribuyan de acuerdo a unas dimensiones dependientes del dispositivo donde se visualiza la aplicación. En nuestro caso utilizaremos principalmente el GridBagLayout.
Paso 3. Contraseña
En el momento que trabajamos con usuarios y contraseñas, entramos en un mundo bastante delicado donde es muy muy importante utilizar adecuadamente los sistemas de seguridad para mantener a salvo contraseñas. Uno de esos elementos es el JPasswordField, que aunque resulta muy parecido en apariencia con el JTextField, internamente utiliza métodos más seguros pero por otro lado un poco más complejos de utilizar.
Paso 4. Formulario de Registro
En la ventana de registro es importante realizar una comprobación de todos los campos, en primer lugar para que no estén vacíos, en segundo lugar en su corrección de forma y contenido. En este segundo caso no realizaremos un análisis exhaustivo de cómo realizarlo, sin embargo dejaremos perfectamente descrito el proceso general y en particular el más crítico como es el de las contraseñas.
Más complicado será generar el hash en MD5 para poder almacenar nuestra contraseña en la base de datos, ya que no podemos almacenarla como un texto plano, sería un problema de seguridad. Sin entrar en detalles utilizaríamos la clase MessageDigest, que nos permite realizar dicha operación:
// Cargamos en ejecución
m = MessageDigest.getInstance("MD5");
m.reset();
byte[] digest = m.digest(toBytes(pass));
Paso 6. Finalizando y comprobando usuario
Por último sólo nos queda por comprobar el usuario y su login a través de la pantalla de logado. Para poder realizarlo reutilizaremos el código inicial añadiendo tanto una consulta a la base de datos con la que comprobamos el usuario y la librería MD5 para la contraseña introducida.
Descárgate o visualiza el código utilizado en el vídeo través de mi cuenta en GitHub
Siguiendo con la dinámica de trabajo con la base de datos de Java, después de haber visto la sentencia SELECT e INSERT, le llega el turno a la de UPDATE.
Una actualización necesita de dos informaciones para que resulte efectiva:
Los datos que se necesitan para poder actualizar la información.
La fila y el identificador necesario para poder actualizar dicho registro
Si eres educador o profesor utiliza la siguiente plantilla para tus alumnos
La clase PreparedStatement la podemos revisar en los documentos de Oracle con fantásticos ejemplos para poder utilizar directamente sobre nuestro código. Debido a que la acción de actualizar los datos de un registro es un poco más complejo que una búsqueda o inserción, podemos utilizar clases que permiten separar la parte de definición de la consulta de los datos mismos, haciendo mucho más flexible la construcción y ejecución de la misma.
Descárgate o visualiza el código utilizado en el vídeo través de mi cuenta en GitHub
Tal y como indico en el primer vídeo, la definición y documentación que aparece en la Wikipedia sobre el patrón SingleTon, me parece excelente. Por ese motivo me remito a su definición:
“En ingeniería de software, el patrón singleton (instancia única en inglés) es un patrón de diseño diseñado para restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto.
Su intención consiste en garantizar que una clase sólo tenga una instancia y proporcionar un punto de acceso global a ella.”
Por lo tanto que nos va a permitir esta metodología o patrón, en primer lugar poder acceder desde cualquier parte de nuestro proyecto y/o aplicación a dicho objeto sin necesidad de ir "pasando" el objeto por el constructor o por un método. En segundo lugar asegurarnos de que el objeto es único.
Si eres educador o profesor utiliza la siguiente plantilla para tus alumnos
Uno de los usos más directos y útiles es cuando utilizamos el patrón junto con nuestras clases de BBDD, y en concreto con la clase que se encarga de la conexión a la base de datos.
Una vez que nos hemos conectado a la base de datos, nos interesa mantener abierta dicha conexión, y sobre todo que SEA ÚNICA, ya que esto si que sería un problema importante y una fuga de memoria
Descárgate o visualiza el código utilizado en el vídeo través de mi cuenta en GitHub
Una vez que tenemos información en nuestra base de datos, la actividad más común e importante que realizamos con la misma es la búsqueda, selección y visualización de la información.
No vamos a profundizar en el uso de las sentencias SQL, aunque sí mostrar cómo se realiza una consulta básica a través de una sentencia SELECT, que utilizaremos con nuestro jdbc para devolver una o múltiples registros.
Si eres educador o profesor utiliza la siguiente plantilla para tus alumnos
// Setup the connection with the DB
String sql = "SELECT nombre, apellido1, apellido2, edad FROM usuarios WHERE nombre='"+nombreBuscar+"'";
rs = orden.executeQuery(sqlMal);
De la BBDD a un JComboBox
Uno de los componentes de la librería Swing más sencillos y versátiles para comenzar a utilizar con nuestra base de datos es el JComboBox, anteriormente habíamos comprobado cómo usarlo con objetos, ahora uniremos esa información al uso con base de datos.
Descárgate o visualiza el código utilizado en el vídeo través de mi cuenta en GitHub
La interacción con la base de datos nos ofrece principalmente la posibilidad de persistencia de la información, es decir, poder disponer de la información para su búsqueda y/o modificación posterior aún cuando nuestra aplicación se haya apagado.
Por otro lado provoca que debamos ser meticulosos a la hora de diseñar nuestra aplicación, ya que diferentes no sólo estamos trabajando con ventanas que hacen uso de diferentes clases, sino que generamos una interacción con sistemas externos, y por lo tanto las buenas prácticas a la hora de diseñar nuestra aplicación es muy importante:
Utilizar la metodología MVC para organizar nuestro código
Utilizar una clase para cada tabla de la base de datos
Separar las interfaces del resto del código
Incluir el conector adecuado en nuestro proyecto
Buenas prácticas
Tal y como avanzábamos. Deberemos, nuestros proyectos cuando incorporan interacción y manejo de la base de datos, provoca un crecimiento importante del código y por lo tanto necesitamos tener una buena estructura de carpetas, paquetes y librerías
Insertando un nuevo registro
Para insertar un nuevo registro en la base de datos, necesitamos realizar tres pasos. En primer lugar cargar el jdbc adecuado para nuestro proyecto.
// Cargamos en ejecución
Class.forName("com.mysql.jdbc.Driver");
En segundo lugar conectarnos a la base de datos.
// Setup the connection with the DB
connect = DriverManager.getConnection("jdbc:mysql://XX.XX.XX.XX/baseDatos?"
+ "user=usuario&password=pass");
Insertar en la base de datos será definitivamente realizar la consulta en concreto
// Setup the connection with the DB
orden = conexion.createStatement();
String sql = "INSERT INTO usuarios (nombre,apellido1,apellido2,edad) " +
"VALUES ('"+nombre+"', '"+apellido1+"', '"+apellido2+"', "+edad+")";
orden.executeUpdate(sql);
Descárgate o visualiza el código utilizado en el vídeo través de mi cuenta en GitHub