116
Persistencia de datos JAVA

Persistencia de datos en Java

Embed Size (px)

DESCRIPTION

Presentación sobre la "Persistencia de datos en Java". La presentación se centra en JDO, JPA, MyBatis e Hibernate.

Citation preview

Page 1: Persistencia de datos en Java

Persistencia de datosJAVA

Page 2: Persistencia de datos en Java

Persistencia de datos

Conceptos básicos Almacenamiento de la información después de finalizar el programa.

La mayoría de los programas actuales necesitan preservar los datos para posterior uso.

El sistema más común se basa en bases de datos relacionales.

Mapeo entre BD relacional y objetos de aplicación.

Page 3: Persistencia de datos en Java

Persistencia de datos

Problema Mapeo de Objetos (estructura jerárquica) a Base de Datos Relacional (estructura tabular) y viceversa.

Page 4: Persistencia de datos en Java

Persistencia de datos

Problema Asociaciones, Herencia, Polimorfismo, Cascada, Cache, Lazy Loading, Paginación, etc.

Page 5: Persistencia de datos en Java

JDBC (Java Database Connectivity)

Page 6: Persistencia de datos en Java

JDBC

Conceptos básicos API que permite la ejecución de operaciones sobre bases de datos desde Java.

Independiente del sistema operativo y de la base de datos.

Utiliza el dialecto SQL del modelo de base de datos que se utilice.

Page 7: Persistencia de datos en Java

JDBC

Arquitectura JDBC

Page 8: Persistencia de datos en Java

JDBC

Controladores JDBC Son adaptadores del lado-cliente para convertir las peticiones desde los programas Java a un protocolo que pueda entender DBMS.

Controladores comerciales y libres para la mayoría de las bases de datos. 4 tipos:

• Tipo 1: Puente JDBC-ODBC• Tipo 2: Controlador nativo de la API• Tipo 3: Controlador de protocolo de red• Tipo 4: Controlador nativo de protocolo

Page 9: Persistencia de datos en Java

JDBC

EJEMPLOS JDBC

Page 10: Persistencia de datos en Java

ORM (Object-Relational Mapping)

Page 11: Persistencia de datos en Java

ORM

Conceptos básicos Mapeo objeto-relacional (Object-Relational mapping, O/RM, ORM o O/R mapping)

Técnica de programación para convertir datos entre un lenguaje de programación OO y el utilizado en una BD relacional.

Utiliza un motor de persistencia. En la práctica crea una base de datos virtual orientada a objetos, sobre la base de datos relacional.

Page 12: Persistencia de datos en Java

ORM

¿Dónde actúa?

JavaObjectint id;String name;String getName()int getId()void setName(String)void setId(int)

SQL Table

id [int] primary key,name [varchar(50)]

La función de unO/R Mapper tiene

lugar aquí

JavaObjectint id;String name;String getName()int getId()void setName(String)void setId(int)

JavaObjectJavaObjectint id;String name;String getName()int getId()void setName(String)void setId(int)

int id;String name;String getName()int getId()void setName(String)void setId(int)

SQL Table

id [int] primary key,name [varchar(50)]

SQL TableSQL Table

id [int] primary key,name [varchar(50)]

La función de unO/R Mapper tiene

lugar aquí

La función de unO/R Mapper tiene

lugar aquí

Page 13: Persistencia de datos en Java

ORM

Objetivos de un ORM Garantizar persistencia de objetos:

• Conexiones JDBC + Consultas SQL

Problemas:• Objetos con muchas propiedades• Asociaciones: gestión automática vs. gestión manual.• Claves foráneas.• Restricciones de integridad.

Page 14: Persistencia de datos en Java

ORM

¿Qué ofrece? Definir el mapeo en un único punto.

Persistencia directa de objetos:

• orm.save(myObject);

Carga automática de objetos:

• myObjecto = orm.load(MyObject.class,objectId)

Buen lenguaje de consultas:

• List myObjects = orm.find( "FROM MyObject object WHERE object.property = 5");

Page 15: Persistencia de datos en Java

ORM

