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

20
PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA Poblando Base de Datos Javier Navarrete

Upload: others

Post on 17-Jun-2020

64 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5

Spring Data JPAPoblando Base de Datos

Javier Navarrete

Page 2: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

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

Page 3: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

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

Page 4: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

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.

Page 5: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

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.

Page 6: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

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.

Page 7: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

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:

Page 8: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

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).

Page 9: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

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.

Page 10: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

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<>();

Page 11: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

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

Page 12: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

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.

Page 13: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

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 +

'}';

}

Page 14: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

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.

Page 15: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

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.

Page 16: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

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/

Page 17: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

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.

Page 18: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

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:

Page 19: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

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

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

Page 20: PROGRAMACIÓN EN JAVA CON SPRING FRAMEWORK 5 Spring Data JPA … · 2018-07-19 · Java Persistence API - JPA •Es en nexo que existe entre los objetos Java y como se almacenan en

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.