Вы находитесь на странице: 1из 116

Persistencia de datos JAVA

Persistencia de datos
Conceptos bsicos
Almacenamiento de la informacin despus de finalizar el programa. La mayora de los programas actuales necesitan preservar los datos para posterior uso. El sistema ms comn se basa en bases de datos relacionales. Mapeo entre BD relacional y objetos de aplicacin.

Persistencia de datos
Problema
Mapeo de Objetos (estructura jerrquica) a Base de Datos Relacional (estructura tabular) y viceversa.

Persistencia de datos
Problema
Asociaciones, Herencia, Polimorfismo, Cascada, Cache, Lazy Loading, Paginacin, etc.

JDBC
(Java Database Connectivity)

JDBC
Conceptos bsicos
API que permite la ejecucin 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 mayora 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 bsicos
Mapeo objeto-relacional (Object-Relational mapping, O/RM, ORM o O/R mapping) Tcnica de programacin para convertir datos entre un lenguaje de programacin OO y el utilizado en una BD relacional. Utiliza un motor de persistencia. En la prctica crea una base de datos virtual orientada a objetos, sobre la base de datos relacional.

ORM
Dnde acta?
JavaObject
int id; String name; String getName() int getId() void setName(String) void setId(int)

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

La funcin 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: gestin automtica vs. gestin manual. Claves forneas. Restricciones de integridad.

ORM
Qu ofrece?
Definir el mapeo en un nico punto. Persistencia directa de objetos: orm.save(myObject); Carga automtica 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 bsicos
Intenta solventar problema de persistencia y mapeo objeto-a-datos y datos-a-objeto. API que proporciona una forma estndar 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: Implementacin 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 mayora de implementaciones de JDO se necesita aadir la persistencia a las clases compiladas. Enhancer (mejorador): Herramienta que agrega automticamente cdigo para hacer persistentes las clases desarrolladas. Esta modificacin de la clase compilada (bytecode) conserva perfectamente los nmeros de lnea en seguimientos de pila y no afecta a la depuracin.

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 bsicos
Java Persistence API (JPA) estndar 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 estndar 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 slo a base de datos, tambin objetos, ficheros de texto plano, XML, etc.

JPA
Entity
Unidad bsica de persistencia en JPA. Clase Java con metadatos para describir cmo 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 tcnicas normales de contenedores transaccionales como EJB, Spring, etc. Resource local transactions: La transaccionalidad es manual a travs de EntityTransaction.

JPA
Transacciones Resource local

JPA
Queries
Dynamic queries: Objetos creados desde un EntityManager y despus ejecutados. Query criteria: Se especifica en tiempo de ejecucin mediante JPQL (Java Persistence Query Language). Sobre el objeto Query se pueden ejecutar varios mtodos para configurar dicho objeto.

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

JPA
NamedQuery
Query que se define de manera esttica y se instancia y ejecuta en tiempo de ejecucin. Puede ser definida a travs de annotation dentro de una clase Entity.

Named parameter

JPA
NamedQuery - Ejemplo
Ejecutando NamedQuery con parmetros:

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 estn soportadas en JPQL.

JPA
JPQL
Existen 3 tipos bsicos de sentencias JPQL: select_clause from_clause [where_clause] [groupby_clause] [having_clause] [orderby_clause] update_clause [where_clause] delete_clause [where_clause] Gramtica completa en la especificacin JPA

JPA
Configuracin
Se especifica en el fichero persistence.xml El fichero persistence.xml deber situarse en el directorio META-INF del proyecto. Especifica la conexin a la base de datos y otros aspectos de dicha conexin.

JPA

EJEMPLOS JPA

Mybatis

MyBatis
Conceptos bsicos
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 programacin frente al uso directo de JDBC. Ahorra tiempo y evita errores habituales como: olvidar cerrar conexin a base de datos. realizar incorrectamente un mapeo de datos. exceder el tamao de un result set. obtener varios resultados cuando se esperaba slo 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 cachs: OSCache, EHCache y Hazelcast Soporta cdigo propio de integracin con otras cachs.

