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

propiedadfunción
spring.datasource.urlconexión a base de datos
spring.datasource.usernameusuario
spring.datasource.passwordcontraseña
spring.jpa.hibernate.ddl-autocrea o actualiza tablas
spring.jpa.show-sqlmuestra 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ónfunción
@Entityindica que es una tabla
@Idclave primaria
@GeneratedValuegenera 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ónanotació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...