Está en la página 1de 115

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

También podría gustarte