You are on page 1of 4

Taller de Programación en Java Excepciones y base de datos

Excepciones en Java
Java usa excepciones para proveer capacidades de manejo de errores para sus programas. Una excepción es un evento que
ocurre durante la ejecución de un programa que interrumpe el flujo normal de instrucciones.
Los componentes de manejo de excepciones son bloques try, catch y finally. El bloque try identifica un bloque
de código donde una excepción puede ocurrir. El bloque catch identifica un bloque de código, conocido como
manejador de excepciones, que puede tratar un tipo particular de excepción. El bloque finally identifica un bloque de
código que se ejecuta siempre, haya pasado o no la excepción. La sentencia try debe contener al menos un bloque
catch o finally y puede contener múltiples bloques catch.

package libreria;

public class Principal {

public static void main(String[] args) {

BaseDatos baseDatos = new BaseDatos();


try {
baseDatos.abrirDB();
try {
// Acá va el código inseguro
}
catch (Exception e) {
System.out.println("Hubo un error: "+e.getMessage());
}
finally {
baseDatos.cerrarDB();
}
}
catch (Exception e) {
System.out.println("No se pudo abrir la base de datos "+e);
}
}
}

En el ejemplo vemos dos bloques try anidados, con sus correspondientes catch. En el primer try tratamos de
conectarnos a la base de datos, de ocurrir un error el bloque catch capturaría la excepción, imprimiendo en la pantalla
el error. De no ocurrir el error en la apertura de la base de datos, se entraría al segundo bloque try, donde ahí se
colocaría el código inseguro que se capturaría en el catch siguiente. Al final se cerraría la conexión a la base de datos.

Base de datos en Java


Db4o es un gestor de base de datos de objetos embebida y de código abierto para Java, .Net y Mono. Db4o es una base de
datos de objetos, es decir almacena los datos como objetos, a diferencia de los gestores de datos relacionales que
almacenan en tablas, eso implica que no hay que realizar ninguna transformación a los objetos al guardarlos.
La distribución de db4o para Java viene comprimida en un archivo .zip y se puede bajar gratuitamente de
www.db4o.com. Dentro del archivo comprimido se encuentran entre otras cosas el archivo db4o-5.0-java5.jar
que es el gestor para Java 5 y que se debe copiar al directorio del proyecto.

Usar db4o
Una base de datos db4o es un único archivo con extensión ObjectContainer db =
.yap y se crea o abre de la siguiente forma Db4o.openFile(filename);

Cerrar la base de datos db.close();

1
Taller de Programación en Java Excepciones y base de datos

Almacenar o actualizar un objeto en la BD db.set(objeto);


Borrar un objeto de la BD db.delete(objeto);

Téngase en cuenta que para realizar la eliminación y actualización de un objeto previamente se tiene que haber guardado
u obtenido en la actual sesión de la base de datos.

Consultas
Db4o provee distintos tipos de consultas, entre ellas Query by Example (QBE) y Native Queries (NQ). Usando QBE se
debe crear un objeto prototipo para que el gestor lo use como ejemplo de lo que se desea extraer. El gestor devolverá
todos los objetos de un tipo dado que contengan los mismos valores de atributos a excepción de los por defecto. de cada
tipo de datos.

Pilot proto=new Pilot(null,100);


ObjectSet result=db.get(proto);

En el ejemplo anterior, considerando que el constructor la clase Pilot es Pilot(String name, int points), el
resultante es el conjunto de pilotos con puntaje igual a 100.
QBE es simple pero limitado en algunos aspectos, para realizar consultas mas complejas existen las Native Queries. Estas
proveen la posibilidad de ejecutar unas o mas líneas de código a todas las instanciaa de una clase almacenadas en la bd .

List <Pilot> pilots = db.query(new Predicate<Pilot>() {


public boolean match(Pilot pilot) {
return pilot.getPoints() == 100;
}
});

Al mensaje query() se le pasa como parámetro una clase interna anónima, lo importante de esta clase es que define un
método match. Este método se ejecuta por cada uno de los objetos del tipo especificado en la db, pasándose el objeto
como parámetro. Si este método devuelve verdadero el objeto sera incluido en la lista resultante.
El ejemplo busca en la bd todos los objetos de la clase Pilot que tengan como puntaje 100 y los copia a una lista.

Como instalar el gestor de base de datos en Eclipse


