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 😅.
No ha sido un proyecto fácil y, aunque el resultado no es atractivo visualmente, he aprendido muchas cosas y ha merecido la pena 💃
Repositorio GitHub
🌐 Página del proyecto
📜 Historial de versiones
⬇️ Descargas
📝 Tareas y mejoras propuestas
- Índice de contenidos
Nuestra aplicación ofrece al usuario un menú con las siguientes opciones:
+------------ MENÚ -------------+
| Básico |
|-------------------------------|
| [1] Insertar dato |
| [2] Actualizar dato |
| [3] Borrar dato |
| [4] Consultar objet |
|-------------------------------|
| Avanzado |
|-------------------------------|
| [5] Listar arrendadores nombre|
| [6] Listar prestamos nombre |
| [7] Préstamos en un año |
| [8] Estadísticas globales |
| [9] Salir |
+-------------------------------+
Tras elegir una opción, el programa interactuará con el usuario para pedirle los datos necesarios para operar.
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 (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 |
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) |
ℹ️ 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.
❗❗❗ Los ejecutables son sólo válidos si tus datos de acceso a la BD son:
Usuario: root
Contraseña: 123456
❗❗❗
En el caso de que esto no sea así, salta al punto: Ejecución a través de IDE.
- Descargar el archivo Boo-King-linux.run en releases.
- Ejecútalo.
- (Si no funciona) Abrir terminal en el directorio del archivo y darle permisos de ejecución
sudo chmod +x Boo-King.jar
- Descargar el archivo Boo-King-windows.zip en releases.
- Ejecuta el launcher.
- Descarga el archivo Boo-King.jar en releases.
- Abre una terminal cmd o linux y navega a la carpeta dónde lo has descargado mediante el comando
cd carpeta
. - Escribe el comando
java -jar Boo-King.jar
.
Puedes usar esta opción si:
🔴 Tus datos de acceso no son root
y 123456
.
💔 Si las otras alternativas no funcionaron.
👍 Si deseas ver y modificar el código fuente.
- Descargar código fuente del proyecto en releases.
- Impórtalo en tu IDE Java favorito.
- Configurar datos de acceso a BD en el archivo hibernate.cfg.xml.
- Ejecutar el Main.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.
-
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 renunciar a presentar la interfaz gráfica y funcionalidades como la paginación en los plazos.
🚧 Estamos repartiendo alquitrán por aquí, vuelve más tarde 🚧
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: