Crear el DAO, Servicio y Controlador
Introducción
En este tutorial vamos a crear un backend para una aplicación de recursos humanos desde cero, incluyendo la base de datos. La interfaz no se realizará en este tutorial. Al final de este curso, como repaso, se recomienda crear una interfaz adecuada para esta aplicación con Ontimize Web, utilizando el tutorial de Ontimize Web de esta wiki. Este ejercicio está centrado en la creación desde cero de una tabla de base de datos, DAO, servicio y controlador para que puedan ser consumidos a través de una petición REST.
Lanzar la base de datos
Para lanzar la base de datos, es necesario hacer un “Maven Install” en el proyecto, para que cree un fichero *.jar con el contenido del módulo hr-model y el lanzador de la base de datos pueda ser ejecutado por un lanzador Maven. Para hacer esto, clic derecho sobre el icono de Maven 1, clic en “Execute Maven goal” 2 y escribimos el comando mvn install
3. El recuadro rojo tiene que indicar Project, lo que indica que este comando se ejecutará a nivel del proyecto base y sobre cada uno de los módulos.
La salida de la consola de comandos debe mostrar un BUILD SUCCESS.
Una vez completada la instalación de Maven del proyecto padre, podremos crear un lanzador Maven para la base de datos. Clic derecho sobre el desplegable de los lanzadores 1 (en este caso, sobre el icono ▾) y selecionamos Edit Configurations…. En esta ventana, clic en Add New Configuration 2, seleccionamos configuración de Maven y rellenamos los datos como aparecen a continuación:
- Name: Run database (el nombre del lanzador)
- Run: exec:java (la instrucción Maven que se ejecutará)
- Working directory: hr-model (el módulo que ejecutará la instrucción)
- Profiles: run_database (el perfil que se añadirá a la ejecución de la instrucción)
Una vez terminado podemos darle a OK para guardar el lanzador y ya lo tendremos disponible de forma rápida en la parte de los lanzadores. Haciendo clic en el nombre del lanzador, podremos ejecutar la base de datos. En el futuro, cuando tengamos más lanzadores, podremos utilizar el menú desplegable para elegir que queremos ejecutar. Por el momento, lanzaremos la base de datos, dándole al botón de inicio 1.
La base de datos que se lanza tiene los siguientes parámetros de conexión:
Parámetros de conexión
Host: localhost
Port: 9013
Database: templateDB
User: SA
Password: <vacía>
JDBC URL: jdbc:hsqldb:hsql://localhost:9013/templateDB
Método de lanzamiento alternativo
Se puede lanzar también si abrimos la ventana de “Execute Maven goal”, especificamos el módulo sobre el que tenemos que ejecutar el comando Maven (en este caso, hr-model) y ejecutamos:
mvn exec:java -Prun_database
Crear una tabla de candidatos
Creamos la tabla de candidatos para nuestra aplicación de recursos humanos. Esta tabla contendrá múltiples columnas que serán clave foránea de otras tablas, como puedan ser las columnas de STATUS u ORIGIN.
Este es el código SQL para la creación de la tabla.
Código SQL
Insertaremos datos de prueba sólo en aquellas columnas que sean de tipo alfanumérico (recordemos que los elementos numéricos estarán enlazados como claves de otras tablas). Para realizar esta tarea podemos utilizar una herramienta de administración de bases de datos como por ejemplo DBeaver.
Código SQL
Creación de los ficheros DAO
Ahora que tenemos una tabla con datos de prueba en la base de datos, vamos a crear un DAO (Data Access Object) en el módulo de hr-model para que sirva como modelo de esta tabla de la base de datos. Los DAO están compuestos por 2 ficheros: un fichero con extensión *.xml y un fichero *.java.
En nuestro fichero *.xml indicaremos la tabla de la base de datos, desde donde recogemos la información, para la cual hacemos el DAO y el esquema al que pertenece la tabla.
CandidateDao.xml
En el fichero *.java indicamos que se trata de un repositorio cuyo nombre será CandidateDao, mediante la anotación @Repository
. Con la anotación @Lazy
, indicaremos que la carga se retrase hasta que sea completamente necesaria (mejorando de esa manera el rendimiento), y la anotación @ConfigurationFile
nos permite configurar este DAO usando el fichero *.xml y un fichero adicional donde pueden almacenarse algunas características comunes a varios DAO, como el esquema al que pertenecen.
CandidateDao.java
- hr
- hr-api
- src
- main
- java
- com
- ontimize
- hr
- api
- core
- service
- IUserService.java
- service
- core
- api
- hr
- ontimize
- com
- java
- main
- pom.xml
- src
- hr-boot
- src
- main
- java
- com
- ontimize
- hr
- ServerApplication.java
- hr
- ontimize
- com
- resources
- application.yml
- java
- main
- pom.xml
- src
- hr-model
- src
- main
- db
- templateDB.script
- templateDB.txt
- java
- com
- ontimize
- hr
- model
- core
- dao
- CandidateDao.java
- UserDao.java
- UserRoleDao.java
- service
- UserService.java
- dao
- core
- model
- hr
- ontimize
- com
- resources
- dao
- CandidateDao.xml
- placeholders.properties
- RoleDao.xml
- RoleServerPermissionDao.xml
- ServerPermissionDao.xml
- UserDao.xml
- UserRoleDao.xml
- dao
- db
- main
- pom.xml
- src
- hr-ws
- src
- main
- java
- com
- ontimize
- hr
- ws
- core
- rest
- MainRestController.java
- TestRestController.java
- UserRestController.java
- rest
- core
- ws
- hr
- ontimize
- com
- java
- main
- pom.xml
- src
- .gitignore
- Archetype_ontimize_boot.postman_collection.json
- pom.xml
- README.md
- hr-api
Creación de la interfaz del servicio
Con el DAO preparado, es necesario crear una interfaz pública para que sea implementada por un servicio. Esta interfaz estará en el módulo hr-api, la cual tendrá, de momento, los métodos CRUD (Create, Read, Update, Delete) básicos para el DAO que se ha creado. Estos métodos tendrán una raíz común que decidiremos según el DAO al que pertenezcan (en este caso, candidate) y un sufijo que dependerá de la acción que se vaya a realizar (Query, Insert, Update, Delete).
ICandidateService.java
- hr
- hr-api
- src
- main
- java
- com
- ontimize
- hr
- api
- core
- service
- ICandidateService.java
- IUserService.java
- service
- core
- api
- hr
- ontimize
- com
- java
- main
- pom.xml
- src
- hr-boot
- src
- main
- java
- com
- ontimize
- hr
- ServerApplication.java
- hr
- ontimize
- com
- resources
- application.yml
- java
- main
- pom.xml
- src
- hr-model
- src
- main
- db
- templateDB.script
- templateDB.txt
- java
- com
- ontimize
- hr
- model
- core
- dao
- CandidateDao.java
- UserDao.java
- UserRoleDao.java
- service
- UserService.java
- dao
- core
- model
- hr
- ontimize
- com
- resources
- dao
- CandidateDao.xml
- placeholders.properties
- RoleDao.xml
- RoleServerPermissionDao.xml
- ServerPermissionDao.xml
- UserDao.xml
- UserRoleDao.xml
- dao
- db
- main
- pom.xml
- src
- hr-ws
- src
- main
- java
- com
- ontimize
- hr
- ws
- core
- rest
- MainRestController.java
- TestRestController.java
- UserRestController.java
- rest
- core
- ws
- hr
- ontimize
- com
- java
- main
- pom.xml
- src
- .gitignore
- Archetype_ontimize_boot.postman_collection.json
- pom.xml
- README.md
- hr-api
Creación del servicio
A continuación, debemos crear un servicio que implemente la interfaz que hemos creado. En este caso, estará ubicada en hr-model, dentro del paquete service. Esta clase tendrá la anotación @Service
con el valor Candidate, para indicar que se trata del servicio de candidatos, y la anotación @Lazy
, que permite que los servicios se inicien cuando son requeridos y no durante el arranque. Para el empleo de los DAO, deberán llevar la anotación @Autowired
, que permite que los DAO se enlacen correctamente a las variables donde las hemos definido, evitando el uso de métodos getter y setter.
CandidateService.java
- hr
- hr-api
- src
- main
- java
- com
- ontimize
- hr
- api
- core
- service
- ICandidateService.java
- IUserService.java
- service
- core
- api
- hr
- ontimize
- com
- java
- main
- pom.xml
- src
- hr-boot
- src
- main
- java
- com
- ontimize
- hr
- ServerApplication.java
- hr
- ontimize
- com
- resources
- application.yml
- java
- main
- pom.xml
- src
- hr-model
- src
- main
- db
- templateDB.script
- templateDB.txt
- java
- com
- ontimize
- hr
- model
- core
- dao
- CandidateDao.java
- UserDao.java
- UserRoleDao.java
- service
- CandidateService.java
- UserService.java
- dao
- core
- model
- hr
- ontimize
- com
- resources
- dao
- CandidateDao.xml
- placeholders.properties
- RoleDao.xml
- RoleServerPermissionDao.xml
- ServerPermissionDao.xml
- UserDao.xml
- UserRoleDao.xml
- dao
- db
- main
- pom.xml
- src
- hr-ws
- src
- main
- java
- com
- ontimize
- hr
- ws
- core
- rest
- MainRestController.java
- TestRestController.java
- UserRestController.java
- rest
- core
- ws
- hr
- ontimize
- com
- java
- main
- pom.xml
- src
- .gitignore
- Archetype_ontimize_boot.postman_collection.json
- pom.xml
- README.md
- hr-api
Creación del controlador
Una vez tengamos el DAO creado, su interfaz y el servicio que implemente dicha interfaz, crearemos el controlador REST para que responda a las peticiones que reciba el servidor. Los controladores se ubicarán en el módulo hr-ws.
La anotación @RestController
indica que esta clase trabaja como un controlador, que responderá a las peticiones cuya URL tenga el path indicado en la anotación @RequestMapping
(en este caso, candidates).
CandidateRestController.java
- hr
- hr-api
- src
- main
- java
- com
- ontimize
- hr
- api
- core
- service
- ICandidateService.java
- IUserService.java
- service
- core
- api
- hr
- ontimize
- com
- java
- main
- pom.xml
- src
- hr-boot
- src
- main
- java
- com
- ontimize
- hr
- ServerApplication.java
- hr
- ontimize
- com
- resources
- application.yml
- java
- main
- pom.xml
- src
- hr-model
- src
- main
- db
- templateDB.script
- templateDB.txt
- java
- com
- ontimize
- hr
- model
- core
- dao
- CandidateDao.java
- UserDao.java
- UserRoleDao.java
- service
- CandidateService.java
- UserService.java
- dao
- core
- model
- hr
- ontimize
- com
- resources
- dao
- CandidateDao.xml
- placeholders.properties
- RoleDao.xml
- RoleServerPermissionDao.xml
- ServerPermissionDao.xml
- UserDao.xml
- UserRoleDao.xml
- dao
- db
- main
- pom.xml
- src
- hr-ws
- src
- main
- java
- com
- ontimize
- hr
- ws
- core
- rest
- CandidateRestController.java
- MainRestController.java
- TestRestController.java
- UserRestController.java
- rest
- core
- ws
- hr
- ontimize
- com
- java
- main
- pom.xml
- src
- .gitignore
- Archetype_ontimize_boot.postman_collection.json
- pom.xml
- README.md
- hr-api
Ahora ya podemos utilizar una aplicación como Postman para ejecutar diferentes peticiones REST a nuestro proyecto.
Lanzar la Aplicación
Para lanzar la aplicación, tenemos 2 formas diferentes de hacerlo, la primera mediante Maven y la segunda a través del código de la aplicación (recomendado).
Maven
Abrimos nuevamente la ventana de Edit Configurations… y añadimos una configuración nueva.
Para lanzar la aplicación, procederemos de la misma forma que para lanzar la base de datos.
Método de lanzamiento alternativo
Se puede lanzar también si abrimos la ventana de “Execute Maven goal”, especificamos el módulo sobre el que tenemos que ejecutar el comando Maven (en este caso, hr-boot) y ejecutamos:
mvn spring-boot:run
Código de la aplicación (Recomendado)
Buscamos la clase ServerApplication.java que se encuentra dentro del módulo hr-boot y en el método main hacemos clic en el triángulo verde y a continuación, clic en Debug ‘ServerAplplicat….main(). Esto permitirá lanzar el código en modo Debug, útil para seguir las instrucciones que se van ejecutando para poder detectar la solución de posibles errores que se produzcan.
- hr
- hr-api
- src
- main
- java
- com
- ontimize
- hr
- api
- core
- service
- ICandidateService.java
- IUserService.java
- service
- core
- api
- hr
- ontimize
- com
- java
- main
- pom.xml
- src
- hr-boot
- src
- main
- java
- com
- ontimize
- hr
- ServerApplication.java
- hr
- ontimize
- com
- resources
- application.yml
- java
- main
- pom.xml
- src
- hr-model
- src
- main
- db
- templateDB.script
- templateDB.txt
- java
- com
- ontimize
- hr
- model
- core
- dao
- CandidateDao.java
- UserDao.java
- UserRoleDao.java
- service
- CandidateService.java
- UserService.java
- dao
- core
- model
- hr
- ontimize
- com
- resources
- dao
- CandidateDao.xml
- placeholders.properties
- RoleDao.xml
- RoleServerPermissionDao.xml
- ServerPermissionDao.xml
- UserDao.xml
- UserRoleDao.xml
- dao
- db
- main
- pom.xml
- src
- hr-ws
- src
- main
- java
- com
- ontimize
- hr
- ws
- core
- rest
- CandidateRestController.java
- MainRestController.java
- TestRestController.java
- UserRestController.java
- rest
- core
- ws
- hr
- ontimize
- com
- java
- main
- pom.xml
- src
- .gitignore
- Archetype_ontimize_boot.postman_collection.json
- pom.xml
- README.md
- hr-api
Usar las peticiones REST
Las peticiones contienen la siguiente estructura:
localhost:33333/candidates/candidate
Elemento | Significado |
---|---|
localhost:33333 | Indica el host |
/candidates | Indica el controlador que se va a consultar |
/candidate | Indica el método de la interfaz del controlador al que accederá ese servicio (este método está implementado en el servicio, y no tiene los sufijos Query, Insert, Update, Delete) |
Los tipos de peticiones sólo pueden ser: GET, POST, PUT, DELETE.
A continuación, se muestran ejemplos de peticiones para los candidatos (CANDIDATES).
La autorización que se usa para estas peticiones es de tipo BASIC, cuyas credenciales son demo como usuario y demouser como contraseña.
Tipo petición | Tipo de consulta | Petición | Método del servicio | Cuerpo petición |
---|---|---|---|---|
GET | query | localhost:33333/candidates/candidate?columns=ID,NAME,SURNAME | candidateQuery | No tiene cuerpo de petición porque es de tipo GET |
POST | query | localhost:33333/candidates/candidate/search | candidateQuery | |
insert | localhost:33333/candidates/candidate | candidateInsert | ||
PUT | update | localhost:33333/candidates/candidate | candidateUpdate | |
DELETE | delete | localhost:33333/candidates/candidate | candidateDelete |