2. 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.
3. Persistencia de datos
Problema
Mapeo de Objetos (estructura jerárquica) a Base
de Datos Relacional (estructura tabular) y viceversa.
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.
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
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 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.
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");
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.
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
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.
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:
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.
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.
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
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.
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.
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 Google Guice
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.
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>
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.
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...
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:
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
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();
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.
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.
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.