Persistencia de datos
       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.
Persistencia de datos

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

Problema
   Asociaciones, Herencia, Polimorfismo, Cascada,
  Cache, Lazy Loading, Paginación, etc.
JDBC
(Java Database Connectivity)
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.
JDBC

Arquitectura JDBC
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
JDBC



EJEMPLOS JDBC
ORM
(Object-Relational Mapping)
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.
ORM

¿Dónde actúa?
  JavaObject                      SQL Table
  int id;
  String name;             id [int] primary key,
  String getName()
  int getId()
                           name [varchar(50)]
  void setName(String)
  void setId(int)




                               La función de un
                               O/R Mapper tiene
                                   lugar aquí
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.
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");
ORM

Ejemplos
   Hibernate.
   JDO 2.0.
   Etc.
JDO
(Java Data Objects)
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.
JDO

Esquema
JDO

Implementaciones no comerciales
    JPOX: Implementación de referencia. Actualmente
   es DataNucleus.
    JDOInstruments.
    Apache JDO.
    Speedo.
    TJDO
JDO

Implementaciones comerciales
    JORM
    Kodo
    ObjectDB for Java/JDO
    Orient
    hywy's PE:J
    SignSoft intelliBO (Signsoft intelligent Business
   Objects)
    Versant
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.
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
JDO



EJEMPLOS JDO
JPA
(Java Persistence API)
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.
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.
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.
JPA

Entity - Ejemplo
JPA

Entity - Ejemplo
JPA

Annotations
    Annotations de mapeo son:




    Annotations para sobrescribir nombres:
JPA

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

EntityManager
    Se utiliza para crear entities, eliminar entities, crear
   queries para devolver un conjuto de entites, etc.
    Dos tipos de EntityManagers:
JPA

EntityManager - Ejemplo
 (non-managed)
JPA

EntityManager - Ejemplo
 (Container-managed)
JPA

EntityManager - Ejemplo
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.
JPA

Transacciones – Resource local
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.
JPA

Queries - Ejemplo
    Query que limita el resultado en 100 registros:
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
JPA

NamedQuery - Ejemplo
    Ejecutando NamedQuery con parámetros:
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.
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
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.
JPA



EJEMPLOS JPA
Mybatis
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
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
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.
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.
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.
MyBatis

Integración con Google Guice
    Módulo de integración con Google Guice.
    Soporte transaccional declarativo mediante la
   anotación @Transactional.
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.
MyBatis

MyBatis Migrations
    Descargar MyBatis Migrations aquí.
    Documentación de MyBatis Migrations aquí.
    Video de MyBatis Migrations aquí.
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.
MyBatis

Configuración – Con XML
MyBatis

Configuración – Sin XML
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.
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.
MyBatis

Mappers - Elementos
    insert: A mapped INSERT statement.
    update: A mapped UPDATE statement.
    delete: A mapped DELETE statement.
    select: A mapped SELECT statement.
MyBatis

Dynamic SQL
   MyBatis permite introducir condiciones en SQL.
   Elementos de Dynamic SQL:
      • if
      • choose (when, otherwise)
      • trim (where, set)
      • foreach
MyBatis

Dynamic SQL - IF
 <select id="findActiveBlogWithTitleLike"
        parameterType="Blog" resultType="Blog">
        SELECT * FROM BLOG
        WHERE state = 'ACTIVE'
        <if test="title != null">
                AND title like #{title}
        </if>
 </select>
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>
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>
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>
MyBatis



EJEMPLOS MyBatis
Hibernate
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.
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).
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.
Hibernate

Arquitectura simple
Hibernate

Arquitectura avanzada
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...
Hibernate

Ejemplo de hibernate.cfg.xml
Hibernate

Ejemplo de Cliente.hbm.xml
Hibernate

POJO (Plain Old Java Objects)
Hibernate

Ejemplo API (insert)
Hibernate

Ejemplo API (select)
Hibernate

Asociaciones
    Definimos una nueva clase → Cuenta




    Creamos las nuevas tablas y el nuevo fichero de
   mapeo.
Hibernate

Asociaciones
    Implementamos las relaciones en las clases de
   dominio:
       • private Set<Cuenta> cuentas = new
       HashSet<Cuenta>();
    Mapeamos la relación:
Hibernate

    Configuración JDBC

                           Propiedades JDBC




Propiedades
Datasource
Hibernate

hibernate.dialect
Hibernate

Hibernate mapping
Hibernate

Hibernate mapping
Hibernate

Hibernate mapping
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)
Hibernate

Mapeando Hibernate




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

Hibernate mapping
Hibernate

Hibernate mapping
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
Hibernate

Hibernate mapping - Component
Hibernate

Hibernate mapping
Hibernate

Hibernate mapping
Hibernate

Hibernate mapping
Hibernate

Hibernate mapping
Hibernate

Hibernate mapping
Hibernate

Hibernate mapping
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>
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”.
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();
Hibernate

HQL
Hibernate

HQL
Hibernate

HQL
Hibernate

HQL
Hibernate

HQL
Hibernate

HQL
   Funciones de agregación:
      • avg(), sum(), min(), max()
      • count(*)
      • count(distinct ...), count(all ...)
   Queries polimorficas → “from Object”
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
Hibernate

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




    Se añaden restricciones o condiciones para filtrar
   la consulta.
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.
Hibernate

Herencia
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.
Hibernate

Herencia
Hibernate

Herencia
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.
Hibernate

