Prog Unidad 10
Prog Unidad 10
id=3390
Caso práctico
Ada ha asignado un proyecto a María y a Juan. Se trata de un proyecto importante, puede
suponer muchas ventas, y por tanto una gran expansión para la empresa.
Como en BK programación trabajan sobre todo con Java, desde el primer momento Juan y María tienen claro que van a tener
que utilizar bases de datos relacionales y JDBC y así lo comentan con Ada.
Casi todos los programas hoy día tienen la opción de guardar los datos con los que se trabaja.
Hasta ahora, ya conoces cómo abrir un archivo y utilizarlo como “almacén” para los datos que maneja tu
aplicación. Utilizar un archivo para almacenar datos es la forma más sencilla de persistencia, porque en
definitiva, la persistencia es hacer que los datos perduren en el tiempo.
Hay muchas formas de hacer los datos de una aplicación persistentes, y muchos niveles de persistencia.
Cuando los datos de la aplicación solo están disponibles mientras la aplicación se está ejecutando, tenemos un
nivel de persistencia muy bajo.
Es deseable que los datos de nuestra aplicación tengan el mayor nivel de persistencia posible.
Tendremos un mayor nivel de persistencia si los datos “sobreviven” a varias ejecuciones, o lo que es lo mismo, si nuestros datos se guardan y
luego son reutilizables con posterioridad. Tendremos un nivel todavía mayor si “sobreviven” a varias versiones de la aplicación, es decir, si
guardo los datos con la versión 1.0 de la aplicación y luego puedo utilizarlos cuando esté disponible la versión 2.0.
Ya hemos visto varias formas de hacer los datos de una aplicación persistentes, mediante ficheros, en una unidad anterior. Ahora, en esta
unidad, vamos a ver la forma de almacenar los datos en una base de datos de dos formas: primeramente en una base de datos relacional, y
después veremos cómo se haría con bases de datos orientadas a objetos.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 1/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Esos datos, se suelen guardar en bases de datos relacionales, ya que éstas son las más extendidas
actualmente.
Las bases de datos relacionales permiten organizar los datos en tablas y esas tablas y datos se
relacionan mediante campos clave. Además se trabaja con el lenguaje estándar conocido como SQL, para poder realizar las consultas que
deseemos a la base de datos.
Una base de datos relacional se puede definir de una manera simple como aquella que presenta la información en tablas con filas y columnas.
Una tabla es una serie de filas y columnas, en la que cada fila es un registro y cada columna es un campo. Un campo representa un
dato de los elementos almacenados en la tabla (NSS, nombre, etc.). Cada registro representa un elemento de la tabla (el equipo Real Madrid,
el equipo Real Murcia, etc.)
No se permite que pueda aparecer dos o más veces el mismo registro, por lo que uno o más campos de la tabla forman lo que se conoce
como clave primaria.
El sistema gestor de bases de datos, en inglés conocido como: Database Management System (DBMS), gestiona el modo en que los datos
se almacenan, mantienen y recuperan.
En el caso de una base de datos relacional, el sistema gestor de base de datos se denomina: Relational Database Management System
(RDBMS), que podríamos traducir por Sistema Gestor de Bases de Datos Relacionales.
Tradicionalmente, la programación de bases de datos ha sido como una Torre de Babel: gran cantidad de productos de bases de datos en el
mercado, y cada uno "hablando" en su lenguaje privado con las aplicaciones.
Java, mediante JDBC (Java Database Connectivity), permite simplificar el acceso a base de datos, proporcionando un lenguaje
mediante el cual las aplicaciones pueden comunicarse con motores de bases de datos. La empresa Sun desarrolló este API para el acceso a
bases de datos, con tres objetivos principales en mente:
Ser un API con soporte de SQL: poder construir sentencias SQL e insertarlas dentro de llamadas al API de Java.
Aprovechar la experiencia de los API de Bases de Datos existentes.
Ser sencillo.
Autoevaluación
JDBC permite acceder a bases de datos relacionales cuando programamos con Java, pudiendo así utilizar SQL.
Verdadero Falso
Verdadero
JBDC sirve para acceder a bases de datos relacionales con Java.
Clave primaria.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 2/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
El modelo relacional trata con relaciones y conjuntos debido a su naturaleza matemática. Sin embargo, el modelo de Programación
Orientada a Objetos trata con objetos y las asociaciones entre ellos. Por esta razón, el problema entre estos dos modelos surge en el
momento de querer hacer persistentes en la base de datos los objetos de negocio que maneja la aplicación.
La escritura (y de manera similar la lectura) mediante JDBC implica: abrir una conexión, crear una sentencia en SQL y copiar todos los valores
de las propiedades o atributos de un objeto en la sentencia, ejecutarla y así almacenar el objeto. Esto es sencillo para un caso simple, pero
trabajoso si el objeto posee muchas propiedades, o bien si se necesita almacenar un objeto que a su vez posee una colección de otros
elementos que también son objetos. Se necesita crear mucho más código, además del tedioso trabajo de creación de sentencias SQL.
Este problema es lo que denominábamos impedancia Objeto-Relacional, o sea, el conjunto de dificultades técnicas que surgen cuando una
base de datos relacional se usa en asociación con un programa escrito en un lenguajes de Programación Orientada a Objetos.
Podemos poner como ejemplo de desfase objeto-relacional, un equipo de fútbol, que tenga un atributo que sea una colección de objetos de la
clase Jugador. Cada jugador tiene un atributo "teléfono". Al transformar este caso a relacional se ocuparía más de una tabla para almacenar la
información, implicando varias sentencias SQL y bastante código.
Debes conocer
Si no has estudiado nunca bases de datos, ni tienes idea de qué es SQL o el modelo relacional, sería conveniente que te
familiarizaras con él. A continuación te indicamos un tutorial bastante ameno sobre SQL y que describe brevemente el modelo
relacional.
Tutorial SQL.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 3/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
1.2.- JDBC.
JDBC es un API Java que hace posible ejecutar sentencias SQL.
Con JDBC, no hay que escribir un programa para acceder a una base de datos Access, otro programa distinto
para acceder a una base de datos Oracle, etc., sino que podemos escribir un único programa con el API JDBC y el programa se encargará
de enviar las sentencias SQL a la base de datos apropiada. Además, y como ya sabemos, una aplicación en Java puede ejecutarse en
plataformas distintas.
En el desarrollo de JDBC, y debido a la confusión que hubo por la proliferación de API propietarios de acceso a datos, Sun buscó los aspectos
de éxito de un API de este tipo, ODBC (Open Database Connectivity).
ODBC se desarrolló con la idea de tener un estándar para el acceso a bases de datos en entornos Windows.
Aunque la industria ha aceptado ODBC como medio principal para acceso a bases de datos en Windows, ODBC no se introduce bien en el
mundo Java, debido a la complejidad que presenta ODBC, y que entre otras cosas ha impedido su transición fuera de entornos Windows.
El nivel de abstracción al que trabaja JDBC es alto en comparación con ODBC, la intención de Sun fue que supusiera la base de partida
para crear librerías de más alto nivel.
JDBC intenta ser tan simple como sea posible, pero proporcionando a los desarrolladores la máxima flexibilidad.
Autoevaluación
Verdadero Falso
Falso
ODBC se desarrolló para ser un estándar para el acceso a bases de datos en entornos Windows, y JDBC pretendió
recoger esta idea para construir un API genérico independiente de la plataforma.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 4/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Un conector o driver es un conjunto de clases encargadas de implementar las interfaces del API y acceder a la
base de datos.
Para poder conectarse a una base de datos y lanzar consultas, una aplicación necesita tener un conector
adecuado. Un conector suele ser un fichero .jar que contiene una implementación de todas las interfaces del
API JDBC.
Cuando se construye una aplicación de base de datos, JDBC oculta los detalles específicos de cada base de datos, de modo que al
programar nos ocupemos sólo de nuestra aplicación.
El código de nuestra aplicación no depende del driver, puesto que trabajamos contra los paquetesjava.sql y javax.sql.
Ejemplo:
En principio, todos los conectores deben ser compatibles con ANSI SQL-2 Entry Level (ANSI SQL-2 se refiere a los estándares adoptados por
el American National Standards Institute (ANSI) en 1992. Entry Level se refiere a una lista específica de capacidades de SQL). Los
desarrolladores de conectores pueden establecer que sus conectores conocen estos estándares.
Conectores JDBC
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 5/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Obviamente, instalar la base de datos. Dada la cantidad de productos de este tipo que hay en el mercado, es
imposible explicar la instalación de todas. Así que vamos a optar por una, en concreto por MySQL, ya que es un
sistema gestor gratuito y que funciona en varias plataformas.
Para instalar MySQL en Windows puedes seguir los pasos que te detallamos en la siguiente presentación,
descargando el instalador de la página oficial https://dev.mysql.com/downloads/installer/:
Resumen textual alternativo para Instalar MySQL
Si utilizas Linux, el sitio de descarga es el mismo que el indicado en la presentación anterior, y la instalación la puedes hacer con los pasos
que te indican en el enlace:
MariaDB.
Sobre Percona, aunque está en inglés, puedes ver en este artículo que está lanzando su base de datos con prestaciones
verdaderamente competentes respecto a los productos de Oracle:
Autoevaluación
Para programar accesos a MySQL hay que tener el driver JDBC para MySQL en nuestra aplicación.
Verdadero Falso
Verdadero
De no ser así será imposible conectarnos a la base de datos.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 6/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Caso práctico
María, Ada y Juan han realizado concienzudamente el diseño de las tablas necesarias para la
base de datos de la aplicación de notarías.
También se han decantado por el sistema gestor de bases de datos a utilizar. Emplearán un
sistema gestor de bases de datos relacional. Una vez instalado el sistema gestor, tendrán que
programar los accesos a la base de datos para guardar los datos, recuperarlos, realizar las
consultas para los informes y documentos que sean necesarios, etc.
En Java podemos conectarnos y manipular bases de datos utilizando JDBC. Pero la creación en sí de la base
de datos debemos hacerla con la herramienta específica para ello. Normalmente será el administrador de la
base de datos, a través de las herramientas que proporcionan el sistema gestor, el que creará la base de
datos. No todos los drivers JDBC soportan la creación de la base de datos mediante el lenguaje de definición
de datos (DDL).
Normalmente, cualquier sistema gestor de bases de datos incluye asistentes gráficos para crear la base de
datos con sus tablas, claves, y todo lo necesario.
También, como en el caso de MySQL, o de Oracle, y la mayoría de sistemas gestores de bases de datos, se Mircea Turcan
puede crear la base de datos, desde la línea de comandos de MySQL o de Oracle, con las sentencias SQL
apropiadas.
Vamos utilizar el sistema gestor de base de datos MySQL, por ser un producto gratuito y de fácil uso, además de muy potente.
Debes conocer
Veamos cómo crear paso a paso un esquema de base de datos con MySQL WorkBench, para usar en la aplicación de notarías,
y una tabla, la de clientes. Lo puedes ver en la siguiente presentación:
Resumen textual alternativo para "Crear tablas con MySQL"
Resumen textual alternativo para para "Instalar Oracle Express y crear tablas."
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 7/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
SQL es un lenguaje no procedimental en el cual se le indica al SGBDR qué queremos obtener y no cómo hacerlo. El
SGBDR analiza nuestra orden y si es correcta sintácticamente la ejecuta.
El estudio de SQL nos llevaría mucho más que una unidad, y es objeto de estudio en otros módulos de este ciclo
formativo. Pero como resulta imprescindible para poder continuar, haremos una mínima introducción sobre él.
Los que se utilizan para definir las estructuras de datos, llamados comandos DDL (Data Definition Language).
Los que se utilizan para operar con los datos almacenados en las estructuras, llamados DML (Data Manipulation Language).
Autoevaluación
Con las consultas SQL hay que especificar paso a paso cómo recuperar cada dato de la base de datos.
Verdadero Falso
Falso
Basta con decirle qué datos queremos y el sistema gestor se encarga de obtenerlos.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 8/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
La primera fase del trabajo con cualquier base de datos comienza con sentencias DDL, puesto que antes de
poder almacenar y recuperar información debemos definir las estructuras donde agrupar la información. Las
estructuras básicas con las que trabaja SQL son las tablas.
Como hemos visto antes, una tabla es un conjunto de celdas agrupadas en filas y columnas donde se
almacenan elementos de información.
Antes de llevar a cabo la creación de una tabla conviene planificar: nombre de la tabla, nombre de cada columna, tipo y tamaño de los datos
almacenados en cada columna, información adicional, restricciones, etc.
Hay que tener en cuenta también ciertas restricciones en la formación de los nombres de las tablas: longitud. Normalmente, aunque dependen
del sistema gestor, suele tener una longitud máxima de 30 caracteres, no puede haber nombres de tabla duplicados, deben comenzar con un
carácter alfabético, permitir caracteres alfanuméricos y el guión bajo '_', y normalmente no se distingue entre mayúsculas y minúsculas.
donde creamos la tabla con cod_dep como clave primaria. Además, se añade una restricción para comprobar que cuando se esté dando de
alta un registro, lo que se escriba en el campo loc sea Madrid, Barcelona o Murcia.
En el caso de esta tabla, se puede ver que hay un restricción para comprobar que el salario sea mayor que 0.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 9/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Caso práctico
Tanto Juan como María saben que trabajar con bases de datos relacionales en Java es
tremendamente sencillo, por lo que establecer una conexión desde un programa en Java, a una
base de datos, es muy fácil.
—Empleando la tecnología sólo necesitamos dos simples sentencias Java para conectar la
aplicación a la base de datos. María, prepárate que en un periquete tengo lista la conexión con la
base de datos y salimos a tomar un café.
Cuando queremos acceder a una base de datos para operar con ella, lo primero que hay que hacer es conectarse a
dicha base de datos.
En Java, para establecer una conexión con una base de datos podemos utilizar el método getConnection() de la clase
DriverManager. Este método recibe como parámetro la URL de JDBC que identifica a la base de datos con la que
queremos realizar la conexión.
La ejecución de este método devuelve un objeto Connection que representa la conexión con la base de datos.
Cuando se presenta con una URL específica, DriverManager itera sobre la colección de drivers registrados hasta que
uno de ellos reconoce la URL especificada. Si no se encuentra ningún driver adecuado, se lanza una SQLException.
Si probamos este ejemplo con NetBeans, o cualquier otro entorno, y no hemos instalado el conector para MySQL, en la consola obtendremos
el mensaje: Excepción: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 10/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Por tanto, como ya hemos comentado anteriormente, entre el programa Java y el Sistema Gestor de la Base de Datos (SGBD) se intercala el
conector JDBC. Este conector es el que implementa la funcionalidad de las clases de acceso a datos y proporciona la comunicación entre el
API JDBC y el SGBD.
La función del conector es traducir los comandos del API JDBC al protocolo nativo del SGBD.
Autoevaluación
Para establecer una conexión con una base de datos se puede usar getConnection().
Verdadero Falso
Verdadero
En efecto getConnection() se utiliza para conectarnos a una base de datos.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 11/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Hay que consultar la documentación del controlador que vamos a utilizar para conocer el nombre de la clase
que hay que emplear. En el caso del controlador para MySQL es "com.mysql.jdbc.Driver", o sea, que se trata
de la clase Driver que está en el paquete com.mysql.jdbc del conector que hemos descargado, y que has
observado que no es más que una librería empaquetada en un fichero .jar.
La línea de código necesaria en este caso, en la aplicación Java que estemos construyendo es: Bruno Cordioli
Hay que asegurarse de que si no utilizáramos NetBeans u otro IDE, para añadir el .jar como hemos visto, entonces el archivo .jar que contiene
el controlador JDBC para el SGBD habría que incluirlo en el CLASSPATH que emplea nuestra máquina virtual, o bien en el directorio ext del
JRE de nuestra instalación del JDK.
Hay una excepción en la que no hace falta ni hacer eso: en caso de utilizar un acceso mediante puente JDBC-ODBC, ya que ese driver está
incorporado dentro de la distribución de Java, por lo que no es necesario incorporarlo explícitamente en el classpath de una aplicación
Java. Por ejemplo, sería el caso de acceder a una base de datos Microsoft Access.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 12/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Caso práctico
Ada está echando una mano a Juan y María en la creación de consultas, para los informes que la
aplicación de notaría debe aportar a los usuarios de la misma.
Hacer consultas es una de las facetas de la programación que más entretiene a Ada, le resulta muy ameno
y fácil. Además, y dada la importancia del proyecto, cuanto antes avancen en él, mucho mejor.
Por suerte, los tres: Ada, María y Juan tienen experiencia en consultas SQL y saben que, cuando se hace
una consulta a una base de datos, hay que afinar y hacerla lo más eficiente posible, pues si se descuidan el
sistema gestor puede tardar mucho en devolver los resultados. Además, algunas consultas pueden
devolver un conjunto de registros bastante grande, que puede resultar difícil de manejar desde el programa,
ya que por norma general tendremos que manejar esos datos registro a registro.
Para operar con una base de datos ejecutando las consultas necesarias, nuestra aplicación deberá hacer las
operaciones siguientes:
Cargar el conector necesario para comprender el protocolo que usa la base de datos en cuestión.
Establecer una conexión con la base de datos.
Enviar consultas SQL y procesar el resultado.
Liberar los recursos al terminar.
Gestionar los errores que se puedan producir.
Consultas propiamente dichas: SELECT. Para las sentencias de consulta que obtienen datos de la base de datos, se emplea el
método ResultSet executeQuery(String sql). El método de ejecución del comando SQL devuelve un objeto de tipo ResultSet que sirve
para contener el resultado del comando SELECT, y que nos permitirá su procesamiento.
Actualizaciones: INSERT, UPDATE, DELETE, sentencias DDL. Para estas sentencias se utiliza el método executeUpdate(String sql).
Autoevaluación
Para poder enviar consultas a la base de datos hemos tenido que conectarnos a ella previamente.
Verdadero Falso
Verdadero
Así es, hay que cargar el driver y establecer la conexión.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 13/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Las consultas a la base de datos se realizan con sentencias SQL que van "embebidas" en otras sentencias
especiales que son propias de Java. Por tanto, podemos decir que las consultas SQL las escribimos como
parámetros de algunos métodos Java que reciben el String con el texto de la consulta SQL.
Las consultas devuelven un ResultSet, que es una clase Java parecida a una lista en la que se aloja el resultado
de la consulta. Cada elemento de la lista es uno de los registros de la base de datos que cumple con los
requisitos de la consulta.
El ResultSet no contiene todos los datos, sino que los va obteniendo de la base de datos según se van pidiendo. La razón de esto es evitar
que una consulta que devuelva una cantidad muy elevada de registros, tarde mucho tiempo en obtenerse y sature la memoria del programa.
Con el ResultSet hay disponibles una serie de métodos que permiten movernos hacia delante y hacia atrás en las filas, y obtener la
información de cada fila.
Por ejemplo, para obtener: nif, nombre, apellidos y telefono de los clientes que están almacenados en la tabla del mismo nombre, de la base
de datos notarbd que se creó anteriormente, haríamos la siguiente consulta:
El método next() del ResultSet hace que dicho puntero avance al siguiente registro. Si lo consigue, el método next() devuelve true. Si no lo
consigue, porque no haya más registros que leer, entonces devuelve false.
ResulSet
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 14/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Para obtener una columna del registro utilizamos los métodos get. Hay un método get... para cada tipo básico
Java y para las cadenas.
Un método interesante es wasNull() que nos informa si el último valor leído con un método get es nulo.
Cuando trabajamos con el ResultSet, en cada registro, los métodos getInt(), getString(), getDate(), etc., nos
devuelve los valores de los campos de dicho registro. Podemos pasar a estos métodos un índice (que comienza
en 1) para indicar qué columna de la tabla de base de datos deseamos, o bien, podemos usar un String con el
nombre de la columna (tal cual está en la tabla de base de datos).
Autoevaluación
Para obtener un entero almacenado en uno de los campos de un registro, trabajando con el ResulSet emplearemos el
método getInt().
Verdadero Falso
Verdadero
Eso es. Hay un getString() para cadenas, getDate() para fechas, etc.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 15/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Supongamos que tenemos varios registros en la tabla Cliente, de la base de datos notarbd con la que seguimos trabajando. Si quisiéramos
actualizar el teléfono del tercer registro, que tiene idCLIENTE=3 y ponerle como nuevo teléfono el 968610009 tendríamos que hacer:
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 16/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Autoevaluación
Al añadir registros a una tabla de una base de datos, tenemos que pasar como parámetro al executeUpdate(), una
sentencia SQL del tipo: DELETE...
Verdadero Falso
Falso
Se le debe pasar una sentencia de tipo INSERT INTO.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 17/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Cuando nos interese eliminar registros de una tabla de una base de datos, emplearemos la sentencia SQL: DELETE. Así, por ejemplo, si
queremos eliminar el registro a la tabla Cliente, de nuestra base de datos y correspondiente a la persona que tiene el NIF: 66778998T,
tendremos que utilizar el código siguiente.
Autoevaluación
Al ejecutar el borrado de un registro mediante executeUpdate(…), no podemos saber si el borrado eliminó alguna fila o
no.
Verdadero Falso
Falso
Efectivamente podemos saberlo porque se devuelve el número de registros borrados, como hemos visto en el código del
ejemplo anterior.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 18/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
También conviene cerrar las consultas (Statement y PreparedStatement) y los resultados (ResultSet) para liberar los
recursos.
Sófocles.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 19/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
1.7.6.- Excepciones.
En todas las aplicaciones en general, y por tanto en las que acceden a bases de datos en particular, nos puede ocurrir
con frecuencia que la aplicación no funciona, no muestra los datos de la base de datos que deseábamos, etc.
Es importante capturar las excepciones que puedan ocurrir para que el programa no aborte de manera abrupta. Además,
es conveniente tratarlas para que nos den información sobre si el problema es que se está intentando acceder a una
base de datos que no existe, o que el servicio MySQL no está arrancado, o que se ha intentado hacer alguna operación
no permitida sobre la base de datos, como acceder con un usuario y contraseña no registrados, ...
Por tanto es conveniente emplear el método getMessage() de la clase SQLException para recoger y mostrar el mensaje
de error que ha generado MySQL, lo que seguramente nos proporcionará una información más ajustada sobre lo que
está fallando.
Es importante que las operaciones de acceso a base de datos estén dentro de un bloque try-catch que gestione las excepciones.
Los objetos del tipo SQLException tienen dos métodos muy útiles para obtener el código del error producido y el mensaje descriptivo del
mismo, getErrorCode() y getMessage() respectivamente.
El método getMessage()devuelve el mensaje de error asociado a la excepción que se ha producido, que aunque esté en inglés, nos ayuda a
saber qué ha generado el error que causó la excepción. El método getErrorCode(), devuelve un número entero que representa el código de
error asociado. Habrá que consultar en la documentación para averiguar su significado.
Autoevaluación
El cierre de las conexiones y la gestión de excepciones sólo hay que efectuarla con bases de datos MySQL.
Verdadero Falso
Falso
Siempre hay que gestionarlos con cualquier base de datos.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 20/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Caso práctico
Antonio esta mañana está muy contento, y todo es porque una aplicación que estaba haciendo,
le ha funcionado. Es una aplicación sencilla que le ha pedido Juan, destinada a organizar la lista
de clientes de un pequeño taller mecánico. La aplicación permite introducir los datos de los
conductores y las conductoras que acuden al taller, recopilando sus direcciones de correo
electrónico y sus teléfonos.
—Hola Juan. Hoy he traído la aplicación del taller que te dije, para que me des tu opinión —dice Antonio.
—Muy bien —contesta Juan—, seguro que será una aplicación estupenda.
—Bueno, todavía me falta mucho por hacer, pero ya se puede utilizar. ¡Mira, aquí está!
Después de un rato, en el que Antonio le enseña cómo funciona la aplicación, Juan hace un comentario inesperado:
—Está muy bien la verdad, ya solamente te queda hacer los datos persistentes, usarás una base de datos orientada a objetos
para ello, ¿verdad? —dice Juan.
Antonio responde que sí, pero realmente no sabe muy bien a qué se refiere con lo de base de datos orientada a objetos, por lo
que se queda un poco desconcertado.
En este apartado, vamos a explorar otra forma de hacer persistentes los datos. Ahora te vamos a proponer un enfoque
diferente para almacenar los datos: vamos a utilizar bases de datos orientadas a objetos para hacer los datos de tu
aplicación persistentes.
Pero para hacer esto, primero tienes que aprender qué son las bases de datos orientadas a objetos, en adelante
llamadas BDOO, y aprender a usarlas en tu aplicación. Comprobarás que con las BDOO hacer los datos persistentes
es más fácil y práctico de lo que imaginabas.
Hoy en día, uno de los retos más interesantes del mundo de la informática, es simplificar la gestión de datos. Seguro
que estarás de acuerdo en que es imprescindible guardar los datos de la aplicación, pero hay que reconocer que es
una de las tareas más engorrosas, sobre todo si se trata de ir guardando los datos en archivos.
Las técnicas de persistencia persiguen, básicamente, un objetivo muy noble: hacer la vida más fácil al programador o a Ken Fager
la programadora, simplificando para ello los mecanismos para guardar los datos. A continuación vamos a revisar
algunas de las técnicas existentes para realizar la persistencia, valorando cómo simplifican el acceso a los datos:
Almacenamiento directo en archivos. Almacenar los datos directamente en archivos es, como ya sabes, una de las técnicas de
persistencia más usada, pero no es sencilla de implementar. Implementar la persistencia en archivos suele ser costoso y de difícil
mantenimiento.
Sistema gestor de bases datos (SGDB). Usar un sistema SGDB es una de las soluciones más recurridas. Los datos son
gestionados por el SGDB, garantizando consistencia y seguridad en los mismos. Desde la aplicación se accede a los datos
usando una API específica, como JDBC en el caso de bases de datos relacionales, y usando un lenguaje de consulta de datos, como
SQL. Aunque los SGDB facilitan la gestión de datos, todavía se buscan soluciones de programación más cómodas.
Mapeado de objetos. El mapeado de objetos simplifica bastante la utilización de las bases de datos. Se trata básicamente de técnicas
que permiten almacenar objetos de un lenguaje de programación, como Java, directamente en la base de datos. Generalmente,
necesitan de lo que denominamos motor de persistencia.
Extensiones de lenguajes de programación tradicionales para facilitar el acceso a datos. Este tipo de técnicas amplían la
funcionalidad de los lenguajes de programación tradicionales, como Cobol, C, C++, C# o Java, para hacer más sencillo el acceso a los
datos. SQLJ o PRO*C son algunos ejemplos de extensiones de los lenguajes Java y C respectivamente. Algunas de estas extensiones,
como LINQ, están pensadas para varios lenguajes de programación.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 21/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Pero cuando la aplicación requiere otras necesidades, como por ejemplo, soporte multimedia, almacenar
objetos muy cambiantes y complejos en estructura y relaciones, este tipo de base de datos no son las
más adecuadas. Recuerda, que si queremos representar un objeto y su relaciones en una BDR esto
implica que:
A mayor complejidad, mayor número de tablas, de manera que se requieren muchos enlaces (joins) para recuperar un objeto, lo cual
disminuye dramáticamente el rendimiento.
Las Bases de Datos Orientadas a Objetos (BDOO) o Bases de Objetos se integran directamente y sin problemas con las aplicaciones
desarrolladas en lenguajes orientados a objetos, ya que soportan un modelo de objetos puro y son ideales para almacenar y recuperar
datos complejos permitiendo a los usuarios su navegación directa (sin un mapeo entre distintas representaciones).
Las Bases de Objetos aparecieron a finales de los años 80 motivadas fundamentalmente por dos razones:
Las necesidades de los lenguajes de Bases de Datos Orientadas a Objetos (POO), como la necesidad de persistir objetos.
Las limitaciones de las bases de datos relacionales, como el hecho de que sólo manejan estructuras muy simples (tablas) y tienen poca
riqueza semántica.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 22/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Caso práctico
Ana se ha llevado a la empresa sus apuntes sobre bases de datos y acceso a datos del ciclo
formativo, y ha empezado a repasar con Juan las características de las Bases de datos
Orientadas a Objetos.
—¡Pero claro!, —le dice Juan a Ana— habrá que detenerse en valorar tanto las posibles ventajas
como los inconvenientes de estas bases de datos, ya que tenemos que elegir el sistema de
almacenamiento óptimo para esta aplicación. Ya sabes que no podemos fallar. ¡Somos los
mejores! —y le sonríe.
En una BDOO, los datos se almacenan como objetos. Un objeto es, al igual que en POO, una entidad que se puede identificar unívocamente
y que describe tanto el estado como el comportamiento de una entidad del 'mundo real'. El estado de un objeto se describe mediante
atributos y su comportamiento es definido mediante procedimientos o métodos.
Entonces, ¿a qué equivalen las entidades, ocurrencias de entidades y relaciones del modelo relacional?
Las entidades son las clases, las ocurrencias de entidad son objetos creados desde las clases, las
relaciones se mantienen por medio de inclusión lógica, y no existen claves primarias, los objetos tienen
un identificador.
La principal característica de las BDOO es que soportan un modelo de objetos puro y que el
lenguaje de programación y el esquema de la base de datos utilizan las mismas definiciones de
tipos.
Otras características importantes de las BDOO son las siguientes: Ayleen Gaspar
Soportan las características propias de la Orientación a Objetos como agregación, encapsulamiento, polimorfismo y herencia. La
herencia se mantiene en la propia base de datos.
Identificador de objeto (OID). Cada objeto tiene un identificador, generado por el sistema, que es único para cada objeto, lo que
supone que cada vez que se necesite modificar un objeto, habrá que recuperarlo de la base de datos, hacer los cambios y almacenarlo
nuevamente. Los OID son independientes del contenido del objeto, esto es, si cambia su información, el objeto sigue teniendo el mismo
OID. Dos objetos serán equivalentes si tienen la misma información pero diferentes OID. Podemos afirmar que dos objetos son iguales
cuando los valores de sus propiedades observables son iguales. Por otro lado, dos objetos son idénticos cuando al modificar una
propiedad observable de uno de ellos, se produce una modificación en la del otro y viceversa.
Jerarquía y extensión de tipos. Se pueden definir nuevos tipos basándose en otros tipos predefinidos, cargándolos en una jerarquía
de tipos (o jerarquía de clases).
Objetos complejos. Los objetos pueden tener una estructura de objeto de complejidad arbitraria, a fin de contener toda la información
necesaria que describe el objeto.
Acceso navegacional de datos. Cuando los datos se almacenan en una estructura de red densa y probablemente con una estructura
de diferentes niveles de profundidad, el acceso a datos se hace principalmente navegando la estructura de objetos y se expresa de
forma natural utilizando las construcciones nativas del lenguaje, sin necesidad de uniones o joins típicas en las bases de datos
relacionales.
Gestión de versiones. El mismo objeto puede estar representado por múltiples versiones. Muchas aplicaciones de bases de datos que
usan orientación a objetos requieren la existencia de varias versiones del mismo objeto, ya que si estando la aplicación en
funcionamiento es necesario modificar alguno de sus módulos, el diseñador deberá crear una nueva versión de cada uno de ellos para
efectuar cambios.
Autoevaluación
Señala las opciones correctas. Las bases de datos orientadas a objetos:
Tienen el mismo tipo de problemas que las relacionales para gestionar objetos complejos.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 23/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Mostrar retroalimentación
Solución
1. Correcto
2. Correcto
3. Incorrecto
4. Correcto
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 24/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Una de las principales ventajas de los sistemas de bases de datos orientados a objetos es la
transparencia, (manipulación directa de datos utilizando un entorno de programación basado en objetos),
por lo que el programador, solo se debe preocupar de los objetos de su aplicación, en lugar de cómo los
debe almacenar y recuperar de un medio físico.
Otras ventajas de un sistema de bases de datos orientado a objetos son las siguientes:
Gran capacidad de modelado. El modelado de datos orientado a objetos permite modelar el 'mundo real' de una manera óptima
gracias al encapsulamiento y la herencia.
Flexibilidad. Permiten una estructura cambiante con solo añadir subclases.
Soporte para el manejo de objetos complejos. Manipula de forma rápida y ágil objetos complejos, ya que la estructura de la base de
datos está dada por referencias (apuntadores lógicos) entre objetos.
Alta velocidad de procesamiento. Como el resultado de las consultas son objetos, no hay que reensamblar los objetos cada vez que
se accede a la base de objetos
Extensibilidad. Se pueden construir nuevos tipos de datos a partir de los ya existentes, agrupar propiedades comunes de diversas
clases e incluirlas en una superclase, lo que reduce la redundancia.
Mejora los costes de desarrollo, ya que es posible la reutilización de código, una de las características de los lenguajes de
programación orientados a objetos.
Facilitar el control de acceso y concurrencia, puesto que se puede bloquear a ciertos objetos, incluso en una jerarquía completa de
objetos.
Funcionan de forma eficiente en entornos cliente/servidor y arquitecturas distribuidas.
Pero aunque los sistemas de bases de datos orientados a objetos pueden proporcionar soluciones apropiadas para muchos tipos de
aplicaciones avanzadas de bases de datos, también tienen sus desventajas. Éstas son las siguientes:
Carencia de un modelo de datos universal. No hay ningún modelo de datos aceptado universalmente, y la mayor parte de los
modelos carecen de una base teórica.
Falta de estándares. Existe una carencia de estándares general para los sistemas de BDOO.
Complejidad. La estructura de una BDOO es más compleja y difícil de entender que la de una base de datos relacional.
Competencia de otros modelos. Las bases de datos relacionales y objeto-relacionales están muy asentadas y extendidas, siendo un
duro competidor.
Difícil optimización de consultas. La optimización de consultas requiere una compresión de la implementación de los objetos, para
poder acceder a la base de datos de manera eficiente. Sin embargo, esto compromete el concepto de encapsulación.
Autoevaluación
Señala si la siguiente afirmación es verdadera o falsa.
En una BDOO el resultado de una consulta son objetos, por lo que no es necesario reensamblar los objetos cada vez
que se accede a la base de datos.
Verdadero Falso
Verdadero
Es verdadero, precisamente ésta es una de las ventajas de estos sistemas de almacenamiento.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 25/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Caso práctico
Esta mañana, Juan ha preparado una serie de sistemas de bases de objetos diferentes, para
instalarlos e ir probando algunas de sus características. La empresa tiene el encargo de hacer
una pequeña aplicación que sirva para gestionar las ponencias de un congreso que se va a
realizar próximamente, y podría ser una buena opción de utilizar una base de datos orientada a
objetos como sistema de almacenamiento de la información.
Juan le pregunta a Ana —¿Sabes qué al contrario de las bases de datos relacionales, los
gestores de bases de datos orientados a objetos pueden llegar a ser muy diferentes entre sí?
A lo que Ana responde —Sí, en clase estuvimos trabajando con diferentes sistemas, precisamente para dar fe de ello, y...,
quiero recordar que había una que tenía el nombre de un pintor francés. ¿Matisse?
—Efectivamente —dice Juan—, pero hoy he pensado en ver la base de objetos db4o, que es la que actualmente utiliza el
sistemas de trenes español AVE. ¿Lo sabías?
Un Sistema Gestor de Bases de Datos Orientada a Objetos (SGBDOO) y en inglés ODBMS, Object
Database Management System) es un software específico, dedicado a servir de interfaz entre la base de
objetos, el usuario y las aplicaciones que la utilizan. Un SGBDOO incorpora el paradigma de Orientación a
Objetos y permite el almacenamiento de objetos en soporte secundario:
Por ser SGBD debe incluir mecanismos para optimizar el acceso, gestionar el control de concurrencia,
la seguridad y la gestión de usuarios, así como facilidar la consulta y recuperación ante fallos.
Por ser OO incorpora características de identidad, encapsulación, herencia, polimorfismo y control de
tipos.
Cuando aparecieron las bases de datos orientadas a objetos, un grupo formado por desarrolladores y usuarios de bases de objetos,
denominado ODMG (Object-Oriented Database Management Group), propuso un estándar que se conoce como estándar ODMG-93 y que se
ha ido revisando con el tiempo, pero que en realidad no ha tenido mucho éxito, aunque es un punto de partida.
Debes conocer
En el Anexo de la unidad puedes observar un resumen de las características del estándar ODMG.
¿Qué estrategias o enfoques se siguen para el desarrollo de SGBDOO? Básicamente, las siguientes:
Tal y como estarás pensando, la carencia de un estándar real hace difícil el soporte para la portabilidad de aplicaciones y su
interoperabilidad, y es en parte por ello, que a diferencia de las bases de datos relacionales donde hay muchos productos donde elegir, la
variedad de sistemas de bases de datos orientadas a objetos es mucho menor. En la actualidad hay diferentes productos de este tipo, tanto
con licencia libre como propietaria.
db4o de Versant. Es una BDOO Open Source para Java y .NET. Se distribuye bajo licencia GPL.
Matisse. Es un SGBOO basado en la especificación ODMG, proporciona lenguajes para definición y manipulación de objetos, así como
interfaces de programación para C, C++, Eiffel y Java.
ObjectDB. Es una BDOO que ofrece soporte para Java, C++, y Python entre otros lenguajes. No es un producto libre, aunque ofrecen
versiones de prueba durante un periodo determinado.
EyeDB. Es un SGBOO basado en la especificación ODMG, proporciona lenguajes para definición y manipulación de objetos, e
interfaces de programación para C++ y Java. Se distribuye bajo licencia GNU y es software libre.
Neodatis, ObjectStore y GemStone son otros SGBDOO.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 26/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Un objeto de tipo simple u objeto simple es aquel que no contiene a otros objetos y por tanto posee
una estructura de un solo nivel de profundidad en este sentido.
Un objeto de tipo estructurado u objeto estructurado incluye entre sus componentes a otros objetos y
se define aplicando los constructores de tipos disponibles por el SGBDOO recursivamente a varios
niveles de profundidad.
Entre un objeto y sus componentes de cada nivel, existen dos tipos de referencia:
Referencia de propiedad. Se aplica cuando los componentes de un objeto se encapsulan dentro del propio objeto y se consideran, por
tanto, parte de ese objeto. Relación es-parte-de. No necesitan tener identificadores de objeto y sólo los métodos de ese objeto pueden
acceder a ellos. Desaparecen si el propio objeto se elimina.
Referencia de asociación. Se aplica cuando entre los componentes del objeto estructurado existen objetos independientes, pero es
posible hacer referencia a ellos desde el objeto estructurado. Relación está-asociado-con. Cuando un objeto estructurado tiene que
acceder a sus componentes referenciados, lo hace invocando los métodos apropiados de los componentes, ya que no están
encapsulados dentro del objeto estructurado.
Por ejemplo, si observas la figura superior derecha, en un objeto tipo Oficina los componentes codigo y dirección son_parte_del objeto,
mientras que el componente jefe, es un objeto independiente que está_asociado_con el objeto oficina.
Entonces, ¿las referencias de asociación son como las relaciones del modelo relacional? Así es:
La referencia de asociación representa las relaciones o interrelaciones entre objetos independientes, dando la posibilidad de que los
objetos puedan detectarse mutuamente en una o dos direcciones, (lo que en el modelo relacional representamos mediante claves
ajenas o foráneas que provienen de relaciones uno a uno, uno a muchos y muchos a muchos).
Una relación uno a muchos se representa mediante un objeto tipo colección (List, Set, etc.). En una BDOO la colección se maneja como
cualquier otro objeto (aunque potencialmente profundo) y normalmente se podrá recuperar y almacenar el objeto padre junto con la
colección asociada y su contenido en una sola llamada.
Además, un objeto miembro referenciado puede ser referenciado por más de un objeto estructurado y, no se elimina automáticamente cuando
se elimina el objeto del nivel superior.
Debes conocer
Aunque ya conocemos las colecciones en Java, en este interesante enlace puedes repasar y aprender más sobre ellas:
Autoevaluación
Señala si la siguiente afirmación es verdadera o falsa.
Verdadero
Es verdadero, efectivamente es estructurado cuando contiene a otro u otros objetos y en diferentes niveles de profundidad.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 27/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Una de las ventajas de db4o es que es un simple fichero .jar distribuible con cualquier aplicación sin necesidad de tener que instalar nada.
Tampoco necesita drivers de tipo JDBC o similar.
Instalar el motor de base de datos, que son las clases necesarias para hacer que funcione la API en toda su extensión.
Instalar alguna aplicación para visualizar los datos con los que se está trabajando. Esto último es necesario, pues en otro caso se
trabajaría a ciegas con los datos.
En el siguiente recurso didáctico encontrarás un tutorial con los pasos a seguir para la descarga del software db4o y realizar su instalación e
integración con el IDE NetBeans.
Resumen textual alternativo
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 28/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Caso práctico
Ana no puede negar su entusiasmo con el hecho de participar en el desarrollo del nuevo
proyecto. Cuando estudió el ciclo formativo, nunca pensó que llegaría a trabajar tan de cerca con
las bases de datos avanzadas. Ha pasado en el descanso a ver a su amigo Antonio y ponerlo al
día de los avances que va realizando junto a Juan. Hoy le espera un ardua sesión de trabajo,
familiarizarse con el API de la base de objetos db4o.
com.db4o. Paquete principal (core) de la Base de Objetos. Las interfaces y clases más importantes que
incluye son:
ObjectContainer. Es la interfaz que permite realizar las principales tareas con la base de objetos. Un ObjectContainer puede
representar una base de datos independiente (stand-alone) o una conexión a un servidor (en línea cliente-servidor). Esta
interfaz proporciona métodos para:
almacenar: store(),
consultar: queryByExample() y
eliminar objetos de la base de datos: delete(),
así como cerrar la conexión con dicha base de datos: close().
También permite confirmar transacciones: commit y
deshacer transacciones: rollback.
EmbeddedObjectContainer. Es una interfaz que extiende a ObjectContainer y representa un ObjectContainer local atacando a la
base de datos.
Db4oEmbedded. Es una clase que proporciona métodos estáticos para conectar con la base de datos en modo embebido.
ObjectServer. Es la interfaz que permite trabajar con una base de datos db4o en modo cliente-servidor.
ObjectSet. Es una interfaz que representa el conjunto de objetos devueltos por una consulta.
com.db4o.query. Paquete con funcionalidades de consulta. Proporciona interfaces que permiten establecer las condiciones y criterios de
un consulta y una clase para realizar consultas mediante Native Query (Consultas nativas).
com.db4o.config. Paquete con funcionalidades de configuración. Contiene interfaces y clases que nos permiten configurar y/o
personalizar la base de objetos según necesidades. La configuración de la base de objetos se hace por norma general antes de abrir la
sesión en la misma.
EmbeddedConfiguration. Es la interface de configuración para el uso en modo embebido.
Siempre que trabajemos con bases de objetos db4o utilizaremos el interface ObjectContainer, puesto que es quien representará a la base de
objetos, sea embebida o no.
La documentación del API viene en formato JavaDoc y la puedes encontrar en el directorio /doc/api del fichero .zip descargado y
descomprimido.
Autoevaluación
Señala si la siguiente afirmación es verdadera o falsa.
Un ObjectContainer es un interfaz que proporciona, entre otros, los métodos store(), queryByExample(), close() y delete().
Verdadero Falso
Verdadero
Es verdadero, es el interfaz que permite realizar las principales tareas con la base de datos.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 29/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
JDBC.
El API proporcionado por el propio gestor de objetos.
En el caso de db4o, el paquete com.db4o proporciona las clases e interfaces que permiten abrir conexiones a una base de objetos db4o, así
como el cierre de la misma. Estas son:
Declarar un ObjectContainer.
Abrir una conexión a la base de objetos (openFile()). Si al abrir la BDOO esta no existe, se creará.
Realizar operaciones con la base de objetos como consultas, borrados y modificaciones (en un bloque try{ } catch (){ } ).
Cierre o desconexión de la base de objetos (close()).
En el siguiente recurso didáctico tienes un ejemplo de apertura, creación y cierre a una base de objetos en modo embebido. En la BDOO
creada se almacenan 4 objetos mediante el método store().
Resumen textual alternativo
Código del ejemplo de creación de una base de objetos db4o. (17 KB)
Autoevaluación
Señala la opción correcta. Para cerrar una conexión a una base de datos db4o se utiliza el método:
closedb().
Solución
1. Incorrecto
2. Incorrecto
3. Incorrecto
4. Opción correcta
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 30/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Un lenguaje de consultas como OQL, si el gestor está basado en el estándar ODMG e incluye sentencias del tipo SQL.
El API proporcionado por el propio sistema gestor de bases de datos orientadas a objetos.
Los tres sistemas de consulta que proporciona Db4o basados en el API del propio gestor, son los siguientes:
Consultas por ejemplo. Query By Example (QBE). Es la forma más sencilla y básica de realizar consultas, pero tienen bastantes
limitaciones.
Consultas nativas. Native Queries (NQ). Es la interface principal de consultas de la base de objetos. Permiten realizar un filtro contra
todas las instancias de la base de objetos.
Consultas SODA. Simple Object Data Access (SODA). Permite generar consultas dinámicas. Es más potente que las anteriores y
más rápida puesto que las anteriores (QBE y NQ) tienen que ser traducidas a SODA para ejecutarse.
En el siguiente recurso didáctico encontrarás un resumen y ejemplos de estos sistemas de consulta. Los ejemplos se realizan sobre la base
de objetos Congreso.
Resumen textual alternativo
Desde el siguiente enlace puedes descargar el proyecto completo en el que se realizan consultas por los diferentes sistemas vistos
anteriormente a la base de objetos congreso.db4o.
Código del ejemplo de diferentes sistemas de consulta a la base de objetos. (20,4 KB)
Autoevaluación
Señala la opción correcta. Las consultas SODA en db4o:
Solución
1. Incorrecto
2. Opción correcta
3. Incorrecto
4. Incorrecto
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 31/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Para consultar objetos simples se pueden utilizar cualquiera de los tres sistemas de consulta proporcionados por db4o, tal y como has
podido ver en el apartado anterior.
RonLD
Por ejemplo, el siguiente método permitirá modificar objetos ponente, en concreto actualizar el e-mail de ponentes por nif de ponente:
db4o necesita conocer previamente un objeto para poder actualizarlo. Esto significa que para poder ser actualizados los objetos,
éstos deben de haber sido insertados o recuperados en la misma sesión; en otro caso se añadirá otro objeto en vez de
actualizarse.
Desde el siguiente enlace puedes descargar el proyecto completo. Comprueba los resultados de su ejecución.
Autoevaluación
Señala si la siguiente afirmación es verdadera o falsa.
Verdadero
Es verdadero, pues si no es un objeto insertado o recuperado en la misma sesión, db4o creará un nuevo objeto.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 32/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
En el caso de objetos estructurados se habla de diferentes niveles de profundidad del objeto. El nivel más
alto, nivel 1, será el que corresponde a la definición del objeto estructurado (objeto padre), el siguiente nivel,
nivel 2, corresponderá a la definición del objeto hijo y así sucesivamente podrá haber un nivel 3, 4,...
dependiendo de que los objetos hijos a su vez incluyan en su definición a otro u otros objetos miembro.
En el siguiente ejemplo, definimos la clase Charla (objeto estructurado padre) que incorpora a un objeto
Ponente (objeto miembro). El nivel más alto de profundidad o nivel 1 es el que corresponde a la definición de
charla y el nivel 2 corresponderá a la definición del objeto ponente.
Los objetos estructurados se almacenan asignando valores con set() y después persistiendo el objeto con store(). Al almacenar un
objeto estructurado del nivel más alto, se almacenarán de forma implícita todos los objetos hijo.
Las consultas se realizan por cualquiera de los sistemas soportados por el gestor y se podrá ir descendiendo por los diferentes niveles
de profundidad.
La eliminación o borrado de un objeto estructurado se realiza mediante el método delete(). Por defecto, no se eliminarán los objetos
miembro. Para eliminar objetos estructurados en cascada o de forma recursiva, eliminando los objetos miembro, habrá que configurar de
modo apropiado la base de objetos antes de abrirla, mediante el paquete com.db4o.config. En el caso de modo embebido, se hará
mediante la interface EmbeddedConfiguration. En la nueva configuración se debe indicar cascadeOnDelete(true).
La modificación se realizará actualizando los nuevos valores mediante el método set(). Por defecto las modificaciones solo afectan al
nivel más alto. Para actualizar de forma recursiva todos los objeto miembro habrá que indicar en la configuración
cascadeOnUpdate(true).
Desde el siguiente enlace puedes descargar el proyecto completo que realiza diferentes consultas y actualización de objetos estructurados.
En este otro enlace dispones de un ejemplo con eliminación y modificación de charlas en cascada.
"No basta saber, se debe también aplicar. No es suficiente querer, se debe también hacer".
Johann W. Goethe
Autoevaluación
Señala si la siguiente afirmación es verdadera o falsa.
Verdadero Falso
Falso
Es falso, para actualizar los objetos hijo al actualizar el objeto padre habrá que indicarlo expresamente, por ejemplo en
db4o sería mediante cascadeOnUpdate(true).
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 33/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Caso práctico
—¡Por fin ha llegado el viernes! —dice Ana a Juan, y continúa— después de estas dos últimas
semanas revisando sistemas orientados a objeto ¡he terminado agotada!, pero el esfuerzo me ha
compensado. Ahora tengo mucho más claro, las características de una base de datos orientada a
objetos. Pero... —se queda pensativa por un instante y entonces continúa— las transacciones,
¿se gestionan de manera similar a como se hacen en un sistema gestor relacional?
Juan le responde, —justo es eso lo que nos queda por ver, Ana. ¿Empezamos hoy o lo dejamos
para el lunes?
Ana sonríe y le dice —Creo que Ada viene para acá, ¿no oyes sus pasos?
Como en cualquier otro Sistema de Bases de datos, en un Sistema de bases de objetos u objeto relacional, una transacción es un conjunto
de sentencias que se ejecutan formando una unidad de trabajo, esto es, en forma indivisible o atómica, o se ejecutan todas o no se ejecuta
ninguna.
Mediante la gestión de transacciones, los sistemas gestores proporcionan un acceso concurrente a los datos
almacenados, mantienen la integridad y seguridad de los datos, y proporcionan un mecanismo de
recuperación de la base de datos ante fallos.
Un ejemplo habitual para motivar la necesidad de transacciones es el traspaso de una cantidad de dinero
(digamos 10000€) entre dos cuentas bancarias. Normalmente se realiza mediante dos operaciones distintas,
una en la que se decrementa el saldo de la cuenta origen y otra en la que incrementamos el saldo de la
cuenta destino.
Para garantizar la integridad del sistema (es decir, para que no aparezca o desaparezca dinero), las dos
Adam Prince
operaciones tienen que completarse por completo, o anularse íntegramente en caso de que una de ellas falle.
Atomicidad. Se deben cumplir todas las operaciones de la transacción o no se cumple ninguna; no puede quedar a medias.
Consistencia. La transacción solo termina si la base de datos queda en un estado consistente.
Isolation (Aislamiento). Las transacciones sobre la misma información deben ser independientes, para que no interfieran sus
operaciones y no se produzca ningún tipo de error.
Durabilidad. Cuando la transacción termina el resultado de la misma perdura, y no se puede deshacer aunque falle el sistema.
Algunos sistemas proporcionan también puntos de salvaguarda (savepoints) que permiten descartar selectivamente partes de la
transacción, justo antes de acometer el resto. Así, después de definir un punto como punto de salvaguarda, puede retrocederse al mismo.
Entonces se descartan todos los cambios hechos por la transacción después del punto de salvaguarda, pero se mantienen todos los
anteriores.
Originariamente, los puntos de salvaguarda fueron una aportación del estándar SQL99 de las Bases de Datos Objeto-Relacionales. Pero con
el tiempo, se han ido incorporando también a muchas Bases de Datos Relaciones como MySQL (al menos cuando se utiliza la tecnología de
almacenamiento InnoDB).
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 34/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Un fallo causa un rollback de los datos, como normalmente sucede en las bases de datos relacionales. En cuanto a la concurrencia, las
bases de objetos verifican en qué momento permiten el acceso en paralelo a los datos. Este acceso concurrente implica que más de una
aplicación o hilo podrían estar leyendo o actualizando los mismos objetos a la vez. Esto se suele denominar commit de dos fases (dos
procesos pueden trabajar sobre el mismo objeto concurrentemente). Para ello se utiliza normalmente bloqueo de datos para lecturas y
escrituras.
Por ejemplo, podemos deshacer una transacción con rollback, restaurando la base de objetos al estado anterior, justo al estado después del
último commit o rollback.
En el siguiente ejemplo, al ejecutar db.rollback después de db.store(p3) y db.store(p4), hará que los objetos p3 y p4 no se almacenen en la
base de objetos.
Autoevaluación
Señala si la siguiente afirmación es verdadera o falsa.
Verdadero Falso
Verdadero
Es verdadero, con rollback se deshacen transacciones.
Desde el siguiente enlace puedes ver una presentación tipo resumen con muchos de los aspectos tratados en esta unidad.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 35/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
El estándar ODMG (Object Database Management Group) trata de estandarizar conceptos fundamentales de los Sistemas Gestores de
Bases de Datos Orientados a Objetos (SGBDOO) e intenta definir un SGBDOO como un sistema que integra las capacidades de las
bases de datos con las capacidades de los lenguajes de programación orientados a objetos, de manera que los objetos de la base de
datos aparezcan como objetos del lenguaje de programación.
Fué desarrollado entre los años 1993 y 1994 por representantes de un amplio conjunto de empresas relacionadas con el desarrollo de
software y sistemas orientados a objetos.
Un modelo de objetos que permite que tanto los diseños, como las implementaciones, sean portables entre los sistemas que lo
soportan.
Un sistema de gestión que soporta un lenguaje de bases de datos orientado a objetos, con una sintaxis similar a un lenguaje de
programación también orientado a objetos.
Un lenguaje de base de datos que es especificado mediante:
Un Lenguaje de Definición de Objetos (ODL)
Un Lenguaje de Manipulación de Objetos (OML)
Un Lenguaje de Consulta (OQL)
siendo todos ellos portables a otros sistemas con el fin de conseguir la portabilidad de la aplicación completa.
Vamos a destacar algunas de las características más relevantes del estándar ODMG:
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 36/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Materiales desarrollados inicialmente por el Ministerio de Educación, Cultura y Deporte y actualizados por el profesorado
de la Junta de Andalucía bajo licencia Creative Commons BY-NC-SA.
Historial de actualizaciones
Gloria Ortiz
Mejora: Eliminación del idevice de licencia.
Versión: 03.00.00 Fecha subida: 22/04/15 Autoría: José Javier Bermúdez Hernández
Statement s = con.createStatement();
Debería poner:
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 37/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
Statement s = con.createStatement();
Versión: 02.00.00 Fecha subida: 04/04/14 Autoría: José Javier Bermúdez Hernández
Se han fusionado las originales unidades 10 y 11. Se han actualizado algunas presentaciones y algunas erratas.
Versión inicial de los materiales, elaborados por el Ministerio de Educación. Antes correspondía a las unidades 10 y 11, que ahora se
fundirán en una.
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 38/39
30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390
https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?id=3390 39/39