MyBatis
Generador de cdigo
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, modificacin, borrado) de las tablas indicadas. Permite realizar modificaciones en el cdigo generado que sern preservadas en caso de regeneracin. Disponible tambin formato plugin para Eclipse.

MyBatis
Integracin con Spring
Dispone de un mdulo de integracin con Spring Framework. El modulo permite que MyBatis participe en transacciones Spring. Permite crear mappers y sesiones e inyectarlos en beans de servicio.

MyBatis
Integracin con Google Guice
Mdulo de integracin con Google Guice. Soporte transaccional declarativo mediante la anotacin @Transactional.

MyBatis
MyBatis Migrations
Herramienta Java de lnea 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. Documentacin de MyBatis Migrations aqu. Video de MyBatis Migrations aqu.

MyBatis
Configuracin
Las aplicaciones MyBatis se centran en SqlSessionFactory. SqlSessionFactory se puede obtener a travs de un SqlSessionFactoryBuilder. SqlSessionFactoryBuilder se configura a travs de un fichero de configuracin o directamente desde Java.

MyBatis
Configuracin Con XML

MyBatis
Configuracin Sin XML

MyBatis
Mappers
Ncleo de MyBatis. Ficheros XML donde se definen las SQL. Se delegan las sentencias a estos ficheros, dejando el cdigo 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 bsicos
Herramienta de Mapeo objeto-relacional (ORM) para Java (tambin para .Net NHibernate). Facilita el mapeo de entre BD relacional y modelo de objetos de una aplicacin. Hace uso de archivos declarativos (XML) o anotaciones. Software libre, distribuido bajo licencia GNU LGPL.

Hibernate
Conceptos bsicos
Ofrece un lenguaje de consulta de datos HQL (Hibernate Query Language). API para construir las consultas en programacin (conocida como "criteria"). Se puede usar en aplicaciones Java independientes o en Java EE, mediante Hibernate Annotations (implementa JPA).

Hibernate
Porqu Hibernate?
OpenSource. Buena documentacin y estabilidad. Gran cantidad de descargas. Utiliza clases de forma directa: no genera cdigo a partir de descriptores, ni implementar interfaces, ni heredar de una superclase... Independencia del SGBD.

Hibernate
Arquitectura simple

Hibernate
Arquitectura avanzada

Hibernate
Configuracin
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 Integracin con infraestructura J2EE: utilizacin 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 relacin:

Hibernate
Configuracin 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 cargarn unas u otras en funcin 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 trmino "componente" hace referencia a la nocin orientada a objetos de composicin 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
Cundo se recogen los elementos de una asociacin? Por defecto lazy=true (la coleccin se recoge cuando se realice alguna operacin sobre ella) En la versin 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) Modificacin 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 agregacin: avg(), sum(), min(), max() count(*) count(distinct ...), count(all ...) Queries polimorficas from Object

Hibernate
HQL
Expresiones: Operadores (matemticos, comparacin, lgicos) 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 aaden restricciones o condiciones para filtrar la consulta.

Hibernate
Herencia
Estrategias de mapeo: Una tabla por jerarqua Una tabla por cada subclase Una tabla por cada clase concreta Una tabla por jerarqua: Requiere un discriminador Las columnas declaradas en subclases no pueden ser NOT NULL La mayora de la informacin en la padre.

Hibernate
Herencia

Hibernate
Herencia
Una tabla por cada subclase: Requiere tantas tablas como clases existan Las tablas hijas tienen claves forneas a la tabla que representa el padre Relacin oneto-one Puede implementarse tanto con discriminador como sin l. Se suele utilizar cuando todas las clases son concretas y la informacin esta repartida uniformemente.

Hibernate
Herencia

Hibernate
Herencia

Hibernate
Herencia
Una tabla por cada clase concreta: Requiere tantas tablas como clases concretas existan. Tiene una limitacin 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

Вам также может понравиться