Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 39

30/5/2019 https://educacionadistancia.juntadeandalucia.es/cursos/blocks/recopila/recopila.php?

id=3390

Gestión de bases de datos: relacionales y orientadas a


objetos. Persistencia de objetos.

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.

En concreto, un notario de renombre en el panorama nacional, se dirigió a BK programación


para pedirles que les desarrolle un programa para su notaría, de modo que toda la gestión de la
misma, incluyendo la emisión de las escrituras, se informatizaran. Además, si el programa es
satisfactorio, se encargará de promocionar la aplicación ante el resto de sus conocidos notarios,
pudiendo por tanto suponer muchas ventas y por ello, dinero.
Dantadd
Una cuestión vital en la aplicación es el almacenamiento de los datos. Los datos de los clientes, y
de las escrituras deberán guardarse en bases de datos, para su tratamiento y recuperación las veces que haga falta.

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

1.- Bases de datos relacionales.


Hoy en día, la mayoría de aplicaciones informáticas necesitan almacenar y gestionar gran cantidad de
datos.

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.

Para saber más


Si necesitas refrescar o simplemente aprender el concepto de clave primaria, en la Wikipedia puedes consultarlo.

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

1.1.- El desfase objeto-relacional.


El desfase objeto-relacional, también conocido como impedancia objeto-relacional, consiste en la diferencia
de aspectos que existen entre la programación orientada a objetos y la base de datos. Estos aspectos se
puede presentar en cuestiones como:

Lenguaje de programación: el programador debe conocer el lenguaje de programación orientada a


objetos (POO) y el lenguaje de acceso a datos.
Tipos de datos: en las bases de datos relacionales siempre hay restricciones en cuanto a los tipos de
datos que se pueden usar, que suelen ser sencillos, mientras que la programación orientada a objetos
utiliza tipos de datos más complejos.
Paradigma de programación: en el proceso de diseño y construcción del software se tiene que hacer
una traducción del modelo orientado a objetos de clases al modelo Entidad-Relación (E/R) puesto que
el primero maneja objetos y el segundo maneja tablas y tuplas o filas, lo que implica que se tengan que
diseñar dos diagramas diferentes para el diseño de la aplicación. Henrygb

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.

De JDBC podemos decir que:

Consta de un conjunto de clases e interfaces escritas en Java.


Proporciona un API estándar para desarrollar aplicaciones de bases de datos con un API Java pura.

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

JDBC es la versión de ODBC para Linux.

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

1.3.- Conectores o Drivers.


El API JDBC viene distribuido en dos paquetes:

java.sql, dentro de J2SE


javax.sql, extensión dentro de J2EE

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 conector lo proporciona el fabricante de la base de datos o bien un tercero.

El código de nuestra aplicación no depende del driver, puesto que trabajamos contra los paquetesjava.sql y javax.sql.

JDBC ofrece las clases e interfaces para:

Establecer una conexión a una base de datos.


Ejecutar una consulta.
Procesar los resultados.

Ejemplo:

Código Java para establecer una conexión y ejecutar consulta. (1 KB)

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.

Para saber más


Lista sobre los conectores JDBC para acceder a muchas las bases de datos listadas.

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

1.4.- Instalación de la base de datos.


¿Qué es lo primero que tenemos que hacer, para poder realizar consultas en una base de datos?

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:

Instalar MySQL en Linux.

Para saber más


De MySQL se escindieron otras bases de datos, como MariaDB y Percona, que cada vez están teniendo mayor número de
seguidores.

En el siguiente enlace puedes obtener información sobre MariaDB

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:

Percona desafía a Oracle.

Aquí puedes ver un mapa de las bifurcaciones de MySQL

Mapa bifurcaciones MySQL

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

1.5.- Creación de las tablas en una base de datos.

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"

Para saber más


Aquí puedes ver un vídeo sobre la instalación de la base de datos Oracle Express y creación de tablas.

Instalacion Oracle 10g XE …

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

1.5.1.- Lenguaje SQL (I).


¿Cómo le pedimos al Sistema Gestor de Bases de Datos Relacional (SGBDR), en concreto en este caso, al de MySQL,
que nos proporcione la información que nos interesa de la base de datos?

