BBDD&POO

Bases de Datos y
Programación Orientada a Objetos.

Curso: 2021/22. Parte POO
Máster en Modelización Matemática, Estadística y Computación

Calendario

Octubre
LMMJV
[1]4
12..14
(0.8)
5678
16..18..20
(0.15)
[2]111213
14..16..18
(0.15)
1415
14..16
(0.15)
[3]18
14..16
(0.8)
19
16..18
(0.15)
202122
[4]2526272829
Noviembre
LMMJV
[5]12345
[6]89101112
[7]1516171819
[8]2223242526
[9]2930   
Diciembre
LMMJV
[9]  123
18..20
(0.15)
[10]6789
16..18..20
(0.16)
10
16..18..20
(0.15)
[11]13
14..16..18
(0.8)
14151617
 N  no lectivo,  N  fiesta,  N  estudio,  N  exámenes, NN BBDD, NN POO, nuestra clase.

Programa

Vamos a seguir un enfoque diferente al seguido en ediciones anteriores de este curso. En lugar de desarrollar un curso de aprendizaje de un lenguaje Orientado a Objetos (Java) para entender su "filosofía", vamos a orientarnos a resolver un par de problemas que pueden ser de interés, y para ello necesitaremos de las herramiantas que, con Orientación a Objetos, nos proporcionará el lenguaje. De este modo se irán viendo en un (des)orden diferente al de un curso "organizado", pretendiendo que resulte más natural. Es un planteamiento que coincide con lo que indica Elon Musk en este video.

Pensando en el uso de la programación con Orientación a Objetos en relación con el manejo de bases de datos (BBDDs) en ciencia y tecnología vamos a plantear dos casos: la construcción de interfaces gráficos (GUIs - Graphic User Interface) específicos para acceso a BBDDs, y el procesamiento de datos en bruto para adaptarlos a los requerimientos de una BBDD:

Evaluación

Ejercicio propuesto

Generar un GUI que permita hacer búsquedas en la base de datos que se ha manejado en el curso. Como mínimo deberá ser algo similar a la siguiente figura (como máximo no hay límite 😀).

Esto supone manejar -cuando menos- los componentes JComboBox, JTextField, JButton y JTextarea, así como acceder a la base de datos para solicitar información y manejar la respuesta adecuadamente.

NOTA: varios alumnos han comunicado un problema en su conexión con la base de datos. El mensaje es el siguiente:

The server time zone value 'XXXXX' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specific time zone value if you want to utilize time zone support.

donde XXXXX pueden ser distintos estándares de especificación de zonas horarias.

Como indica el mensaje, la solución es establecer la conexión con el parámetro "serverTimezone" para usar Tiempo Universal Coordinado (UTC). Esto se sitúa en la zona de parámetros de la URL. Ejemplo:

"jdbc.mysql://localhost:3306/MiBaseDeDatos?serverTimezone=UTC"

Desarrollo

DICIEMBRE

viernes 03 de diciembre de 2021
  • Sobre el kit de desarrollo con Java [descargar Oracle JDK 8].
    Comentamos versiones... es necesario desde que SUN 😇 fue comprada por Oracle 👿: vamos por la 17, la 8 es la más "común", nos basta con la 7.
  • Sobre el Entorno Integrado de Desarrollo [descargar Netbeans 12.5]

(si alguien quiere trabajar con Java en su última versión, puede descargar OpenJDK 17, instalarla, e incorporarla a Netbeans posteriormente)

    Diseñaremos un JFrame (un GUI) para:
  • Aprender a hacer GUIs con la ayuda del IDE (todo lo que puede hacerse lo vemos con la demo de Swing)
  • Entender los conceptos Clase y Objeto, y ver la estructura de la biblioteca de clases de Java y su documentación.
  • Entender la Herencia (directa y de "obligaciones", es decir los Interfaces pasando por las clases abstractas), y el Polimorfismo
    dejaremos de ver de este modo muchos detalles puntuales que tendremos que abordar posteriormente, pero hemos de hablar ya de reescritura de métodos.
  • (Pendiente) Aprender a usar el IDE para encontrar con su ayuda lo que se necesita de un modo intuitivo
  • (Pendiente) Estudiaremos el código fuente de la clase JButton para reforzar lo visto (herencia, campos y métodos,...) y comentar todo lo no comentado aun y que resulte pertinente ( estructura de la clase, comentarios y documentación, constructores, el "this" y el "super", getters y setters, clases internas, etc.).
jueves 09 de diciembre de 2021
    Seguiremos con la construcción de un JFrame (un GUI):
  • No llegamos ver la demo de Swing
  • ...ni la documentación (hablamos de cómo escribirla, pero hemos de ver el resultado).
  • ...y dejamos pendiente la herencia de "obligaciones", es decir los Interfaces, clases abstractas, así como el Polimorfismo
    dejaremos de ver de este modo muchos detalles puntuales que tendremos que abordar posteriormente, pero hemos de hablar ya de reescritura de métodos.
  • Aprender a usar el IDE para encontrar con su ayuda lo que se necesita de un modo intuitivo
  • Estudiaremos el código fuente de la clase JButton para reforzar lo visto (herencia, campos y métodos,...) y comentar todo lo no comentado aun y que resulte pertinente ( estructura de la clase, comentarios y documentación, constructores, el "this" y el "super", getters y setters, clases internas, etc.).

