Persistencia de datos en Java

32,683 views

Published on

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

Published in: Technology
4 Comments
18 Likes
Statistics
Notes
  • Saludos Guardo los datos de los pacientes: numero de expediente, dni, apellidos, nombres, telefono, direccion y fotografia en un archivo binario, pero al parecer se sobreescribe el archivo, por eso cuando busco solo me muestra el ultimo ingresado, dejo aqui los codigos de guardar y buscar respectivament para que me puedan ayudar. gracias: private void btcGuardarActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Object nombreArchivo = archivo; System.out.println(nombreArchivo); try{ ObjectOutputStream fileout = new ObjectOutputStream(new FileOutputStream((String) nombreArchivo)); fileout.writeObject(txtNroExpediente.getText()); fileout.writeObject(txtDni.getText()); fileout.writeObject(txtApellidos.getText()); fileout.writeObject(txtNombres.getText()); fileout.writeObject(txtDireccion.getText()); fileout.writeObject(txtTelefono.getText()); fileout.writeObject(lblFoto.getIcon()); JOptionPane.showMessageDialog(null, "Los datos del paciente se guardaron corecttamente..."); if(fileout!=null){ fileout.close(); } }catch(IOException e){} } private void btcBuscarActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Object nombreArchivo = archivo; try{ try (ObjectInputStream filein = new ObjectInputStream(new FileInputStream((String) nombreArchivo))){ Object expediente = filein.readObject(); Object dni = filein.readObject(); Object apellidos = filein.readObject(); Object nombres = filein.readObject(); Object direccion = filein.readObject(); Object telefono = filein.readObject(); Object foto = filein.readObject(); if (txtNroExpediente.getText().equals(expediente)){ txtNroExpediente.setText((String) expediente); txtDni.setText((String) dni); txtApellidos.setText((String) apellidos); txtNombres.setText((String) nombres); txtDireccion.setText((String) direccion); txtTelefono.setText((String) telefono); lblFoto.setIcon((Icon) foto); } if(filein!=null){ filein.close(); } } catch (ClassNotFoundException ex) { Logger.getLogger(JDPacientes.class.getName()).log(Level.SEVERE, null, ex); } }catch(IOException e){} }
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Gracias por el Aporte!!!!
    Felicidades
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Muy buen trabajo. Felicidades
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Excelente te felicito!!
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
32,683
On SlideShare
0
From Embeds
0
Number of Embeds
1,228
Actions
Shares
0
Downloads
1,008
Comments
4
Likes
18
Embeds 0
No embeds

No notes for slide

