domingo, 27 de agosto de 2017

Web Service con Spring Boot, JPA y H2

Bueno, vamos a dar un paso más en el ejemplo de los web services con spring boot. Ya los hicimos básico, ahora lo haremos obteniendo los datos de BBDD. Y además no de una BBDD relacional corriente, sino H2 que será almacenada en memoria.

Empezamos con la configuración básica y es que debemos añadir las librerias necesarias para el uso de JPA y H2.

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
 <groupId>com.h2database</groupId>
 <artifactId>h2</artifactId>
</dependency>

Para este ejemplo añadiremos una pequeña configuración extra, la parte de la configuración a BBDD la realizaremos directamente sobre el fichero 'application.properties'. Sin necesidad de crear un fichero 'persistence.xml'. La parte más importante es la correspondiente a la propiedad 'javax.persistence.sql-load-script-source', que nos permite indicar un fichero SQL que ejecutar al levantar la BBDD.


## DATASOURCE PROPERTIES

spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.platform=org.hibernate.dialect.H2Dialect

## JPA PROPERTIES

spring.jpa.show-sql=true
#spring.jpa.database=MYSQL
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.javax.persistence.sharedCache.mode=DISABLE_SELECTIVE
spring.jpa.properties.javax.persistence.schema-generation.database.action=drop-and-create
spring.jpa.properties.javax.persistence.sql-load-script-source=script/data.sql

Ahora crearemos las clases JPA que serán el reflejo de las entidades de BBDD. Para nuestro ejemplo crearemos una clase 'Book' que contendrá información básica de libros y una clase 'GenericEntity' que nos servirá para aglutinar aquellos atributos que serán iguales en todas las futuras entidades, como son el campo clave y los campos de auditoría. Todo ello gracias a la anotación 'MappedSuperclass'. Sobre como hacer la auditoría ya hicimos un post anteriormente, aquí.

El siguiente paso es crear el DAO o Repository que nos permita acceder a los datos y/o modificarlos. Para ello crearemos una clase 'BookDao' y 'GenericDao'. De esta forma tendremos clases de acceso a datos con un conjunto de métodos por defecto. La anotación '@NoRepositoryBean' indicará a Spring que no cree un proxy de acceso a datos para la interfaz, cosa que si hará con 'BookDao'.

@NoRepositoryBean
public interface GenericDao<E extends GenericEntity<K>, K extends Serializable>
  extends JpaRepository<E, K> { }
....
public interface BookDao extends GenericDao<Book, Integer> { }

Por último nos queda crear el controlador


@RestController("/book")
public class BookRestController {
 @Autowired
 private BookDao repository;
 @GetMapping
 public List<Book> findAll() {
  return repository.findAll();
 }
 @GetMapping("/{id}")
 public Book findById(@PathVariable("id") final Integer id) {
  return repository.findOne(id);
 }
}

Si arrancamos la aplicación podremos acceder a los datos por ejemplo con la siguiente consulta: http://localhost:8082/book/3


No hay comentarios:

Publicar un comentario