● Crear un directorio llamado “lib” en el directorio del proyecto
● copiar el archivo “db4o-5.5-java5.jar” a ese directorio.
● Click derecho en el proyecto en el Package Explorer y elegir “refresh”
● Click derecho en el proyecto en el Package Explorer otra vez y elegir “properties”
● Seleccionar "Java Build Path” en la vista de árbol de la izquierda
● Seleccionar la pestaña “Libraries”
● click “Add JARs”
● El directorio “lib” debe aparecer debajo del proyecto
● Elegir “db4o-5.5-java5.jar” en ese directorio
● Click en Ok.

Práctica
1- Creemos una clase BaseDatos que posea métodos de abrir y cerrar la base de datos, cargar por consola un Autor y
guardar este objeto en la db. Probemos el código desde la clase Principal que aparece en la página 1.

2
Taller de Programación en Java Excepciones y base de datos

package libreria;
import java.io.*;
import java.util.*;
import com.db4o.*;
import com.db4o.ext.Db4oException;
import com.db4o.query.Predicate;

public class BaseDatos {

private BufferedReader teclado;


private ObjectContainer db;

public BaseDatos() {
InputStreamReader isr = new InputStreamReader(System.in);
teclado = new BufferedReader(isr);
}
public void abrirBD() {
db = Db4o.openFile("db.yap");
}
public void cerrarBD() {
db.close();
}

public Autor leerAutor() throws Exception {


Autor autorNuevo = null;
try {
System.out.println("Alta Autor - Ingrese los datos");
System.out.print("Id Persona:");
int id = Integer.parseInt(teclado.readLine());
System.out.print("Nombre: ");
String nombre = teclado.readLine();
System.out.print("Apellido: ");
String apellido = teclado.readLine();
System.out.print("Código:");
String codAutor = teclado.readLine();
autorNuevo = new Autor();
autorNuevo.setIdPersona(id);
autorNuevo.setNombre(nombre);
autorNuevo.setApellido(apellido);
autorNuevo.setCodAutor(codAutor);
}
catch (NumberFormatException e) {
throw new Exception("Ha introducido un id inválido ");
}
catch (IOException e) {
throw new Exception("Ha ocurrido un error de entrada/salida ");
}
return autorNuevo;
}

public void guardarAutor(Autor autorNuevo) {


try {
db.set(autorNuevo);
System.out.println("Se ha ingresado el autor "+autorNuevo+" con éxito");
}
catch (Db4oException e) {
System.out.println("Ha ocurrido un error en la bd");
}
}
}

3
Taller de Programación en Java Excepciones y base de datos

En el constructor de la clase se crea un objeto BufferedReader llamado teclado, con el cual es posible leer desde el
teclado mediante el método readLine(). El método leerAutor() en su declaración especifica que lanza una
excepción genérica, la cual será tratada en el método que llamo a éste. En el código del método puede observarse una
estructura try – catch, en la cual se tratan dos tipos de excepciones diferentes; una NumberFormatException,
que se produce al querer transformar un string no numérico a un número, y una IOException, la cual es obligatoria al
utilizar código I/O. En el tratamiento de éstas excepciones, se lanzan otras excepciones mas genéricas con una
descripción la cuales como se dijo serán tratadas en el método “padre”.
En el método guardarAutor() se pasa como parámetro el objeto autor a guardar y contiene otra estructura try -
catch , la cual trata una excepción del tipo Db4oException imprimiendo el error por pantalla.

2- Agreguemos a la clase el método listarAutores(), que utilice QBE para la consulta de todos los autores en la
base de datos y los imprima en pantalla.

public void listarAutores() {


Autor proto=new Autor();
List<Autor> result=db.get(proto);
System.out.println("Todos los autores en la bd son: "+result);
}

3 – Agreguemos otro método, en este caso que busque un autor por su código pasado como parámetro, utilizando Native
Queries.

public Autor buscarAutorPorCodigo(final String codAutor)throws Exception {


List<Autor> listaAutores = db.query(new Predicate<Autor>(){
public boolean match(Autor autor)
{
return (autor.getCodAutor().equals(codAutor));
}
});
if (listaAutores.isEmpty()) {
throw new Exception("No se encontro el autor");
}else {
return listaAutores.get(0);
}
}

3- Codifiquemos un método que elimine de la bd un autor pasado como parámetro.

public void borrarAutor(Autor autorABorrar) {


db.delete(autorABorrar);
}

Ejercicios Sugeridos
Realice métodos para guardar y eliminar en la base de datos objetos de tipo Libro con todos sus objetos asociados.