Persistencia de datos en Java

  1. 1. Persistencia de datos JAVA
  2. 2. Persistencia de datosConceptos 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. 3. Persistencia de datosProblema  Mapeo de Objetos (estructura jerárquica) a Base de Datos Relacional (estructura tabular) y viceversa.
  4. 4. Persistencia de datosProblema  Asociaciones, Herencia, Polimorfismo, Cascada, Cache, Lazy Loading, Paginación, etc.
  5. 5. JDBC(Java Database Connectivity)
  6. 6. JDBCConceptos 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. 7. JDBCArquitectura JDBC
  8. 8. JDBCControladores 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. 9. JDBCEJEMPLOS JDBC
  10. 10. ORM(Object-Relational Mapping)
  11. 11. ORMConceptos 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. 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. 13. ORMObjetivos 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. 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. 15. ORMEjemplos  Hibernate.  JDO 2.0.  Etc.
  16. 16. JDO(Java Data Objects)
  17. 17. JDOConceptos 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. 18. JDOEsquema
  19. 19. JDOImplementaciones no comerciales  JPOX: Implementación de referencia. Actualmente es DataNucleus.  JDOInstruments.  Apache JDO.  Speedo.  TJDO
  20. 20. JDOImplementaciones comerciales  JORM  Kodo  ObjectDB for Java/JDO  Orient  hywys PE:J  SignSoft intelliBO (Signsoft intelligent Business Objects)  Versant
  21. 21. JDOPersistenceCapable  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. 22. JDOEnhancer (“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. 23. JDOEJEMPLOS JDO
  24. 24. JPA(Java Persistence API)
  25. 25. JPAConceptos 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. 26. JPAVentajas  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. 27. JPAEntity  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. 28. JPAEntity - Ejemplo
  29. 29. JPAEntity - Ejemplo
  30. 30. JPAAnnotations  Annotations de mapeo son:  Annotations para sobrescribir nombres:
  31. 31. JPAAnnotations  Annotations para indicar tipos de clases u otros aspectos del modelo:
  32. 32. JPAEntityManager  Se utiliza para crear entities, eliminar entities, crear queries para devolver un conjuto de entites, etc.  Dos tipos de EntityManagers:
  33. 33. JPAEntityManager - Ejemplo (non-managed)
  34. 34. JPAEntityManager - Ejemplo (Container-managed)
  35. 35. JPAEntityManager - Ejemplo
  36. 36. JPATransacciones  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. 37. JPATransacciones – Resource local
  38. 38. JPAQueries  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. 39. JPAQueries - Ejemplo  Query que limita el resultado en 100 registros:
  40. 40. JPANamedQuery  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. 41. JPANamedQuery - Ejemplo  Ejecutando NamedQuery con parámetros:
  42. 42. JPAJPQL  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. 43. JPAJPQL  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. 44. JPAConfiguració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. 45. JPAEJEMPLOS JPA
  46. 46. Mybatis
  47. 47. MyBatisConceptos 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. 48. MyBatisVentajas  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. 49. MyBatisCaché  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. 50. MyBatisGenerador 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. 51. MyBatisIntegració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. 52. MyBatisIntegración con Google Guice  Módulo de integración con Google Guice.  Soporte transaccional declarativo mediante la anotación @Transactional.
  53. 53. MyBatisMyBatis 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. 54. MyBatisMyBatis Migrations  Descargar MyBatis Migrations aquí.  Documentación de MyBatis Migrations aquí.  Video de MyBatis Migrations aquí.
  55. 55. MyBatisConfiguració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. 56. MyBatisConfiguración – Con XML
  57. 57. MyBatisConfiguración – Sin XML
  58. 58. MyBatisMappers  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. 59. MyBatisMappers - 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. 60. MyBatisMappers - Elementos  insert: A mapped INSERT statement.  update: A mapped UPDATE statement.  delete: A mapped DELETE statement.  select: A mapped SELECT statement.
  61. 61. MyBatisDynamic SQL  MyBatis permite introducir condiciones en SQL.  Elementos de Dynamic SQL: • if • choose (when, otherwise) • trim (where, set) • foreach
  62. 62. MyBatisDynamic 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. 63. MyBatisDynamic 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. 64. MyBatisDynamic 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. 65. MyBatisDynamic 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. 66. MyBatisEJEMPLOS MyBatis
  67. 67. Hibernate
  68. 68. HibernateConceptos 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. 69. HibernateConceptos 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. 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. 71. HibernateArquitectura simple
  72. 72. HibernateArquitectura avanzada
  73. 73. HibernateConfiguració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. 74. HibernateEjemplo de hibernate.cfg.xml
  75. 75. HibernateEjemplo de Cliente.hbm.xml
  76. 76. HibernatePOJO (Plain Old Java Objects)
  77. 77. HibernateEjemplo API (insert)
  78. 78. HibernateEjemplo API (select)
  79. 79. HibernateAsociaciones  Definimos una nueva clase → Cuenta  Creamos las nuevas tablas y el nuevo fichero de mapeo.
  80. 80. HibernateAsociaciones  Implementamos las relaciones en las clases de dominio: • private Set<Cuenta> cuentas = new HashSet<Cuenta>();  Mapeamos la relación:
  81. 81. Hibernate Configuración JDBC Propiedades JDBCPropiedadesDatasource
  82. 82. Hibernatehibernate.dialect
  83. 83. HibernateHibernate mapping
  84. 84. HibernateHibernate mapping
  85. 85. HibernateHibernate mapping
  86. 86. HibernateMapeando 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. 87. HibernateMapeando Hibernate  Discrimina subclases. Se cargarán unas u otras en función de ciertas condiciones.  Ejemplo
  88. 88. HibernateHibernate mapping
  89. 89. HibernateHibernate mapping
  90. 90. HibernateHibernate 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. 91. HibernateHibernate mapping - Component
  92. 92. HibernateHibernate mapping
  93. 93. HibernateHibernate mapping
  94. 94. HibernateHibernate mapping
  95. 95. HibernateHibernate mapping
  96. 96. HibernateHibernate mapping
  97. 97. HibernateHibernate mapping
  98. 98. HibernateAsociaciones 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. 99. HibernateConsideraciones 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. 100. HibernatePersistencia 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. 101. HibernateHQL
  102. 102. HibernateHQL
  103. 103. HibernateHQL
  104. 104. HibernateHQL
  105. 105. HibernateHQL
  106. 106. HibernateHQL  Funciones de agregación: • avg(), sum(), min(), max() • count(*) • count(distinct ...), count(all ...)  Queries polimorficas → “from Object”
  107. 107. HibernateHQL  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. 108. HibernateInterface org.hibernate.Criteria  Interface que representa una consulta a una clase persistente.  Se añaden restricciones o condiciones para filtrar la consulta.
  109. 109. HibernateHerencia  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. 110. HibernateHerencia
  111. 111. HibernateHerencia  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. 112. HibernateHerencia
  113. 113. HibernateHerencia
  114. 114. HibernateHerencia  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. 115. HibernateHerencia
  116. 116. Persistencia de datos FIN Iker Canarias iker.canarias@gmail.com

×