Herencia
Persistencia de datos


        FIN
                            Iker Canarias
                iker.canarias@gmail.com

Persistencia de datos en Java

  • 1.
  • 2.
    Persistencia de datos Conceptosbá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.
  • 3.
    Persistencia de datos Problema  Mapeo de Objetos (estructura jerárquica) a Base de Datos Relacional (estructura tabular) y viceversa.
  • 4.
    Persistencia de datos Problema  Asociaciones, Herencia, Polimorfismo, Cascada, Cache, Lazy Loading, Paginación, etc.
  • 5.
  • 6.
    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.
  • 7.
  • 8.
    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
  • 9.
  • 10.
  • 11.
    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.
  • 12.
    ORM ¿Dónde actúa? JavaObject SQL Table int id; String name; id [int] primary key, String getName() int getId() name [varchar(50)] void setName(String) void setId(int) La función de un O/R Mapper tiene lugar aquí
  • 13.
    ORM Objetivos de unORM  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.
  • 14.
    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");
  • 15.
    ORM Ejemplos Hibernate.  JDO 2.0.  Etc.
  • 16.
  • 17.
    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.
  • 18.
  • 19.
    JDO Implementaciones no comerciales  JPOX: Implementación de referencia. Actualmente es DataNucleus.  JDOInstruments.  Apache JDO.  Speedo.  TJDO
  • 20.
    JDO Implementaciones comerciales  JORM  Kodo  ObjectDB for Java/JDO  Orient  hywy's PE:J  SignSoft intelliBO (Signsoft intelligent Business Objects)  Versant
  • 21.
    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.
  • 22.
    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
  • 23.
  • 24.
  • 25.
    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.
  • 26.
    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.
  • 27.
    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.
  • 28.
  • 29.
  • 30.
    JPA Annotations  Annotations de mapeo son:  Annotations para sobrescribir nombres:
  • 31.
    JPA Annotations  Annotations para indicar tipos de clases u otros aspectos del modelo:
  • 32.
    JPA EntityManager  Se utiliza para crear entities, eliminar entities, crear queries para devolver un conjuto de entites, etc.  Dos tipos de EntityManagers:
  • 33.
  • 34.
    JPA EntityManager - Ejemplo (Container-managed)
  • 35.
  • 36.
    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.
  • 37.
  • 38.
    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.
  • 39.
    JPA Queries - Ejemplo  Query que limita el resultado en 100 registros:
  • 40.
    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
  • 41.
    JPA NamedQuery - Ejemplo  Ejecutando NamedQuery con parámetros:
  • 42.
    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.
  • 43.
    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
  • 44.
    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.
  • 45.
  • 46.
  • 47.
    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
  • 48.
    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
  • 49.
    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.
  • 50.
    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.
  • 51.
    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.
  • 52.
    MyBatis Integración con GoogleGuice  Módulo de integración con Google Guice.  Soporte transaccional declarativo mediante la anotación @Transactional.
  • 53.
    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.
  • 54.
    MyBatis MyBatis Migrations  Descargar MyBatis Migrations aquí.  Documentación de MyBatis Migrations aquí.  Video de MyBatis Migrations aquí.
  • 55.
    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.
  • 56.
  • 57.
  • 58.
    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.
  • 59.
    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.
  • 60.
    MyBatis Mappers - Elementos  insert: A mapped INSERT statement.  update: A mapped UPDATE statement.  delete: A mapped DELETE statement.  select: A mapped SELECT statement.
  • 61.
    MyBatis Dynamic SQL  MyBatis permite introducir condiciones en SQL.  Elementos de Dynamic SQL: • if • choose (when, otherwise) • trim (where, set) • foreach
  • 62.
    MyBatis Dynamic SQL -IF <select id="findActiveBlogWithTitleLike" parameterType="Blog" resultType="Blog"> SELECT * FROM BLOG WHERE state = 'ACTIVE' <if test="title != null"> AND title like #{title} </if> </select>
  • 63.
    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>
  • 64.
    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>
  • 65.
    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>
  • 66.
  • 67.
  • 68.
    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.
  • 69.
    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).
  • 70.
    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.
  • 71.
  • 72.
  • 73.
    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...
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
    Hibernate Asociaciones  Definimos una nueva clase → Cuenta  Creamos las nuevas tablas y el nuevo fichero de mapeo.
  • 80.
    Hibernate Asociaciones  Implementamos las relaciones en las clases de dominio: • private Set<Cuenta> cuentas = new HashSet<Cuenta>();  Mapeamos la relación:
  • 81.
    Hibernate Configuración JDBC Propiedades JDBC Propiedades Datasource
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
    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)
  • 87.
    Hibernate Mapeando Hibernate  Discrimina subclases. Se cargarán unas u otras en función de ciertas condiciones.  Ejemplo
  • 88.
  • 89.
  • 90.
    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
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
    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>
  • 99.
    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”.
  • 100.
    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();
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
    Hibernate HQL Funciones de agregación: • avg(), sum(), min(), max() • count(*) • count(distinct ...), count(all ...)  Queries polimorficas → “from Object”
  • 107.
    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
  • 108.
    Hibernate Interface org.hibernate.Criteria  Interface que representa una consulta a una clase persistente.  Se añaden restricciones o condiciones para filtrar la consulta.
  • 109.
    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.
  • 110.
  • 111.
    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.
  • 112.
  • 113.
  • 114.
    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.
  • 115.
  • 116.
    Persistencia de datos FIN Iker Canarias iker.canarias@gmail.com