Se utiliza el lenguaje SQL para interactuar con el SGBDR.

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 comandos SQL se pueden dividir en dos grandes grupos:


Jinho Jung

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).

En la siguiente presentación encontrarás algunos de los comandos SQL más utilizados.


Resumen textual alternativo para "Comandos SQL"

Para saber más


En este enlace encontrarás de una manera breve pero interesante la historia de SQL

Historia del SQL.

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

1.5.2.- Lenguaje SQL (II).

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.

Por ejemplo para crear una tabla de departamentos podríamos hacer:

CREATE TABLE departa (


cod_dep number(3),
nombre varchar2(15) not null,
loc varchar2(10),
constraint dep_pk primary key (cod_dep),
constraint dep_loc check
(loc in ('Madrid', 'Barcelona', 'Murcia'))
);

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.

Y una tabla de empleados, teniendo en cuenta el departamento en el que trabajen:

CREATE TABLE emp (


cod_emp number(3),
nombre varchar2(10) not null,
oficio varchar2(11),
jefe number(3),
fecha_alta date,
salario number(10),
comision number(10),
cod_dep number(3),
constraint emp_pk primary key (cod_emp),
constraint emp_fk foreign key (cod_dep) references departa(cod_dep)
on delete cascade,
constraint emp_ck check (salario > 0)
);

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

1.6.- Establecimiento de conexiones.

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.

Juan le comenta a María:

—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.

Veamos un ejemplo comentado: Eirik Stavelin

Código Java para establecer una conexión con MySQL (1 KB)

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

1.6.1.- Instalar el conector de la base de datos.


En la siguiente presentación vamos a ver cómo descargarnos el conector o driver que necesitamos para trabajar con MySQL. Como verás, tan
sólo consiste en descargar un archivo, descomprimirlo y desde NetBeans añadir el fichero .jar que constituye el conector que necesitamos.
Resumen textual alternativo para "Instalar driver JDBC para MySQL"

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

1.6.2.- Registrar el controlador JDBC.


Al fin y al cabo ya lo hemos visto en el ejemplo de código que poníamos antes, pero incidimos de nuevo.
Registrar el controlador que queremos utilizar es tan fácil como escribir una línea de código.

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

// Cargar el driver de mysql


Class.forName("com.mysql.jdbc.Driver");

Una vez cargado el controlador, es posible hacer una conexión al SGBD.

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

1.7.- Ejecución de consultas sobre la base de datos.

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.

Podemos utilizar los siguientes tipos de sentencias:

Statement: para sentencias sencillas en SQL.


PreparedStatement: para consultas preparadas, como por ejemplo las que tienen parámetros. brainflakes.

CallableStatement: para ejecutar procedimientos almacenados en la base de datos.

El API JDBC distingue dos tipos de consultas:

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

1.7.1.- Recuperación de información (I).

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:

// Preparamos la consulta y la ejecutamos


Statement s = con.createStatement();
ResultSet rs = s.executeQuery ("SELECT NIF, NOMBRE,"
+ "APELLIDOS, TELÉFONO FROM CLIENTE");

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.

Para saber más


Puedes consultar todos los métodos que soporta ResulSet, además de más información, en la documentación de Oracle:

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

1.7.1.1.- Recuperación de información (II).


El método executeQuery() devuelve un objeto ResultSet para poder recorrer el resultado de la consulta utilizando
un cursor.

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).

Código para consulta e iteración en un ResultSet. (1 KB)

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

1.7.2.- Actualización de información.


Respecto a las consultas de actualización, executeUpdate, retornan el número de registros insertados,
registros actualizados o eliminados, dependiendo del tipo de consulta que se trate.

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:

String connectionUrl = "jdbc:mysql://localhost/notarbd?" +


"user=root&password=admin";
// Obtener la conexión
Connection con = DriverManager.getConnection(connectionUrl);

// Preparamos la consulta y la ejecutamos


Statement s = con.createStatement();
s.executeUpdate("UPDATE CLIENTE SET teléfono='968610009' WHERE idCLIENTE=3");
// Cerramos la conexión a la base de datos.
con.close();

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

1.7.3.- Adición de información.