Ejemplos Hibernate.

JDO 2.0.

Etc.

Page 16: Persistencia de datos en Java

JDO (Java Data Objects)

Page 17: Persistencia de datos en Java

JDO

Conceptos básicos Intenta solventar problema de persistencia y mapeo objeto-a-datos y datos-a-objeto.

API que proporciona una forma estándar y sencilla de conseguir la persistencia de objetos.

Permite trabajar con objetos POJOs (plain old Java objects) en lugar de con APIs propietarios.

Page 18: Persistencia de datos en Java

JDO

Esquema

Page 19: Persistencia de datos en Java

JDO

Implementaciones no comerciales

JPOX: Implementación de referencia. Actualmente es DataNucleus.

JDOInstruments.

Apache JDO.

Speedo.

TJDO

Page 20: Persistencia de datos en Java

JDO

Implementaciones comerciales

JORM

Kodo

ObjectDB for Java/JDO

Orient

hywy's PE:J

SignSoft intelliBO (Signsoft intelligent Business Objects)

Versant

Page 21: Persistencia de datos en Java

JDO

PersistenceCapable En la mayoría de implementaciones de JDO se necesita añadir la persistencia a las clases compiladas.

Enhancer (“mejorador”): Herramienta que agrega automáticamente código para hacer persistentes las clases desarrolladas.

Esta modificación de la clase compilada (bytecode) conserva perfectamente los números de línea en seguimientos de pila y no afecta a la depuración.

Page 22: Persistencia de datos en Java

JDO

Enhancer (“Mejorador”)1. Se crea la clase (Magazine.java en el ejemplo)

2. Se compila la clase.

3 Se ejecuta el Enhancer sobre la clase compilada

Page 23: Persistencia de datos en Java

JDO

EJEMPLOS JDO

Page 24: Persistencia de datos en Java

JPA (Java Persistence API)

Page 25: Persistencia de datos en Java

JPA

Conceptos básicos Java Persistence API (JPA) estándar para mapeo de objetos Java a una base de datos relacional.

Productos propietarios de Mapping como Hibernate o TopLink pueden hacer uso de JPA.

Ha sido incluida en el estándar EJB3.

Cubre tres áreas:• La API definida en javax.persistence.package.• La Java Persistence Query Language (JPQL).• Metadatos objeto/relacional.

Page 26: Persistencia de datos en Java

JPA

Ventajas Permite crear la tabla del modelo de datos correspondiente a una clase.

Independencia de base de datos.

Persistencia no sólo a base de datos, también objetos, ficheros de texto plano, XML, etc.

Page 27: Persistencia de datos en Java

JPA

Entity Unidad básica de persistencia en JPA.

Clase Java con metadatos para describir cómo se mapean las tablas de bases de datos.

Los metadatos se expresan con annotations o con ficheros XML.

Tendrá una annotation @Entity y un campo identificado con @Id → la clave primaria de una tabla.

Page 28: Persistencia de datos en Java

JPA

Entity - Ejemplo

Page 29: Persistencia de datos en Java

JPA

Entity - Ejemplo

Page 30: Persistencia de datos en Java

JPA

Annotations Annotations de mapeo son:

Annotations para sobrescribir nombres:

Page 31: Persistencia de datos en Java

JPA

Annotations Annotations para indicar tipos de clases u otros aspectos del modelo:

Page 32: Persistencia de datos en Java

JPA

EntityManager Se utiliza para crear entities, eliminar entities, crear queries para devolver un conjuto de entites, etc.

Dos tipos de EntityManagers:

Page 33: Persistencia de datos en Java

JPA

EntityManager - Ejemplo(non-managed)

Page 34: Persistencia de datos en Java

JPA

EntityManager - Ejemplo(Container-managed)

Page 35: Persistencia de datos en Java

JPA

EntityManager - Ejemplo

Page 36: Persistencia de datos en Java

JPA

Transacciones Dos tipos de transacciones:

• JTA container transactions: Las transacciones empieza y terminan usando las técnicas normales de contenedores transaccionales como EJB, Spring, etc.

