programaciÓn en java con spring framework 5 spring data jpa … · 2018-07-19 · java persistence...

Post on 17-Jun-2020

66 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5

Spring Data JPAPoblando Base de Datos

Javier Navarrete

Requerimientos de software

• Java JDK 1.8 o superior

(http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)

Comprueba la versión que tuviera con: javac –versión (línea de comandos)

• Gradle 4.1 o superior

(https://gradle.org/releases/)

Coloque Gradle en el PATH y verifique versión con: gradle –versión

• Apache Maven 3.3.1 o superior (manejador de dependencias)

(https://maven.apache.org/)

Verifique la versión de Maven que tuviese instalada con: mvn -version

Configuración de la consola H2 database• Descargue H2 console desde:

http://www.h2database.com/html/download.html

• Desde su navegador puede ingresar a:

http://192.168.10.25:8082/login.jsp

• com.h2database:h2 debe estar en el classpath.

• La ruta puede configurarse con la propiedad:

spring.h2.console.path

• Al conectarse a la base de datos verá la consola

Grails• Es un framework Grails de código abierto para JVM construido sobre Spring

Boot.

• Útil con bootstrap para inicializar datos de una base de datos.

Spring INITIALIZER

• Ir a la URL: start.spring.io

• Click en “Switch to the full version”

• Seleccionar MAVEN Project, versión 2.0 SNAPSHOT

• En las opciones marcar: • Web ProjectJava

• Persistence API (JPA)

• H2 Database

• Thymelaf (plantilla para el flujo de desarrollo)

• Actuator: en la lista Ops (para ayudar a monitorear y manejar la aplicación)

• Presione Generar Proyecto y se descargará un archivo ZIP de acuerdo a las opciones seleccionadas.

Creando el proyecto con usando el IDE IntelliJNOTA: con la versión Ultimate de IntelliJ no es necesario usar la webstart.spring.io pues lo tiene incorporado. La ventaja de hacerlo es que este ZIPgenerado se puede usar en cualquier IDE.

• Descomprimir el archivo ZIP generado por Spring Initializer en una carpeta de trabajo.

• En el IDE abrir el proyecto nuevo usando un recurso existente.

• Importar el ZIP desde la carpeta donde se haya el archivo POM del proyecto.

• Seleccionar “Importar el proyecto desde un modelo externo”.

• Luego marque el check que dice “Importar proyectos mavenautomáticamente”.

• Seleccione la versión 1.8 del SDK.

Proyecto generado. Archivo POM• Se puede ver que el proyecto tiene el Parent de SpringBoot y todas las

dependencias que se marcaron en start.spring.io

• En el proyecto no se incluye Hibernate pero este será un child de JPA (starter). De la misma manera con thymeleaf y starter web que usarán Tomcat sin que este se haya especificado. Todo es en background mediante Spring boot. (Ahorro de tiempo).

• En la vista de dependencias del starter-data-jpa se pueden ver:

Ejecución de la aplicación• Ir a la opción Terminal de la parte inferior izquierda de IntelliJ.

• Desde la ruta donde se encuentre Maven ejecutamos spring-boot:run

• Luego de ejecutado el proyecto veremos que automáticamente se levantó Tomcat en el puerto 8080 (default).

Java Persistence API - JPA

• Es en nexo que existe entre los objetos Java y como se almacenan en una base de datos relacional. Existen diversos paradigmas por lo que se conoce como ORM (Object Relationship Management).

• JPA 2.0: Proviene de la especificación JSR 317. Aprobada en diciembre 2009.

• JPA 2.1: Proviene de la especificación JSR 338. Aprobada en diciembre 2013. Introduce queries con stored procedures, convertidores de tipo customizados, entre otros. Hibernate domina el mercado con más del 70%

• Versión actual Hibernate 5. Independencia de la base de datos.

• Extendiendo Spring Data JPA (interface) tendremos un entorno para CRUD listo con métodos para buscar, grabar objetos, entre otros. Esto se encargará del manejo de transacciones y obtener conexiones a bases de datos.

Ejemplo con relación muchos a muchos• Generamos un proyecto maven con Spring-boot con soporte para JPA

y H2

• Creamos dos clases: Alumno y Curso con los atributos básicos.

• Alumnos y cursos: un alumno puede estar inscrito en uno o varios cursos y un curso puede tener uno o mucho alumnos. Es decir, tenemos dos POJOS (objetos java) relacionados entre sí.

• Si en Alumno definimos la relación:

• Y en Curso definimos:

• Levantamos la base de datos H2 (línea de comandos)

• Y en el browser escribimos: http://localhost:8080/h2-console/

@ManyToMany(mappedBy = "alumnos")

private Set<Curso> cursos = new HashSet<>();

@ManyToMany

@JoinTable(name = "alumno_curso", joinColumns = @JoinColumn(name

= "curso_id"),

inverseJoinColumns = @JoinColumn(name = "alumno_id"))

private Set<Alumno> alumnos = new HashSet<>();

Ejemplo con relación muchos a muchos• En JDBC debe decir: jdbc:h2:mem:testdb• En el archivo application.properties coloque:

• Veremos que automáticamente se han creado las tablas Alumno y Curso yautomáticamente se ha creado la tabla que resuelve la relaciónALUMNO_CURSO en la base de datos testdb de H2.

spring.h2.console.enabled=true

Implementación de llaves únicas – Buena práctica

• Los clases Alumno y Curso tiene un ID definido como un enterocorrelativo. Una tabla hash recibe una clave y devuelve un índice paraacceder a determinada posición de la tabla pero si se recibe el mismoíndice para dos claves distintas se produce una colisión.

• En la clase Alumno (con IntelliJ) presionamos click derecho opciónGENERATEEquals and Hash code, Next.

Implementación de llaves únicas• Seleccionamos solo el ID de tipo Long.

• Finalmente tendremos la implementación de los hash codes and equals en forma automática insertada en el código Java.

• Podemos añadir con la opción GENERATE, toString a cada POJO.

• Añadimos una clase interface a Alumno:

@Override

public String toString() {

return "Curso{" +

"id=" + id +

", nombre='" + nombre + '\'' +

", descripcion='" + publisher + '\'' +

", alumnos=" + alumnos +

'}';

}

Extensión del Spring data CRUD repository

public interface AlumnoRepository

extends CrudRepository<Alumno, Long>

{

}

• Si examinamos la implementación de CrudRepository (CTRL+B en IntelliJ) veremos los métodos disponibles:

Hacemos lo mismo con Curso y con ello spring data enlazará ambos objetos al contexto spring para que estén disponibles para su uso.

Inicializando datos mediante un bootstrap• Creamos un nuevo paquete llamado bootstrap y dentro de él una clase y la

configuramos para Spring con los siguientes datos:• Implementamos ApplicationListener con ContextRefreshEvent.

• Anotamos la clase Devbootstrap como un Componente Spring para convertirlo en un Spring Bean para ser conectado al contexto spring.

• Para usar las interfaces, las declaramos en nuestra clase.

• Pero para lograr el deseado auto-wiring de Spring con la injeción de dependencias de Spring es necesario generar (con el IDE) un Constructor para que estas piezas sean inyectadas.

Inicializando datos mediante un bootstrap• Método constructor:

• Con lo hecho, esta clase será creada y manejada por spring framework y los repositorios de Alumno y Curso tendrán una implementación de Spring Data JPA y se auto enlazarán (autowired).

• Ingresamos a Chrome para comprobar la carga en la base de datos H2 y hacemos un Select de la tabla Alumno:

http://localhost:8080/h2-console/

Añadiendo un nuevo atributo y poblando la base de datos

• Sobre el ejemplo, añadimos el atributo Nivel (Pj: Inicial, Secundaria) a la clase Alumno.

• Añadimos en el modelo la nueva clase con sus atributos, getters y setters.

Añadiendo un nuevo atributo y poblando la base de datos

• Añadimos la clase Interface correspondiente extendiendo CrudRepository.

• Añadimos el atributo Nivel en el Alumno:

Añadiendo un nuevo atributo y poblando la base de datos

• Finalmente modificamos la clase Devbootstrap para llenar datos del nuevo atributo.

Añadiendo un nuevo atributo y poblando la base de datos

• Ejecutamos la consola de H2 en el navegador para comprobar resultados.

• La tabla nivel ha sido creada automáticamente y ha sido poblada con un registro.

top related