Hoy vamos a implementar una parte pequeña pero importante de nuestra aplicación: crearemos entidades y repositorios. Ampliamos la funcionalidad del proyecto añadiendo trabajo con la base de datos. Durante el proceso iremos paso a paso revisando:
- Creación de la entidad — la base del trabajo con JPA. Usaremos anotaciones como
@Entity,@Id,@GeneratedValuey otras. - Configuración de los repositorios. Conectaremos
JpaRepositoryy usaremos sus métodos estándar. - Trabajo práctico con operaciones CRUD. Guardaremos, actualizaremos, eliminaremos y leeremos datos desde la base.
1. Planteamiento de la tarea
Imagínate que trabajas en un sistema de gestión del catálogo de una biblioteca. En este ejemplo didáctico crearemos la entidad Book, que representará un libro, y proporcionaremos operaciones básicas para interactuar con ella a través de la base de datos. Nuestras tareas:
- Crear la entidad
Bookcon los camposid,title,authorypublishedYear. - Implementar un repositorio para ella.
- Escribir métodos para guardar y obtener datos.
2. Creación de la entidad
Empezamos creando la clase-entidad Book. Recordemos la regla principal: las entidades mapean tablas en la base de datos. Cada campo de la clase se convierte en una columna de la tabla. Para ello usaremos las anotaciones @Entity, @Id, @GeneratedValue, @Column.
Abre el proyecto y añade la nueva clase Book en el paquete entity.
package com.example.library.entity;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Column;
@Entity
public class Book {
@Id // Indicamos la clave primaria
@GeneratedValue(strategy = GenerationType.IDENTITY) // Generación automática del ID
private Long id;
@Column(nullable = false) // Campo obligatorio
private String title;
@Column(nullable = false)
private String author;
@Column(name = "published_year") // Indicamos el nombre de la columna en la base
private Integer publishedYear;
// Constructores, getters, setters
public Book() {
}
public Book(String title, String author, Integer publishedYear) {
this.title = title;
this.author = author;
this.publishedYear = publishedYear;
}
// Getters y setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Integer getPublishedYear() {
return publishedYear;
}
public void setPublishedYear(Integer publishedYear) {
this.publishedYear = publishedYear;
}
}
En el código:
@Entity— indica que la clase es una entidad y se mapeará a una tabla en la base.@Id— campo que será usado como clave primaria de la tabla.@GeneratedValue(strategy = GenerationType.IDENTITY)— generación automática del ID para los nuevos registros.@Column— configuración de las columnas de la tabla; añadimosnullable = falsepara hacer el campo obligatorio.
Ahora que nuestra entidad está lista, ¡vamos al siguiente paso!
3. Creación del repositorio
El repositorio se encarga de las operaciones con la base de datos. En Spring Data JPA se usan interfaces, como JpaRepository. Crearemos la interfaz BookRepository y usaremos los métodos estándar.
Añade un nuevo interfaz en el paquete repository.
package com.example.library.repository;
import com.example.library.entity.Book;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface BookRepository extends JpaRepository<Book, Long> {
// Aquí se pueden añadir métodos personalizados si hacen falta
}
JpaRepository<Book, Long>— el tipoBookindica nuestra entidad, yLongel tipo de su identificador.- La anotación
@Repositoryle dice a Spring que este componente trabaja con la base de datos.
Métodos incorporados de JpaRepository
Al heredar de JpaRepository, ya podemos usar métodos como:
save()— para guardar el objeto.findById()— para buscar un objeto por ID.findAll()— para obtener la lista de todos los objetos.deleteById()— para eliminar el objeto por ID.
4. Trabajo práctico: operaciones CRUD
Ahora vamos a probar el funcionamiento de las entidades y repositorios creados. Para ello crearemos un servicio básico y añadiremos datos de prueba.
Añade un nuevo servicio en el paquete service.
package com.example.library.service;
import com.example.library.entity.Book;
import com.example.library.repository.BookRepository;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class BookService {
private final BookRepository bookRepository;
public BookService(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
// Añadir libro
public Book addBook(Book book) {
return bookRepository.save(book);
}
// Obtener todos los libros
public List<Book> getAllBooks() {
return bookRepository.findAll();
}
// Buscar libro por ID
public Optional<Book> getBookById(Long id) {
return bookRepository.findById(id);
}
// Eliminar libro por ID
public void deleteBook(Long id) {
bookRepository.deleteById(id);
}
}
Ahora añadimos un controlador para probar la funcionalidad mediante peticiones HTTP.
package com.example.library.controller;
import com.example.library.entity.Book;
import com.example.library.service.BookService;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/books")
public class BookController {
private final BookService bookService;
public BookController(BookService bookService) {
this.bookService = bookService;
}
@PostMapping
public Book addBook(@RequestBody Book book) {
return bookService.addBook(book);
}
@GetMapping
public List<Book> getAllBooks() {
return bookService.getAllBooks();
}
@GetMapping("/{id}")
public Book getBookById(@PathVariable Long id) {
return bookService.getBookById(id).orElseThrow(() -> new RuntimeException("Book not found"));
}
@DeleteMapping("/{id}")
public void deleteBook(@PathVariable Long id) {
bookService.deleteBook(id);
}
}
Para comprobarlo puedes enviar peticiones con Postman u otra herramienta similar.
5. Ejecución y verificación
- Arranca la aplicación en tu servidor local.
- Revisa la base de datos para asegurarte de que la tabla
bookse ha creado. - Usa estas peticiones:
POST /bookscon el cuerpo:{ "title": "Spring in Action", "author": "Craig Walls", "publishedYear": 2021 }GET /books— para obtener todos los libros.GET /books/{id}— para obtener un libro por ID.DELETE /books/{id}— para eliminar un libro.
¡Felicidades! Has creado tu primera entidad y la has conectado a la base con el mínimo esfuerzo. Ahora tu código está más cerca del entorno de producción real.
GO TO FULL VERSION