• Resource local transactions: La transaccionalidad es manual a través de EntityTransaction.

Page 37: Persistencia de datos en Java

JPA

Transacciones – Resource local

Page 38: Persistencia de datos en Java

JPA

Queries Dynamic queries: Objetos creados desde un EntityManager y después ejecutados.

Query criteria: Se especifica en tiempo de ejecución mediante JPQL (Java Persistence Query Language).

Sobre el objeto Query se pueden ejecutar varios métodos para configurar dicho objeto.

Page 39: Persistencia de datos en Java

JPA

Queries - Ejemplo Query que limita el resultado en 100 registros:

Page 40: Persistencia de datos en Java

JPA

NamedQuery Query que se define de manera estática y se instancia y ejecuta en tiempo de ejecución.

Puede ser definida a través de annotation dentro de una clase Entity.

Named parameter

Page 41: Persistencia de datos en Java

JPA

NamedQuery - Ejemplo Ejecutando NamedQuery con parámetros:

Page 42: Persistencia de datos en Java

JPA

JPQL Java Persistence Query Language.

Es parecido a SQL pero trabaja sobre entities y sus atributos persistentes mapeados, en vez de sobre Esquemas SQL.

Muchas de las funciones y palabras reservadas de SQL están soportadas en JPQL.

Page 43: Persistencia de datos en Java

JPA

JPQL Existen 3 tipos básicos de sentencias JPQL:

• select_clause from_clause [where_clause] [groupby_clause] [having_clause] [orderby_clause]

• update_clause [where_clause]

• delete_clause [where_clause]

Gramática completa en la especificación JPA

Page 44: Persistencia de datos en Java

JPA

Configuración Se especifica en el fichero persistence.xml

El fichero persistence.xml deberá situarse en el directorio META-INF del proyecto.

Especifica la conexión a la base de datos y otros aspectos de dicha conexión.

Page 45: Persistencia de datos en Java

JPA

EJEMPLOS JPA

Page 46: Persistencia de datos en Java

Mybatis

Page 47: Persistencia de datos en Java

MyBatis

Conceptos básicos MyBatis era anteriormente conocido como iBATIS.

Herramienta de persistencia disponible para Java y .NET

Mapea SQL y procedimientos almacenados con objetos a partir de ficheros XML o anotaciones.

Software libre desarrollado bajo Licencia Apache 2.0

Page 48: Persistencia de datos en Java

MyBatis

Ventajas Herramienta tremendamente sencilla.

Simplifica la programación frente al uso directo de JDBC.

Ahorra tiempo y evita errores habituales como:• olvidar cerrar conexión a base de datos.• realizar incorrectamente un mapeo de datos.• exceder el tamaño de un result set. • obtener varios resultados cuando se esperaba sólo uno

Page 49: Persistencia de datos en Java

MyBatis

Caché Soporta el uso de caché declarativa.

Es posible indicar en el fichero XML que una sentencia debe ser cacheada.

MyBatis buscará los datos en una caché antes de solicitarlos a la base de datos.

Se soportan varias cachés: • OSCache, EHCache y Hazelcast • Soporta código propio de integración con otras cachés.

Page 50: Persistencia de datos en Java

MyBatis

Generador de código El generador lee los metadatos de la base de datos para generar los beans, DAOs (simples o de Spring) y ficheros XML que implementan el "CRUD" (alta, baja, modificación, borrado) de las tablas indicadas.

Permite realizar modificaciones en el código generado que serán preservadas en caso de regeneración.

Disponible también formato plugin para Eclipse.

Page 51: Persistencia de datos en Java

MyBatis

Integración con Spring Dispone de un módulo de integración con Spring Framework.

El modulo permite que MyBatis participe en transacciones Spring.

Permite crear mappers y sesiones e inyectarlos en beans de servicio.

Page 52: Persistencia de datos en Java

MyBatis

Integración con Google Guice Módulo de integración con Google Guice.

Soporte transaccional declarativo mediante la anotación @Transactional.

Page 53: Persistencia de datos en Java

MyBatis