---------- Antes de pasar a lo siguiente no dejaremos de ver cómo decir "Hola Mundo" en Java ----------

Información que iremos necesitando para el desarrollo del ejercicio que se plantea a continuación:
Temas: (sin orientación a objetos) Tipos de datos, ...continúa mañana...

viernes 10 de diciembre de 2021

Antes de retomar el hilo... "reparamos" un olvido al explicar ayer el polimorfismo: los "cast" y el operador "instanceof"

Información que iremos necesitando para el desarrollo del ejercicio que se plantea a continuación:
Temas: (sin orientación a objetos) ...viene de ayer..., Operadores. Sentencias.
(con orientacióna objetos) Encapsulamiento. El atributo final y un poco más de "static".
(no para el ejercicio, pero por completar) Enumeraciones. Visión general de la definición de Clases.
(de biblotecas) Entradas/Salidas. Tratamiento de errores. Expresiones regulares. Colecciones. Acceso a bases de datos.
Clases de interés especial: System. Object. Formatter.

Ejercicio a desarrollar

Vamos a procesar datos de referencias bibliográficas que se tienen en un fichero con una determinada estructura y cierto desorden. El fichero puede desacargarse de http://gtts.ehu.es/German/Docencia/assets/DB.txt o ser accedido directamente desde esa dirección por el programa.

Analisis de los datos:
Observando las primeras lineas del fichero veremos datos bibliográficos (obtenidos de scholar.google.es) donde cada línea aporta un dato, que estará precedido por un número de referencia asignado previamente, y un carácter que indica el tipo de dato (t=título, y=año, p=publicación, r=referencias, a=autor, l=link).
La información correspondiente a autores(a) puede aparecer varias veces, de modo que en cada ocasión se referirá a un autor y llevará siempre asociada la filiación del mismo entre comillas.
El número de referencia y el carácter que indica el tipo de información van juntos y seguidos por un espacio en blanco. El número de referencia no tiene una longitud determinada.
No hay un orden predeterminado para las líneas, de modo que la información referente a los distintos artículos podrá intercalarse sin restricciones. Tampoco se asegura que todos los campos de un mismo artículo aparezcan seguidos, sino que puede haber cierto desorden en este sentido.

Objetivos:
Tendremos que (1) asimilar del mejor modo posible toda esa información, y (2) almacenarla posteriormente en una base de datos con las tablas mostradas más abajo.

Observacion:
Una referencia bibliográfica podrá estar completa o no. En concreto, puede que no haya referencias o "link" para algunos registros. En el caso de la falta de referencias bastará con ignorarlo (simplemente no aparecerán referencias en la tabla correspondiente de la base de datos a generar), y en el caso del "link", en el campo correspondiente de la tabla deberá decir "UNKNOWN".

Estrategia:
Para el objetivo 1: definiremos una clase que "soporte" referencias bibliográficas, cada una en un objeto, y según éstos se vayan generando, iremos almacenándolos en en una colección.
Para el objetivo 2: dada la estructura de tablas de la base de datos, cumplimentaremos cada una de ellas mediante métodos de una clase que sea la responsable de interaccionar con ella.

lunes 13 de diciembre de 2021

Estabamos desarrollando el "main" y la clase "Referencia" para resolver el problema propuesto. Hemos de darnos prisa, por lo que esbozamos el camino a seguir y usaremos código pre-escrito.

  1. Hemos de hablar de Colecciones para poder almacenar los autores de una referencia, así como el conjunto de todas las referencias.
  2. Y antes de dar por hecha la primera fase del ejercicio, debemos resolver algo por lo que pasamos apartándolo: el tratamiento de errores.
  3. Para "rematar" la clase "Referencia" tenemos que hablar de la clase Object.
  4. Con lo anterior resolvemos la primera fase del ejercicio, pero veremos cómo replanteando un poco la arquitectura de la solución podemos compartimentarla mejor.
  5. La fase intermedia (entre la adquisición de la información y su envío a la base de datos) consistirá en una pequeña manipulación con las colecciones.
  6. Para llevar los datos a la base de datos hemos de ver cómo hacerlo con Java: necesitaremos el MySql-connector/J, pero el acceso a base de datos es muy sencillo, y "responsabilizaremos de ello a una nueva clase que implementará el patrón Singleton.

Una vez resuelto el ejercicio nos queda por ver algúna cosa más:
Enumeraciones; Visión general de la definición de Clases.
Dónde encontrar información sobre las expresiones regulares.
Clases de interés especial: System; Object; Formatter.

Aquí el ejercicio mostrado en clase (podéis usar file->import en Netbeans)

Extras

Páginas con ejercicios en la Web (aportaciones realizadas por varios alumnos a lo largo del tiempo -un agradecimiento general a ellos-).

Otros temas interesantes para el tipo de aplicaciones que podrían interesarnos y que no pueden abordarse en el curso por su extensión. (Enlaces a los tutoriales de Oracle)