Si queremos añadir un registro a la tabla Cliente, de la base de datos con la que estamos trabajando tendremos que utilizar la sentencia
INSERT INTO de SQL. Al igual que hemos visto en el apartado anterior, utilizaremos executeUpdate() pasándole como parámetro la consulta,
de inserción en este caso.

Así, un ejemplo sería:

// Preparamos la consulta y la ejecutamos


Statement s = con.createStatement();
s.executeUpdate( "INSERT INTO CLIENTE" +
" (idCLIENTE, NIF, NOMBRE, APELLIDOS, DIRECCIÓN, CPOSTAL, TELÉFONO, CORREOELEC)" +
" VALUES (4, '66778998T', 'Alfredo', 'Gates Gates', 'C/ Pirata 23','20400', '891222112', '[email protected]' )") ;

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

1.7.4.- Borrado de información.

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.

// Preparamos la consulta y la ejecutamos


Statement s = con.createStatement();
numReg = s.executeUpdate( "DELETE FROM CLIENTE WHERE NIF= '66778998T' " );
// Informamos del número de registros borrados
System.out.println ("Se borró " + numReg + " registro") ;

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

1.7.5.- Cierre de conexiones.


Las conexiones a una base de datos consumen muchos recursos en el sistema gestor, y por tanto en el sistema
informático en general. Por ello, conviene cerrarlas con el método close() siempre que vayan a dejar de ser utilizadas, en
lugar de esperar a que el recolector de basura de Java (garbage collector) las elimine.

También conviene cerrar las consultas (Statement y PreparedStatement) y los resultados (ResultSet) para liberar los
recursos.

Citas para pensar

Noble cosa es, aun para un anciano, el aprender.

Sófocles.

Para saber más


En el siguiente enlace puedes ver cómo se realiza una gestión de la conexión con Oracle, desde el registro del conector hasta el
cierre de la misma.

Gestión de la conexión en Oracle.

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.

Cuando se produce un error se lanza una excepción del tipo java.sql.SQLException.

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

2.- Bases de datos orientadas a objetos con Java.

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.

De momento la aplicación no hace nada más, de hecho, el cliente no necesita ninguna


funcionalidad extra, aunque deja la puerta abierta a que en el futuro se pueda añadir más
información (como por ejemplo las matriculas de los coches de cada conductor o conductora).
Hoy va a enseñarle a Juan la aplicación:

—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.

—Sí, supongo que sí —contesta Antonio.

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

2.1.- ¿Por qué surgen las bases de datos orientadas a


objetos?
Las Bases de Datos Relacionales (BDR) son ideales para aplicaciones tradicionales que soportan tareas
administrativas, y que trabajan con datos de estructuras simples y poco cambiantes, incluso cuando la
aplicación pueda estar desarrolla en un lenguaje OO y sea necesario un Mapeo Objeto Relacional
(ORM)

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:

Los objetos deben ser descompuestos en diferentes tablas. Agustín Díaz.

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.

Para saber más


En este enlace de un sistema gestor de bases de datos orientado a objetos, se comentan aspectos interesantes sobre estas
bases de datos.

Necesidad de las BDOO.

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

2.2.- Características de las bases de datos orientadas a


objetos.

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:

Soportan conceptos de orientación a objetos como la herencia.

Permiten la manipulación navegacional.

Tienen el mismo tipo de problemas que las relacionales para gestionar objetos complejos.

Cada objeto posee un identificador de objeto.

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

Para saber más


Existen diferentes manifiestos sobre las características que debe cumplir un sistema de bases de datos orientado a objetos. En
el siguiente enlace puedes consultar un poco más sobre ellos.

Manifiestos sobre las bases de datos orientadas a objetos. (174 KB)

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

2.2.1.- Ventajas e inconvenientes.


El uso de una BDOO puede ser ventajoso frente a una BDR relacional si nuestra aplicación requiere
alguno de estos elementos :

Un gran número de tipos de datos diferentes.


Un gran número de relaciones entre los objetos.
Objetos con comportamientos complejos.

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.

Citas para pensar

"Cada día sabemos más y entendemos menos". Albert Einstein

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

2.3.- Gestores de bases de datos orientadas a objetos.

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:

Ampliar un lenguaje de programación OO existente con capacidades de BD (Ejemplo: GemStone).