MyBatis Migrations Herramienta Java de línea de comandos que permite realizar un seguimiento de los cambios de esquema de la base de datos.

Almacena ficheros DDL con cambios incrementales (denominados migrations).

Es posible consultar el estado de la base de datos, aplicar cambios al esquema e incluso deshacerlos.

Detecta y soluciona cambios concurrentes del esquema de base de datos por distintos desarrolladores.

Page 54: Persistencia de datos en Java

MyBatis

MyBatis Migrations Descargar MyBatis Migrations aquí.

Documentación de MyBatis Migrations aquí.

Video de MyBatis Migrations aquí.

Page 55: Persistencia de datos en Java

MyBatis

Configuración Las aplicaciones MyBatis se centran en SqlSessionFactory.

SqlSessionFactory se puede obtener a través de un SqlSessionFactoryBuilder.

SqlSessionFactoryBuilder se configura a través de un fichero de configuración o directamente desde Java.

Page 56: Persistencia de datos en Java

MyBatis

Configuración – Con XML

Page 57: Persistencia de datos en Java

MyBatis

Configuración – Sin XML

Page 58: Persistencia de datos en Java

MyBatis

Mappers Núcleo de MyBatis.

Ficheros XML donde se definen las SQL.

Se delegan las sentencias a estos ficheros, dejando el código Java libre de SQL.

Mucho control sobre sentencias SQL.

Page 59: Persistencia de datos en Java

MyBatis

Mappers - Elementos cache: Configuration of the cache for a given namespace.

cache-ref: Reference to a cache configuration from another namespace.

resultMap: The most complicated and powerful element that describes how to load your objects from the database result sets.

sql: A reusable chunk of SQL that can be referenced by other statements.

Page 60: Persistencia de datos en Java

MyBatis

Mappers - Elementos insert: A mapped INSERT statement.

update: A mapped UPDATE statement.

delete: A mapped DELETE statement.

select: A mapped SELECT statement.

Page 61: Persistencia de datos en Java

MyBatis

Dynamic SQL MyBatis permite introducir condiciones en SQL.

Elementos de Dynamic SQL:

• if

• choose (when, otherwise)

• trim (where, set)

• foreach

Page 62: Persistencia de datos en Java

MyBatis

Dynamic SQL - IF<select id="findActiveBlogWithTitleLike"

parameterType="Blog" resultType="Blog">SELECT * FROM BLOGWHERE state = 'ACTIVE'<if test="title != null">

AND title like #{title}</if>

</select>

Page 63: Persistencia de datos en Java

MyBatis

Dynamic SQL - choose<select id=”findActiveBlogLike”

parameterType=”Blog” resultType=”Blog”>SELECT * FROM BLOG WHERE state = ‘ACTIVE’<choose>

<when test=”title != null”>AND title like #{title}

</when><when test=”author != null and author.name != null”>

AND author_name like #{author.name}</when><otherwise>

AND featured = 1</otherwise>

</choose></select>

Page 64: Persistencia de datos en Java

MyBatis

Dynamic SQL - trim<select id=”findActiveBlogLike” parameterType=”Blog” resultType=”Blog”>SELECT * FROM BLOG<where>

<if test=”state != null”>state = #{state}

</if><if test=”title != null”>

AND title like #{title}</if><if test=”author!=null and author.name!=null”>

AND author_name like #{author.name}</if>

</where></select>

Page 65: Persistencia de datos en Java

MyBatis

Dynamic SQL - foreach<select id="selectPostIn" resultType="domain.blog.Post">SELECT * FROM POST P WHERE ID in

<foreach item="item" index="index" collection="list" open="(" separator="," close=")">

#{item}</foreach>

</select>

Page 66: Persistencia de datos en Java

MyBatis

EJEMPLOS MyBatis

Page 67: Persistencia de datos en Java

Hibernate

Page 68: Persistencia de datos en Java

Hibernate

Conceptos básicos Herramienta de Mapeo objeto-relacional (ORM) para Java (también para .Net → NHibernate).

Facilita el mapeo de entre BD relacional y modelo de objetos de una aplicación.

