En este lab vamos a generar un proyecto con spring Initializr y a crear una API REST con JPA.
- Haz un fork de este repositorio en tu cuenta de GitHub.
- Clona el repositorio en tu máquina local.
- Ir a Spring Initializr
- Añade las tres dependencias de la siguiente lista:
- Spring Web
- Spring Data JPA
- MySQL Driver
- Genera el proyecto y descomprime el zip en este proyecto.
- Abre el proyecto en IntelliJ IDEA.
- Abre MySQL Workbench y crea una base de datos llamada
lab_jpa. Botón derecho enSchemasyCreate Schema.... - Crea una tabla llamada
personcon los siguientes campos:- id (int, primary key, auto increment)
- name (varchar(255))
- age (int)
- Abre el archivo
src/main/resources/application.propertiesy añade la siguiente configuración:
spring.datasource.url=jdbc:mysql://localhost:3306/lab_jpa
spring.datasource.username=root
spring.datasource.password=admin- Cambia el usuario y la contraseña según tu configuración de MySQL.
- Cambia el puerto si el tuyo no es el 3306.
Testea la conexión a la base de datos ejecutando el archivo principal dentro de la carpeta java/com.example.demo/DemoApplication.java (el nombre variará según lo que hayas puesto en initialzr). Si todo está bien, la terminal no debería parar y no debería dar errores de conexión. Si da errores, revisa la configuración de la base de datos y el archivo application.properties.
- Dentro del paquete principal
com.example.democrea un nuevo paquete llamadomodels. - Dentro de
modelscrea una clase llamadaPersoncon los siguientes atributos:- id (Long, auto increment, primary key)
- name (String, not null)
- age (int, not null)
Recuerda que esto es una entidad, por tanto deberás usar las anotaciones
@Entity,@Table,@Id,@GeneratedValuey@Columnde JPA.
- Añade también el constructor vacío y el constructor con todos los atributos (el id no es necesario).
- Añade los getters y setters para todos los atributos.
- Añade el método
toString()para poder ver los datos de la persona al imprimirla.
- Dentro del paquete
com.example.democrea un nuevo paquete llamadorepositories. - Dentro de
repositoriescrea una interfaz llamadaPersonRepositoryque extienda deJpaRepository<Person, Long>. - No es necesario añadir nada más de momento, ya que JpaRepository ya tiene todos los métodos necesarios para hacer operaciones CRUD (Create, Read, Update, Delete) sobre la entidad
Person.
- Dentro de la carpeta de test
src/test/java/com.example.democrea un nuevo paquete llamadorepositoriesy una clase llamadaPersonRepositoryTest. - En esta clase vamos a testear el repositorio
PersonRepositoryusando JUnit. - Añade la anotación
@SpringBootTesta la clase para que se inicie el contexto de Spring al ejecutar los tests.
- Crea un método llamado
testSave()que haga lo siguiente:- Crea una instancia de
Personcon los datos que quieras (name, age). - Guarda la persona en el repositorio usando el método
save(). - Busca la persona en el repositorio usando el método
findById()y comprueba que no es nulo. - Imprime la persona por consola.
- Comprueba que el id de la persona no es nulo con una aserción.
- Comprueba que el nombre de la persona es "John Doe" con una aserción.
- Comprueba que la edad de la persona es 30 con una aserción.
También puedes comprobar en mySQL que la persona se ha guardado correctamente en la tabla
person. Ten en cuenta que no lo estamos borrando así que te va a crear una fila en la tabla cada vez que lo ejecutes.
- Crea una instancia de
- Crea un método llamado
testFindAll()que haga lo siguiente:- Crea una lista de personas con los datos que quieras (name, age).
- Guarda las personas en el repositorio usando el método
saveAll(). - Busca todas las personas en el repositorio usando el método
findAll()y comprueba que no es nulo. - Imprime la lista de personas por consola.
- Comprueba que el nombre de la primera persona es "Ditto" (o el nombre que pusieras) con una aserción.
- Comprueba que la edad de la primera persona es 30 con una aserción.
- Crea un método llamado
testDelete()que haga lo siguiente:- Crea una instancia de
Personcon los datos que quieras (name, age). - Guarda la persona en el repositorio usando el método
save(). - Busca la persona en el repositorio usando el método
findById()y comprueba que no es nulo. - Borra la persona en el repositorio usando el método
delete(). - Busca la persona en el repositorio usando el método
findById()y comprueba que es nulo. - Imprime la persona por consola.
- Comprueba que el id de la persona es nulo con una aserción.
- Crea una instancia de
- Crea un método llamado
testUpdate()que haga lo siguiente:- Crea una instancia de
Personcon los datos que quieras (name, age). - Guarda la persona en el repositorio usando el método
save(). - Busca la persona en el repositorio usando el método
findById()y comprueba que no es nulo. - Cambia el nombre y la edad de la persona.
- Guarda la persona en el repositorio usando el método
save(). - Busca la persona en el repositorio usando el método
findById()y comprueba que no es nulo. - Imprime la persona por consola.
- Comprueba que el id de la persona no es nulo con una aserción.
- Comprueba que el nombre de la persona es "Nuevo nombre" (o el nombre que pusieras) con una aserción.
- Comprueba que la edad de la persona es 30 (o lo que pusieras en la nueva edad) con una aserción.
- Crea una instancia de
Puedes utilizar workbench en todo momento para hacer la comprobación manual.
- Crea un nuevo paquete llamado
controllersy dentro de este crea una clase llamadaPersonController.
- Añade la anotación
@RestControllera la clase. - Añade un endpoint para obtener una string con el mensaje "Hello World". Usa la anotación
@GetMapping("/api/hello")para que sea un endpoint REST. - Añade un método
getAll()que devuelva todas las personas en formato JSON. Usa la anotación@GetMapping("/api/persons")para que sea un endpoint REST.