Proporcionar bibliotecas de clases con las capacidades tradicionales de las bases de datos, como persistencia, transacciones,
concurrencia, etc., (Ejemplo: ObjectStore y Versant).
Ampliar un lenguaje de BD con capacidades OO, caso de SQL 2003 y Object SQL (OQL, propuesto por ODMG).

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.

A continuación te indicamos algunos ejemplos de SGBOO:

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

2.3.1.- Objetos simples y objetos estructurados.


En las BDOO los objetos se encuentran interrelacionados por referencias entre ellos de manera similar a
como los objetos se referencian entre sí en memoria.

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:

Guía de colecciones en Java.

Autoevaluación
Señala si la siguiente afirmación es verdadera o falsa.

Un objeto estructurado es aquel que contiene a otros objetos.


Verdadero Falso

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

2.3.2.- Instalación del gestor de objetos db4o.


En los siguientes apartados trabajaremos con db4objects de Versant o simplemente db4o, una base
de datos orientada a objetos nativa de Java, disponible para Java y .Net, y utilizada en la
actualidad por diversas compañías para el desarrollo de aplicaciones de dispositivos móviles,
dispositivos médicos y biotecnología, aplicaciones web, software enlatado y aplicaciones en tiempo
real.

Tres características importantes de db4o son las siguientes:

El modelo de clases es el propio esquema de la base de datos, por lo que se elimina el


proceso de diseño, implementación y mantenimiento de la base de datos.
Está diseñada bajo la estrategia de proporcionar bibliotecas de clases con las capacidades Luis Pérez.

tradicionales de las bases de datos, y con el objetivo de cero administración.


Puede trabajar como base de datos embebida, lo que significa que se puede distribuir con la aplicación, y solo la aplicación que lanza
la base de datos embebida puede acceder a ella, siendo ésta invisible para el usuario final.

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.

La instalación de db4o consistirá en:

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

Para saber más


En el siguiente enlace, en inglés, encontrarás un extenso y completo tutorial sobre db4o.

Tutorial oficial de db4o.

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

2.4.- El API de la base de objetos.

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.

Todos los SGBDOO, independientemente de su estrategia de diseño, proporcionan un API (Interfaz de


Programación de Aplicaciones), más o menos extenso, disponible para ciertos lenguajes OO. En el caso de
db4o, el API está disponible para Java y .Net.

Los principales paquetes del API de db4o son los siguientes:

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

2.4.1.- Apertura y cierre de conexiones.


En general, la conexión de una aplicación Java con una base de objetos se podrá realizar vía:

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:

Abrir conexión. Podemos utilizar las siguientes clases:


Db4oEmbedded. Es una clase que hereda de java.lang.Object y proporciona métodos estáticos como openFile() para abrir una
instancia de la base de datos en modo embebido. En modo embebido tiene la limitación de que sólo se puede utilizar en la base
de datos una conexión.
ObjectServer. Es una interfaz que permite trabajar con una base de datos db4o en modo cliente-servidor. Una vez abierta la base
de datos como servidor mediante Db4o.openServer(), el método openClient() de la interfaz ObjectServer permitirá abrir
conexiones cliente directamente en memoria o bien mediante TCP/IP.
Cerrar conexión. Para ello utilizaremos el método close() de la interfaz ObjectContainer.

El esquema de trabajo para operar con la base de objetos será el siguiente:

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().

close() de la clase Db4oEmbedded.

disconnect() de la interfaz ObjectContainer.

close() de la interfaz ObjectContainer.

No es correcto, prueba de nuevo.

No es la respuesta correcta, deberías haber leído mejor.

No, ese método no existe.

Muy bien, vamos por buen camino.

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

2.4.2.- Consultas a la base de objetos.


En una base de datos orientada a objetos se pueden realizar consultas mediante:

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 qué consiste cada uno de estos sistemas de consulta?

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:

Son muy limitadas y no permiten el uso de restricciones.


Necesitan de objetos Query para formularlas y en ellas se pueden indicar varias restricciones o constraints.
No necesitan ningún API especial.
Son más lentas que la consultas nativas.

No es correcto, prueba de nuevo.

Muy bien, vamos por buen camino.

No es cierto, precisamente utilizan la API SODA.

No, al contrario, son las más rápidas.

Solución

