Curso de Spring Boot
En casi todas las aplicaciones necesitamos guardar datos en una base de datos.
Spring Boot facilita mucho esta tarea gracias a:
Spring Data JPA
Con esto podremos:
- guardar datos
- consultar datos
- actualizar datos
- eliminar datos
sin escribir mucho código SQL.
6.1 Qué es JPA
JPA significa:
Java Persistence API
Es una especificación de Java para trabajar con bases de datos usando objetos.
En lugar de escribir SQL directamente, usamos clases Java.
Ejemplo:
Tabla en base de datos:
1users
Clase Java equivalente:
1@Entity 2public class User { 3 4 private Long id; 5 private String name; 6 7}
6.2 Qué es Hibernate
JPA es solo una especificación.
La implementación más usada es:
Hibernate
Spring Boot usa Hibernate automáticamente cuando usamos JPA.
6.3 Añadir dependencia JPA
En pom.xml añadimos:
1<dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-data-jpa</artifactId> 4</dependency>
También necesitamos el driver de la base de datos.
Ejemplo para PostgreSQL:
1<dependency> 2 <groupId>org.postgresql</groupId> 3 <artifactId>postgresql</artifactId> 4</dependency>
6.4 Configurar la base de datos
Configuración en:
application.properties
Ejemplo:
1spring.datasource.url=jdbc:postgresql://localhost:5432/mydb 2spring.datasource.username=postgres 3spring.datasource.password=1234 4 5spring.jpa.hibernate.ddl-auto=update 6spring.jpa.show-sql=true
Explicación
| propiedad | función |
|---|---|
| spring.datasource.url | conexión a base de datos |
| spring.datasource.username | usuario |
| spring.datasource.password | contraseña |
| spring.jpa.hibernate.ddl-auto | crea o actualiza tablas |
| spring.jpa.show-sql | muestra SQL en consola |
6.5 Crear una Entity
Una Entity representa una tabla.
Ejemplo
1@Entity 2public class User { 3 4 @Id 5 @GeneratedValue 6 private Long id; 7 8 private String name; 9 10 private String email; 11 12}
Anotaciones importantes
| anotación | función |
|---|---|
@Entity | indica que es una tabla |
@Id | clave primaria |
@GeneratedValue | genera ID automáticamente |
6.6 Crear un Repository
Un repository permite acceder a la base de datos.
Spring Boot puede generar automáticamente el código.
Ejemplo
1@Repository 2public interface UserRepository extends JpaRepository<User, Long> { 3 4}
Esto ya crea automáticamente:
1save() 2findAll() 3findById() 4deleteById() 5count()
Sin escribir código.
6.7 Guardar datos
Ejemplo en un service.
1@Service 2public class UserService { 3 4 private final UserRepository repository; 5 6 public UserService(UserRepository repository) { 7 this.repository = repository; 8 } 9 10 public User createUser(User user) { 11 return repository.save(user); 12 } 13 14}
6.8 Obtener datos
Ejemplo:
1public List<User> getUsers() { 2 return repository.findAll(); 3}
6.9 Buscar por ID
1public Optional<User> getUser(Long id) { 2 return repository.findById(id); 3}
Optional indica que el usuario puede existir o no.
6.10 Eliminar datos
1public void deleteUser(Long id) { 2 repository.deleteById(id); 3}
6.11 Controller completo
1@RestController 2@RequestMapping("/users") 3public class UserController { 4 5 private final UserService service; 6 7 public UserController(UserService service) { 8 this.service = service; 9 } 10 11 @GetMapping 12 public List<User> getUsers() { 13 return service.getUsers(); 14 } 15 16 @PostMapping 17 public User createUser(@RequestBody User user) { 18 return service.createUser(user); 19 } 20 21}
6.12 Crear consultas automáticas
Spring Data JPA puede generar consultas a partir del nombre del método.
Ejemplo
1List<User> findByName(String name);
Spring genera automáticamente:
1SELECT * FROM users WHERE name = ?
Más ejemplos
1findByEmail(String email) 2 3findByNameAndEmail(String name, String email) 4 5findByNameContaining(String name)
6.13 Paginación
Si hay muchos datos, conviene usar paginación.
Ejemplo:
1Page<User> findAll(Pageable pageable);
Uso:
1PageRequest.of(0, 10)
Esto devuelve 10 registros.
6.14 Relaciones entre entidades
Las tablas suelen estar relacionadas.
Ejemplo:
users
orders
Un usuario puede tener muchos pedidos.
Ejemplo en JPA
1@Entity 2public class User { 3 4 @Id 5 @GeneratedValue 6 private Long id; 7 8 private String name; 9 10 @OneToMany 11 private List<Order> orders; 12 13}
6.15 Tipos de relaciones
| relación | anotación |
|---|---|
| uno a uno | @OneToOne |
| uno a muchos | @OneToMany |
| muchos a uno | @ManyToOne |
| muchos a muchos | @ManyToMany |
6.16 Ejemplo relación ManyToOne
1@Entity 2public class Order { 3 4 @Id 5 @GeneratedValue 6 private Long id; 7 8 @ManyToOne 9 private User user; 10 11}
Un usuario puede tener muchos pedidos.
6.17 Qué hace Hibernate automáticamente
Hibernate convierte las entidades en tablas.
Ejemplo:
Clase:
1@Entity 2class User
Tabla generada:
1users
Campos:
1id 2name 3email
- Loading...