Hace uso de archivos declarativos (XML) o anotaciones.

Software libre, distribuido bajo licencia GNU LGPL.

Page 69: Persistencia de datos en Java

Hibernate

Conceptos básicos Ofrece un lenguaje de consulta de datos HQL (Hibernate Query Language).

API para construir las consultas en programación (conocida como "criteria").

Se puede usar en aplicaciones Java independientes o en Java EE, mediante Hibernate Annotations (implementa JPA).

Page 70: Persistencia de datos en Java

Hibernate

¿Porqué Hibernate? OpenSource.

Buena documentación y estabilidad.

Gran cantidad de descargas.

Utiliza clases de forma directa: no genera código a partir de descriptores, ni implementar interfaces, ni heredar de una superclase...

Independencia del SGBD.

Page 71: Persistencia de datos en Java

Hibernate

Arquitectura simple

Page 72: Persistencia de datos en Java

Hibernate

Arquitectura avanzada

Page 73: Persistencia de datos en Java

Hibernate

Configuración El funcionamiento de Hibernate se puede configurar mediante dos ficheros:

• hibernate.properties• hibernate.cfg.xml

Se realizan los mapeos entre las tablas y las clases mediante ficheros hbm.xml

Integración con infraestructura J2EE: utilización de datasources, enlazado JNDI, JTA...

Page 74: Persistencia de datos en Java

Hibernate

Ejemplo de hibernate.cfg.xml

Page 75: Persistencia de datos en Java

Hibernate

Ejemplo de Cliente.hbm.xml

Page 76: Persistencia de datos en Java

Hibernate

POJO (Plain Old Java Objects)

Page 77: Persistencia de datos en Java

Hibernate

Ejemplo API (insert)

Page 78: Persistencia de datos en Java

Hibernate

Ejemplo API (select)

Page 79: Persistencia de datos en Java

Hibernate

Asociaciones Definimos una nueva clase → Cuenta

Creamos las nuevas tablas y el nuevo fichero de mapeo.

Page 80: Persistencia de datos en Java

Hibernate

Asociaciones Implementamos las relaciones en las clases de dominio:

• private Set<Cuenta> cuentas = new HashSet<Cuenta>();

Mapeamos la relación:

Page 81: Persistencia de datos en Java

Hibernate

Configuración JDBC

Propiedades JDBC

PropiedadesDatasource

Page 82: Persistencia de datos en Java

Hibernate

hibernate.dialect

Page 83: Persistencia de datos en Java

Hibernate

Hibernate mapping

Page 84: Persistencia de datos en Java

Hibernate

Hibernate mapping

Page 85: Persistencia de datos en Java

Hibernate

Hibernate mapping

Page 86: Persistencia de datos en Java

Hibernate

Mapeando Hibernate - ID

Clases para generar id:• increment (SELECT MAX()... )• identity (DB2, MySQL, MS SQLServer, etc.)• assigned• uuid (IP, tiempo arranque JVM, tiempo sistema, contador único JVM)• hilo• native (identity, sequence o hilo)• sequence (DB2, PostgreSQL, Oracle, SAP DB)

Page 87: Persistencia de datos en Java

Hibernate

Mapeando Hibernate

Discrimina subclases. Se cargarán unas u otras en función de ciertas condiciones. Ejemplo

Page 88: Persistencia de datos en Java

Hibernate

Hibernate mapping

Page 89: Persistencia de datos en Java

Hibernate

Hibernate mapping

Page 90: Persistencia de datos en Java

Hibernate

Hibernate mapping - Component

Un componente es un objeto contenido que es persistido como un tipo de valor, no una referencia de entidad. El término "componente" hace referencia a la noción orientada a objetos de composición y no a componentes a nivel de arquitectura. Ejemplo

Page 91: Persistencia de datos en Java

Hibernate

Hibernate mapping - Component

Page 92: Persistencia de datos en Java

Hibernate

Hibernate mapping

Page 93: Persistencia de datos en Java

Hibernate

Hibernate mapping

Page 94: Persistencia de datos en Java

Hibernate