1. Incorrecto
2. Opción correcta
3. Incorrecto
4. Incorrecto

Para saber más


Otro sistema gestor de bases de datos orientadas a objetos es NeoDatis. En el siguiente enlace, dispones de información sobre
los sistemas de consulta de ese sistema.

Consultas con el gestor Neodatis.

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

2.4.3.- Actualización de objetos simples.


Recuerda que un objeto simple es un objeto que no contiene a otros objetos, como por ejemplo los objetos de la clase Ponente. Un
segmento de la definición de esta clase, es la siguiente:

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

Para modificar objetos almacenados debes seguir los siguientes pasos:

Cambiar los valores del objeto con los nuevos valores.


Almacenar de nuevo el objeto con el método store() de la interfaz ObjectContainer.

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.

Para eliminar objetos almacenados utilizaremos el método delete() de la interface ObjectContainer .

Por ejemplo, el siguiente método elimina un objeto ponente por su nif:

Desde el siguiente enlace puedes descargar el proyecto completo. Comprueba los resultados de su ejecución.

Código del ejemplo de actualización de objetos simples. (22 KB)

Autoevaluación
Señala si la siguiente afirmación es verdadera o falsa.

Para actualizar un objeto almacenado, db4o necesita conocerlo previamente.


Verdadero Falso

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

2.4.4.- Actualización de objetos estructurados.


Los objetos estructurados son objetos que contienen a su vez a otros objetos (objetos hijo u objetos
miembro).

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.

¿Cómo se almacenan, consultan y actualizan los objetos estructurados en db4o?

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.

Código con ejemplo de actualización y consultas de objetos estructurados. (27 KB)

En este otro enlace dispones de un ejemplo con eliminación y modificación de charlas en cascada.

Código con ejemplo de eliminación de objetos estructurados en cascada. (24,1 KB)

Citas para pensar

"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.

La actualización de un objeto estructurado supone la actualización de todos sus objetos hijo.

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

2.5.- Gestión de transacciones.

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.

Las transacciones deben cumplir el criterio ACID.

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).

Para saber más


Puedes consultar el siguiente enlace para más información sobre los puntos de salvaguarda en MySQL:

Documentación sobre los puntos de salvaguarda en MySQL.

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

2.5.1.- Transacciones en un sistema gestor de base de


datos orientada a objetos.
Las transacciones en un sistema de objetos puro, se gestionan mediante COMMIT y ROLLBACK .

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.

Veamos un ejemplo sencillo con la base de objetos db4o. En db4o:

Siempre se trabaja dentro de una transacción.


Al abrir un ObjectContainer se crea e inicia implícitamente una transacción.
Las transacciones se gestionan explícitamente mediante commit y rollback.
La transacción actual hace commit implícitamente cuando se cierra el ObjectContainer.

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.

Una transacción en db4o se deshace mediante rollback.

Verdadero Falso

Verdadero
Es verdadero, con rollback se deshacen transacciones.

Para saber más


En el siguiente enlace se puede consultar un ejemplo en Java usando db4o:

Uso de db4o en Java.

Desde el siguiente enlace puedes ver una presentación tipo resumen con muchos de los aspectos tratados en esta unidad.

Persistencia de objetos y db4o. (0.61 MB)

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

Anexo.- Estándar ODMG-93 u ODMG.

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.

1. Arquitectura del estándar ODMG


La arquitectura propuesta por ODMG consta de:

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.

Enlaces con lenguajes Orientados a Objetos como C++, Java, Smaltalk.


El modelo de objeto ODMG es el modelo de datos en el que están basados el ODL y el OQL. Este modelo de objeto proporciona los
tipos de datos, los constructores de tipos y otros conceptos que pueden utilizarse en el ODL para especificar el esquema de la base de
datos de objetos.

Vamos a destacar algunas de las características más relevantes del estándar ODMG:

Las primitivas básicas de modelado son los objetos y los literales.


