DB4O es un novedoso motor de base de datos orientada a objetos. Sus siglas se corresponden con la expresión "DataBase 4 (for) Objects", que a su vez es el nombre de la compañía que lo desarrolla: db4objects, Inc.
DB4O es:
Nativa a Java y .NET
100% orientada a objetos, sin mapeo objeto-relacional
Diseñada para uso embebido
De código abierto y libre bajo la GPL
Las claves innovadoras de este producto es su alto rendimiento (sobre todo en modo embebido) y el modelo de desarrollo que proporciona a las aplicaciones para su capa de acceso a datos, el cual propugna un abandono completo del paradigma relacional de las bases de datos tradicionales.
De este modo, tenemos las siguientes consecuencias directas resultantes de este nuevo paradigma:
Deja de existir un lenguaje SQL de consultas/modificaciones para pasar a crearse sistemas de consulta por métodos delegados y actualización/creación/borrado automático de entidades mediante código compilable.
Se elimina la necesidad de representar el modelo de datos de la aplicación en dos tipos de esquemas: modelo de objetos y modelo relacional. Ahora el esquema de datos del dominio viene representado por la implementación que se realice del diagrama de clases.
Se consigue evitar el problema del Object-Relational Impedance Mismatch sin sacrificar el rendimiento que los mapeadores objeto-relacionales sufren actualmente para llevar a cabo el mismo objetivo.
La mayor clave del éxito que está teniendo este motor de base de datos frente a otros competidores que han desarrollado tecnologías similares, es que se ha optado por un modelo de licenciamiento idéntico al utilizado por empresas como MySQL: licencia dual GPL/comercial. Es decir, si se quiere desarrollar software libre con esta librería, su uso no conlleva ningún coste por licencia; sin embargo si se desea aplicar a un software privativo, se aplica otro modelo de licenciamiento concreto.
Actualmente este producto funciona como una librería para dos tipos de plataformas de desarrollo: Java y.NET (tanto la implementación de Microsoft como la de Mono).
Dejo unos links que contienen todo lo que hay que saber de este producto:
http://javahispano.org/contenidos/es/db4o/;jsessionid=E73763B425065DA17545394C602338EA
http://www.programacion.com/java/articulo/jap_persis_db4o/
http://developer.db4o.com/forums/storage/15/33746/50-54%20code34%20Architecture.pdf
Y para todos los araganes que no quieren buscar o leer, dejo un ejemplito:
La clase Player
public class Player {
protected String name;
protected int squadNumber;
protected float battingAverage;
protected Team team;
public Player(String name, int squadNumber, float battingAverage){
this.name = name;
this.squadNumber = squadNumber;
this.battingAverage = battingAverage;
}
//Geters and seters
public String toString() {
return name + ":" + battingAverage;
}
}
La clase Pitcher
public class Pitcher extends Player {
private int wins;
public Pitcher(String name, int squadNumber, float battingAverage, int wins) {
super(name,squadNumber,battingAverage);
this.wins = wins;
}
//Geter y seter para wins
public String toString() {
return name + ":" + battingAverage + ", " + wins;
}
}
La clase Team
import java.util.List;
import java.util.ArrayList;
public class Team {
private String name;
private String city;
private int won;
private int lost;
private List players;
public Team(String name, String city, int won, int lost){
this.name = name;
this.city = city;
this.won = won;
this.lost = lost;
this.players = new ArrayList();
}
public void addPlayer(Player p) {
players.add(p);
}
// Geters y seters
public String toString() {
return name;
}
}
Primero, creamos algunos datos de prueba con los que trabajar:
// Create Players
Player p1 = new Player("Barry Bonds", 25, 0.362f);
Player p2 = new Player("Marquis Grissom", 9, 0.279f);
Player p3 = new Player("Ray Durham", 5, 0.282f);
Player p4 = new Player("Adrian Beltre", 29, 0.334f);
Player p5 = new Player("Cesar Izturis", 3, 0.288f);
Player p6 = new Player("Shawn Green", 15, 0.266f);
// Create Pitchers
Player p7 = new Pitcher("Kirk Rueter",46, 0.131f, 9);
Player p8 = new Pitcher("Kazuhisa Ishii",17, 0.127f, 13);
// Create Teams
Team t1 = new Team("Giants", "San Francisco", 91, 71);
Team t2 = new Team("Dodgers", "Los Angeles", 93, 69);
// Add Players to Teams
t1.addPlayer(p1);
p1.setTeam(t1);
t1.addPlayer(p2);
p2.setTeam(t1);
t1.addPlayer(p3);
p3.setTeam(t1);
t2.addPlayer(p4);
p4.setTeam(t2);
t2.addPlayer(p5);
p5.setTeam(t2);
t2.addPlayer(p6);
p6.setTeam(t2);
// Add Pitchers to Teams
t1.addPlayer(p7);
p7.setTeam(t1);
t2.addPlayer(p8);
p8.setTeam(t2);
Un objeto Team se puede almacenar con una sóla línea de código:
db.set(t1);
db.set(t2);
db.commit();
Donde db es una referencia a un objeto ObjectContainer, que se haya creado abriendo un fichero de base de datos, de esta forma:
ObjectContainer db = Db4o.openFile(filename);
Una base de datos db4o es un único fichero con una extensión .yap, y se utiliza su método set para almacenar objetos.
Observe que está linea almacena el objeto Team y su colección de objetos Player. Se puede probar esto recuperando uno de esos objetos Player. La forma más simple de hacer esto es utilizando QBE.
Player examplePlayer = new Player("Barry Bonds",0,0f);
ObjectSet result=db.get(examplePlayer);
System.out.println(result.size());
while(result.hasNext()) {
System.out.println(result.next());
}