Spring Data REST Accediendo a Datos

Construiremos una aplicación Java con el Framework Spring que nos permita el acceso a una base de datos MySQL permitiéndonos obtener, editar, ingresar, eliminar datos almacenados en la DB, Spring Data REST combina automáticamente las funcionalidades de Spring HATEOAS y Spring Data JPA lo que nos proporciona múltiples facilidades.
 
Este tutorial hace uso de los conocimientos aprendidos en los tutoriales anteriores: Servicios RESTful con Spring y Acceso a Base de Datos MySQL con Spring JPA-Hibernate, se recomienda leerlos, mas no es absolutamente necesario.
 
Creamos nuestro proyecto como hemos aprendido en tutoriales anteriores, el archivo pom.xml será el siguiente:
 
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>tutor.programacion</groupId>
    <artifactId>SpringDataRest</artifactId>
    <version>0.0.1</version>
    <packaging>jar</packaging>
    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.0.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    
</project>

Agregamos el archivo de configuración de propiedades application.properties para configurar la conexión a la base de datos MySQL, iniciamos el servidor y creamos una BD llamada datos, editamos el archivo application.properties con los datos correspondientes para acceder a esta BD, se vería de este modo:

# Configurar la coneccion a la base de datos
spring.datasource.url = jdbc:mysql://localhost:3306/datos
spring.datasource.username = root
spring.datasource.password = 159159
spring.datasource.driverClassName = com.mysql.jdbc.Driver

# Indicar el DBMS
spring.jpa.database: MYSQL

Creamos la entidad para representar un conjunto de usuarios que almacenaremos en la tabla Usuario, utilizamos las correspondientes anotaciones JPA.

@Entity
public class Usuario implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Long id;

    @NotNull
    String nombre;

    String email;
    LocalDate creado;
}

Por simplicidad se han omitido los métodos get, set y los import, el proyecto completo se encuentra al final en un archivo descargable.
 
Para usar LocalDate de Java 8 requerimos agregar al archivo pom.xml la librería jackson-datatype-jsr310 cuando Jackson la detecte la usara automáticamente, también es posible usar Joda-Time, otra cosa que debemos hacer indicarle a JPA como tratar este tipo de datos ya que por defecto los almacena como Blob, por lo que creamos un convertidor para que los objetos LocalDate sean guardados  como sql.Date.

import java.time.LocalDate;
import java.sql.Date;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter(autoApply = true)
public class LocalDateConverter implements AttributeConverter<LocalDate, Date> {
    @Override
    public Date convertToDatabaseColumn(LocalDate entityValue) {
        return Date.valueOf(entityValue);
    }
    @Override
    public LocalDate convertToEntityAttribute(Date databaseValue) {
        return databaseValue.toLocalDate();
    }
}

Necesitamos crear un repositorio que se ocupara de las operaciones para Usuario, el mismo será una interface que hereda de PagingAndSortingRepository, en tutoriales anteriores vimos la interface CrudRepsitory, PagingAndSortingRepository la extiende agregando métodos de paginación y ordenación.

import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

@RepositoryRestResource(collectionResourceRel = "user", path = "user")
public interface UsuarioRepository extends PagingAndSortingRepository<Usuario, Long> {

    List<Usuario> findByNombre(@Param("nombre") String name);
}

Finalmente creamos la clase principal que contiene el método main el cual iniciara nuestra aplicación.

@EnableJpaRepositories
@Import(RepositoryRestMvcConfiguration.class)
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Compilamos y ejecutamos la aplicación, recordamos que el servidor MySQL debe estar corriendo y contener la base de datos correspondiente con los datos de conexión correctos, luego de ejecutar accedemos a la dirección localhost:8080 en el navegador, veremos: 

spring data rest
El enlace marcado en rojo nos permite acceder a los usuarios que se encuentren almacenados, en este momento no tenemos ninguno, también podemos indicar las opciones page, size o sort, para el número de página, el tamaño y la ordenación.

hateoas spring json
En este enlace veríamos una lista de todos los usuario en la base de datos, en la parte inferior se observan los datos de paginación como el tamaño de página, el total de elementos, el total de páginas y el número de la página actual, accediendo al enlace marcado veremos una lista de todos los enlaces de consulta creados por la interface UsuarioRepository en este ejemplo únicamente el enlace para la consulta findByNombre 
 
json hal format spring
Este enlace nos permite buscar un usuario por nombre.
 
De momento no tenemos datos por lo  que se nos dificulta probar todos las funcionalidades que tiene nuestro proyecto solo con unas cuantas líneas de código gracias a Spring Framework.
 
En el siguiente tutorial veremos como agregar, editar, buscar, eliminar datos en la BD MySQL mediante un cliente REST que programaremos utilizando JavaFX.
 

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Procesamiento de imágenes en OpenCV

Conociendo la clase cv::Mat de OpenCV

Acceso a la webcam con OpenCV