Un objeto tiene un Identificador de Objeto (OID) y un estado (valor actual) que puede cambiar y tener una estructura compleja.
Un literal no tiene OID, pero si un valor actual, que es constante.
El estado está definido por los valores que el objeto toma para un conjunto de propiedades.Una propiedad puede ser:
Un atributo del objeto.
Una interrelación entre el objeto y otro u otros objetos.
Objetos y literales están organizados en tipos. Todos los objetos y literales de un mismo tipo tienen un comportamiento y estado
común.
Un objeto queda descrito por cuatro características: identificador, nombre, tiempo de vida y estructura.
Los tipos de objetos se descomponen en atómicos, colecciones y tipos estructurados.
Tipos atómicos o básicos: constan de un único elemento o valor, como un entero.
Tipos estructurados: compuestos por un número fijo de elementos que pueden ser de distinto tipo, como por ejemplo una
fecha.
Tipos colección: número variable de elementos del mismo tipo. Entre ellos:
Set: grupo desordenado de elementos y sin duplicados.
Bag: grupo desordenado de elementos que permite duplicados.
List: grupo ordenado de elementos que permite duplicados.
Array : grupo ordenado de elemntos que permite el acceso por posición.
Algunos fabricantes sólo ofrecen vinculaciones de lenguajes específicos, sin ofrecer capacidades completas de ODL y OQL.

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

Condiciones y términos de uso de los materiales

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.

Antes de cualquier uso leer detenidamente el siguente Aviso legal

Historial de actualizaciones

Versión: 03.00.05 Fecha subida: 25/04/18 Autoría: Salvador Romero Villegas

Ubicación: Apartado 1.5


Mejora (tipo 1): Se ha cambiado la URL del vídeo para poner HTTPS y embeberlo como iframe en vez de como flash (cuyo uso está
desaconsejado).

Ajustes realizados en la versión

Gloria Ortiz
Mejora: Eliminación del idevice de licencia.

Versión: 03.00.04 Fecha subida: 15/05/17 Autoría: Sonia Amate Garrido

Ubicación: 1.1 (Autoevaluación)


Mejora (tipo 1): Eliminar el recurso de Autoevaluación que se encuentra vacío y se ha comprobado que en versiones anteriores no estaba.

Versión: 03.00.03 Fecha subida: 06/04/17 Autoría: Sonia Amate Garrido

Ubicación: 2.5.1.- (Para Saber Más)


Mejora (tipo 1): Sustitución del primer enlace del Para saber más que no se encuentra disponible por otro: Uso de db4o en Java.
(https://www.programacion.com.py/escritorio/java-escritorio/uso-de-db4o-en-java)

Versión: 03.00.02 Fecha subida: 22/04/16 Autoría: Sonia Amate Garrido

Ubicación: 1.4.- Instalación de la base de datos.


Mejora (tipo 1): Añadir enlace de descarga de mysql
Ubicación: Examen
Mejora (Examen online): Eliminar la pregunta de examen online: ¿Cuál de los siguientes índices mejora el rendimiento de acceso a
datos?
Ubicación: 2.2
Mejora (tipo 1): Completar el apartado de modo que el párrafor diga: 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.

Versión: 03.00.01 Fecha subida: 23/04/15 Autoría: Gloria Ortiz

Ubicación: Primera página


Mejora (tipo 1): Materiales --> Se ha puesto la licencia correctamente tal y como establece el procedimiento de Actualización de
Materiales

Versión: 03.00.00 Fecha subida: 22/04/15 Autoría: José Javier Bermúdez Hernández

Ubicación: Toda la unidad


Mejora (tipo 3): Se han eliminado los contenidos de Caché, respecto a bases de datos orientadas a objeto. Se ha añadido db4o sobre
BBDDOO.
Ubicación: 1.4.- Instalación de la base de datos.
Mejora (tipo 1): En la autoevaluación, sobra la palabra usar. DONDE PONE: Para usar programar accesos a MySQL... DEBE PONER:
Para programar accesos a MySQL...
Ubicación: Apartado 1.7.4 Borrado de información.
Mejora (tipo 1): Código de ejemplo al Statement se le llama de forma distinta a como se ha declarado cuando se usa.
Donde pone:

Statement s = con.createStatement();

numReg = res.executeUpdate( DELETE FROM CLIENTE WHERE NIF= 66778998T );

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();

numReg = s.executeUpdate( DELETE FROM CLIENTE WHERE NIF= 66778998T );

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: 01.00.00 Fecha subida: 01/04/14 Autoría: MECD MECD

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

También podría gustarte