Boo-King es una aplicación de préstamo de libros entre personas que permite almacenar datos de libros, arrendadores y préstamos en una base de datos MySQL. La aplicación nos permitirá manipular estos datos de una forma mucho más user-friendly. Los receptores de préstamos se han obviado para simplificar un poco el proyecto 😅.
Este proyecto ha supuesto mucho trabajo pero como resultado, ha valido la pena 💃
Repositorio GitHub
🌐 Página del proyecto
📜 Historial de versiones
⬇️ Descargas
📝 Tareas y mejoras propuestas
- Índice de contenidos
La aplicación de Boo-King ofrece al usuario una interfaz agradable con la que administrar la base de datos de nuestra aplicación de préstamo de libros. Dicha aplicación ofrece una interfaz como la siguiente:
Tras elegir una opción, el programa interactuará con el usuario para pedirle los datos necesarios para operar y ofrecer los resultados.
El servidor MySQL será responsable de almacenar y establecer las relaciones entre los datos de nuestra aplicación.
La base de datos necesaria para la aplicación se encuentra en el archivo BaseDatos.sql.
En nuestro caso nos hemos servido de PHPMyAdmin para crear los elementos necesarios para el proyecto, los cuáles son los siguientes.
Nombre | Descripción |
---|---|
Arrendador | Datos de la persona que realizará préstmos de libros |
Libro | Datos de un libro |
Préstamo | Préstamo realizado por un arrendador |
Stack | Tabla intermedia préstamo-libro que almacena la cantidad para cada libro en un préstamo |
Tablas | Relación |
---|---|
Arrendador-Préstamo | 1-N |
Préstamo-Stack | 1-N |
Stack-Libro | N-1 |
(Préstamo-Libro) | N-M |
Java es el encargado de realizar las operaciones lógicas correspondientes según la opción de menú elegida. Éste tendrá que manipular datos y hacer uso las librerías que harán de interfaz entre él y la base de datos.
La clase principal CLI (ejecutable) es Main.java.
El código del proyecto está organizado en paquetes de forma que su estructura queda de la siguiente forma:
Paquete | Descripción |
---|---|
ejecutable | Paquete con los archivos que serán ejecutados |
persistencia | Clases que definen los objetos que manipularemos |
modelo | Clases con utilidades recurridas |
dao | Clases que definen la interacción con la BD |
La graphic user interface (GUI) ha sido realizada mediante la librería JavaFX y la aplicación java SceneBuilder. La combinación de estas dos herramientas nos permite realizar interfaces de forma potente y aplicarles hojas de estilo (css) para dotar a nuestras aplicaciónes de un aspecto atractivo y colorido 🌈.
La clase principal (ejecutable) de la interfaz es MainGui.java. Podemos encontrar todo lo relativo a la visualización en el paquete vista.
Para conectar nuestro programa Java con MySQL hacemos uso de la librería Hibernate, que nos permitirá abstraernos de SQL y trabajar con objetos de forma que el proyecto se agiliza mucho más. También hacemos uso de Hibernate validator, que nos ayudará a validar los datos de entrada ahorrándonos el trabajo de programar validaciones en Java. Cabe destacar que Hibernate a su vez hace uso de la librería JDBC para conectarse con la base de datos, una librería que podría conectar por sí sola Java con la BD pero de forma mucho más primitiva.
Para ello nos hemos basado en la ayuda de la profesora @Fátima y la wiki curso de Hibernate.
En las clases Java del paquete dao, realizamos consultas en varios métodos.
Método | Clase | Tipo de consulta |
---|---|---|
guardar | GenericDAO | Básica |
borrar | GenericDAO | Básica |
actualizar | GenericDAO | Básica |
obtener | GenericDAO | Básica |
obtenerPorNombre | ArrendadorDAO | HQL |
totalArrendadores | ArrendadorDAO | HQL |
obtenerPorNombre | PrestamoDAO | HQL |
prestamosEnUnAno | PrestamoDAO | HQL |
librosPrestadosEnUnAno | PrestamoDAO | HQL |
totalPrestamos | PrestamoDAO | HQL |
fechaPrimerPrestamo | PrestamoDAO | HQL |
mediaLibrosPrestados | PrestamoDAO | HQL |
totalLibrosPrestados | StackDAO | HQL |
Se ha aplicado la eliminación en cascada en las clases siguientes.
Clase | Clase víctima del cascada | Razón |
---|---|---|
Arrendador | Préstamo | Naturaleza de la relación (préstamo no puede existir sin arrendador) |
Préstamo | Stack | Naturaleza de la relación (no puede haber pilas de libros prestados sin su préstamo) |
Se han implementado validaciones en los objetos con hibernate validator, tales validaciones incluyen:
- Introducción de números, máximos y mínimos.
- Limitación de cadenas de carácteres.
- Patrones
- Condiciones definidas en métodos
- Tipo fecha
- Objetos válidos
ℹ️ La información y documentación se encuentra en la carpeta doc incluyendo los siguientes documentos.
Se trata de un white paper o manual dónde se explica el proyecto Boo-King.
Es el documento actual README.md.
Es la documentación web generada a partir de los comentarios JavaDoc en código, principalmente para desarrolladores y colaboradores.
Puedes acceder a ella a través del Index JavaDoc.
Es el esquema UML que representa las clases persistencia de Hibernate y sus relaciones entre sí.
Es un representación gráfica de todas las versiones (commits) por las que ha pasado el proyecto. Te recomiendo que le eches un vistazo.
Puedes ver el árbol de versiones en este enlace.
- Deberemos instalar la base de datos MySQL con PHPMyAdmin.
- Desde PHPMyAdmin, crear la base de datos 'booking'.
- Importar el archivo BaseDatos.sql en la base de datos que acabamos de crear.
- Dirígete a releases y descarga el instalador
.jar
. - Abre el instalador con doble click o abrir con JVM.
- (Si no funcionó) Abre una terminal y navega a la carpeta dónde lo has descargado mediante el comando
cd carpeta
. - Abre el instalador mediante
java -jar Boo-King4.1-install.jar
y sigue los pasos.
- Dirígete a releases y descarga el instalador
.exe
. - Abre el instalador mediante doble click.
- Sigue los pasos.
La aplicación mostrará una barra de menús y 3 botones con los que podremos acceder a todas las funcionalidades.
- El menú
Archivo
muestra opciones de configuración de la aplicación. - El menú
Administrar
da acceso a los paneles de administración de arrendadores, libros y préstamos, al igual que los botones que aparecen en pantalla. - El menú
Informes
ofrece opciones para generar informes (reportes) en pdf sobre los datos de nuestra aplicación. - El resto de menús ofrece fuentes de información adicionales al usuario.
✋ Antes de empezar a usar nuestra aplicación, deberemos configurar las credenciales de acceso a la base de datos. Para ello abrimos el menú Archivo
-> Configurar BBDD
. Si no realizamos este paso los valores por defecto serán root
y 123456
.
Ahora podremos operar con nuestra aplicación.
Cualquiera de las opciones de administrar que abramos, contiene una tabla con los datos en cuestión, extraídos de la base de datos, y una serie de botones que nos ofrecerán diferentes operaciones como añadir, editar y borrar tuplas de la tabla. Tan sólo tenemos que seleccionar la tupla que queremos alterar y pulsar sobre editar o borrar para manipularla o simplemente pulsar sobre añadir y en cualquier caso nos aparecerá un diálogo adicional solicitando los datos que sean necesarios.
Nuestra aplicación ofrece una función para generar reportes. Estos reportes consisten en informes PDF con los datos de la tabla, estadísticas, gráficas y su fecha de emisión. Para generarlos, tendremos que volver al menú principal y pulsar sobre Informes
y la opción que deseemos. Se generará un PDF en la carpeta de instalación y se abrirá automáticamente una ventana para visualizarlo, ¡pero tendrás que ser paciente! 🐢
Algunos problemas son:
-
Los recursos usados por la aplicación se encuentran incluidos en ella, aún así no podemos instalar la fuente usada para los títulos sin tu permiso.
Para ello se incluye la fuente en la carpeta resources, dentro de la carpeta de instalación.
-
El programa ha sido desarrollado sobre windows 10. Por lo tanto la experiencia visual puede verse alterada en otros sistemas operativos.
- En sistemas Linux, la vista principal queda ligeramente desplazada.
-
La zona de administración de préstamos no funciona plenamente, debido a la complejidad para introducir una fecha tipo
Date
(clase obsoleta en java).
Puedes usar esta opción si:
🔴 Quieres configurar en profundidad la base de datos.
💔 Si las otras alternativas no funcionaron.
👍 Si deseas ver y modificar el código fuente.
- Descargar código fuente del proyecto mediante clone o en releases.
- Impórtalo en tu IDE Java favorito.
- Configurar datos de acceso a BD en el archivo hibernate.cfg.xml.
- Ejecuta Main.java o bien MainGui.java.
-
Requisitos mínimos
- La BD debe constar de al menos tres tablas relacionadas entre si
- Deben existir relaciones 1:N (al menos 1)
- Debe existir algún campo autonumérico
- Tipo enumerado en alguna tabla
- Validaciones con Hibernate Validator
- Deben poder realizarse operaciones de inserción en todas las tablas de la BD (>= 3)
- Deben poder realizarse operaciones de consultas HQL de todas las tablas de la BD (>= 3)
- Deben poder realizarse operaciones de modificación de al menos una tabla de la BD
- Deben poder realizarse operaciones de baja de al menos una tabla de la BD
- Utilización del patrón DAO
- Gestión de transacciones ❔
-
Aspiras alto, amigo
- Existencia de una relación N:M implementada como dos relaciones y 1:N
- Existencia de relación 1:N ordenada
- Tipo fecha en alguna tabla
- Paginación
- Métodos java de validación
- Existencia de claves únicas
- Complejidad de la aplicación, de las consultas y operaciones realizadas
- Calidad de software y estilo de programación. YEA
- Calidad de la documentación
🚧 This is work in progress my frienderino! 🚧
- Los requisitos de la base de datos se han descrito en la sección Base de datos.
- Los requisitos de consultas se han descritos en Consultas realizadas.
- La explicación del cascade está en Eliminación en cascada.
-
Validaciones realizadas en métodos, ver Validaciones.
-
En todo momento he deseado superarme programando este proyecto, a nivel de organización, documentación, control de versiones y presentación. Sé que no he hecho un proyecto atractivo por fuera, pero he intentado que por dentro sea adorable 🐨.
La verdad es que estoy tan
muertofuera de combate que no quiero ni saber qué nota tendrá. -
He invertido la mayoría del tiempo en re-escribir código y documentar la aplicación para que sea mantenible.
-
He tenido dificultades puntuales con alguna consulta HQL.
-
He aprendido cómo conectar lenguajes lógicos con bases de datos de forma muy práctica.
-
He aprendido mazo de Git & GitHub con mucho esfuerzo, pero porque yo he decido que así sea ❤️.
Creo que ha valido mucho la pena.
-
A mi pesar he tenido que retrasar la interfaz gráfica y funcionalidades como la paginación en los plazos.
🚧 Estamos repartiendo alquitrán por aquí, vuelve más tarde 🚧
sudo apt-get install openjfx
Agradecimientos especiales a las siguientes personas sin las cuales el proyecto no podría haber acabado:
- Profesora Fátima Olías que ha transmitido sus conocimientos y me ha salvado de obstáculos importantes 😍
- Compañeros de clase que, aunque algo pillos, siempre están ahí 😝
- StackOveflow, cuna de programadores 💻
- GitHub, plataforma en la que se basa estas páginas
Hasta el siguiente!! :kissing_closed_eyes: