La mayoría de las aplicaciones web se conectan a una base de datos para almacenar y mostrar datos. Para interactuar con una base de datos, necesitamos un sistema gestor de base de datos como MySQL y una librería de persistencia como Hibernate. En este tutorial, aprenderás cómo usar Spring Data y JPA para facilitar esta tarea y mejorar la seguridad y eficiencia de tu aplicación Java.
¿Qué es Spring Data y JPA?
Spring Data es un módulo que facilita la interacción con la base de datos, eliminando la necesidad de tratar directamente con la base de datos, abrir y cerrar conexiones, construir sentencias adecuadas, etc. Además, Spring Data ayuda a prevenir vulnerabilidades de SQL Injection al sanitizar los parámetros de las sentencias por nosotros.
Por otro lado, JPA (Java Persistence API) es una especificación de Java que describe la gestión de bases de datos relacionales a través de objetos Java, lo que facilita la creación, lectura, actualización y eliminación de registros en la base de datos.
Configurando Spring Data y JPA en tu proyecto
Para añadir Spring Data y JPA a tu proyecto, Spring proporciona un starter con todas las dependencias necesarias. Deberás añadir la siguiente dependencia a tu archivo pom.xml:
<!-- Spring Data y JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Además, si quieres conectar con una base de datos como MySQL, necesitarás añadir la dependencia correspondiente para el conector:
<!-- Conector MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
Configurando las propiedades de la base de datos
Después de añadir las dependencias necesarias, necesitarás configurar algunas propiedades en tu archivo application.properties. Estas propiedades incluyen la URL de la base de datos, el nombre de usuario, la contraseña y otras propiedades específicas de JPA.
#Conexión con bbdd
spring.datasource.url=DB_URL
spring.datasource.username=DB_USERNAME
spring.datasource.password=DB_PASSWORD
spring.datasource.driver_class=com.mysql.jdbc.Driver
#Propiedades JPA
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
#Disables Hibernate generates key from hibernate_sequence table
spring.jpa.hibernate.use-new-id-generator-mappings=false
logging.level.org.hibernate.SQL=DEBUG
Creando el modelo de datos
Una vez configuradas las propiedades de la base de datos, el siguiente paso es crear el modelo de datos. En este tutorial, crearemos un esquema sencillo con dos tablas comunes en la mayoría de las aplicaciones: usuarios y roles.
Creando repositorios JPA
Después de crear el modelo de datos, necesitarás crear repositorios JPA para realizar operaciones con la base de datos. Los repositorios JPA son interfaces que extenden a JpaRepository y te permiten realizar operaciones básicas como findAll, findById, save, update, etc. También puedes crear nuevos métodos que realizarán la consulta en función del nombre del método.
@Repository
public interface UserAccountRepository extends JpaRepository<UserAccount, Integer>{
}
Usando los repositorios JPA
Una vez que tienes tus repositorios JPA, puedes usarlos en tus controladores para interactuar con la base de datos. Por ejemplo, puedes usar el método findAll para obtener una lista de todos los usuarios:
@Autowired
private UserAccountRepository userAccountRepository;
@GetMapping("/hello")
public List hello() {
return userAccountRepository.findAll();
}
Consideraciones de seguridad
Es importante tener en cuenta que no es recomendable usar entidades JPA como objetos que devuelven nuestros servicios. Esto puede exponer información sensible y crear vulnerabilidades de seguridad. En su lugar, es una buena práctica usar objetos de transferencia de datos (DTOs) que son representaciones de una serie de atributos de un POJO o incluso pueden contener información de varias tablas.
Referencias
- Repositorio GitHub del proyecto
- Documentación oficial de Spring Data JPA
- Documentación oficial de Hibernate
- Guía de Spring Boot para acceder a datos con JPA
- Documentación oficial de MySQL Connector/J
- Integrando Open API en tu Proyecto Spring Boot: Una Guía Paso a Paso
- Mejorando la Seguridad de tus Servicios REST con Spring Boot y JWT