Hibernate mapping

Page 95: Persistencia de datos en Java

Hibernate

Hibernate mapping

Page 96: Persistencia de datos en Java

Hibernate

Hibernate mapping

Page 97: Persistencia de datos en Java

Hibernate

Hibernate mapping

Page 98: Persistencia de datos en Java

Hibernate

Asociaciones unidireccionales Sin join:

• 1-n → <set> + <one-to-many>• n-1 → <many-to-one>• 1-1 → <many-to-one unique=“true”>

Con join:• 1-n → <set> + <many-to-many unique=“true”>• n-1 → <join> + <many-to-one>• 1-1 → <join> + <many-to-one unique=“true”>• m-n → <set> + <many-to-many>

Page 99: Persistencia de datos en Java

Hibernate

Consideraciones de rendimiento ¿Cuándo se recogen los elementos de una asociación?

Por defecto lazy=“true” (la colección se recoge cuando se realice alguna operación sobre ella)

En la versión 2 por defecto lazy=“false”.

Page 100: Persistencia de datos en Java

Hibernate

Persistencia de objetos Alta de nuevos objetos → session.save(obj)

Recuperar objetos:• obj = (MyObj)session.get(MyObj.class,id)• obj = (MyObj)session.load(MyObj.class,id)

Baja de objetos → session.delete(obj)

Modificación de objetos:• MyObj obj = (MyObj)session.load(MyObj.class,id);• obj.setProperty(valor);• session.flush();

Page 101: Persistencia de datos en Java

Hibernate

HQL

Page 102: Persistencia de datos en Java

Hibernate

HQL

Page 103: Persistencia de datos en Java

Hibernate

HQL

Page 104: Persistencia de datos en Java

Hibernate

HQL

Page 105: Persistencia de datos en Java

Hibernate

HQL

Page 106: Persistencia de datos en Java

Hibernate

HQL Funciones de agregación:

• avg(), sum(), min(), max()

• count(*)

• count(distinct ...), count(all ...)

Queries polimorficas → “from Object”

Page 107: Persistencia de datos en Java

Hibernate

HQL Expresiones:

• Operadores (matemáticos, comparación, lógicos)

• in, not in, between, is null, is not null, is empty, is not empty

• funciones de cadena: ||, trim, substring, lower, upper, length.

• current_date, current_time, current_timestamp

Page 108: Persistencia de datos en Java

Hibernate

Interface org.hibernate.Criteria Interface que representa una consulta a una clase persistente.

Se añaden restricciones o condiciones para filtrar la consulta.

Page 109: Persistencia de datos en Java

Hibernate

Herencia Estrategias de mapeo:

• Una tabla por jerarquía• Una tabla por cada subclase• Una tabla por cada clase concreta

Una tabla por jerarquía:• Requiere un discriminador• Las columnas declaradas en subclases no pueden ser “NOT NULL”• La mayoría de la información → en la padre.

Page 110: Persistencia de datos en Java

Hibernate

Herencia

Page 111: Persistencia de datos en Java

Hibernate

Herencia Una tabla por cada subclase:

• Requiere tantas tablas como clases existan• Las tablas “hijas” tienen claves foráneas a la tabla que representa el “padre” → Relación one-to-one• Puede implementarse tanto con discriminador como sin él.• Se suele utilizar cuando todas las clases son concretas y la información esta repartida uniformemente.

Page 112: Persistencia de datos en Java

Hibernate

Herencia

Page 113: Persistencia de datos en Java

Hibernate

Herencia

Page 114: Persistencia de datos en Java

Hibernate

Herencia Una tabla por cada clase concreta:

• Requiere tantas tablas como clases concretas existan.• Tiene una limitación → Las propiedades mapeadas en las superclases se tienen que llamar igual en todas las tablas que mapeen las subclases.• La superclase puede ser abstracta o concreta. Si es abstracta se marcará en el fichero de mapeo con abstract=true.

Page 115: Persistencia de datos en Java

Hibernate

Herencia

Page 116: Persistencia de datos en Java

FINPersistencia de datos

Iker [email protected]