Object-Oriented Databases
30 de Maio de 2008 | Arquivado em Banco de Dados, Programação |
Não é o melhor dos assuntos, mas é bastante interessante. Imagine a possibilidade de instanciar um objeto, dar valores às suas propriedades e gravá-lo em disco. Melhor ainda, pense na possibilidade de recuperar o objeto do disco e ter todas as propriedades com os valores que você definiu. Legal, não?
Esse mês estou fazendo um pequeno trabalho em Java usando um banco de dados orientado a objetos chamado db4o e resolvi compartilhar com o mundo um simples exemplo da sua aplicação.
Update (26/06/2008): a aplicação já estava pronta há um tempo, mas eu só pude disponibilizá-la hoje, neste post do blog.
Carro.java
* Definição básica de um Carro.
*
* @author Israel Júnior
*/
public class Carro {
private String fabricante;
private String modelo;
public Carro(String marca, String modelo) {
this.fabricante = marca;
this.modelo = modelo;
}
public String getFabricante() {
return fabricante;
}
public void setFabricante(String fabricante) {
this.fabricante = fabricante;
}
public String getModelo() {
return modelo;
}
public void setModelo(String modelo) {
this.modelo = modelo;
}
@Override
public String toString() {
return this.fabricante + " " + this.modelo;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Carro other = (Carro) obj;
if (this.fabricante != other.fabricante &&
(this.fabricante == null ||
!this.fabricante.equals(other.fabricante))) {
return false;
}
if (this.modelo != other.modelo &&
(this.modelo == null || !this.modelo.equals(other.modelo))) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 3;
hash = 23 * hash +
(this.fabricante != null ? this.fabricante.hashCode() : 0);
hash = 23 * hash + (this.modelo != null ? this.modelo.hashCode() : 0);
return hash;
}
}
App.java
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
/**
* Exemplo de utilização do db4o.
*
* @author Israel Junior
*/
public class App {
private static final String DB_FILENAME = "exemplo.db";
private static ObjectContainer db;
public static void main(String args[]) {
// Abrindo o arquivo de dados.
db = Db4o.openFile(DB_FILENAME);
try {
// Instanciando dois objetos da classe Carro.
Carro corsa = new Carro("Chevrolet", "Corsa Hatch 1.6");
Carro fiesta = new Carro("Ford", "Fiesta Hatch 1.6");
// Gravando os dois objetos no banco de dados.
db.set(corsa);
db.set(fiesta);
db.commit();
// Retornando os objetos gravados no banco usando o método de
// Query by Example.
ObjectSet resultado = db.get(Carro.class);
System.out.println(resultado.size() + " carro(s) retornado(s):");
while (resultado.hasNext()) {
Carro carro = (Carro) resultado.next();
System.out.println(" - (" + carro.hashCode() + ") " + carro);
}
} finally {
// Fechando o arquivo de dados.
db.close();
}
}
}
Executando o exemplo acima uma vez obtive a seguinte saída:
2 carro(s) retornado(s):
- (-1702201032) Chevrolet Corsa Hatch 1.6
- (-198062857) Ford Fiesta Hatch 1.6
Não satisfeito, executei o exemplo mais uma vez (sem apagar o arquivo do banco de dados):
4 carro(s) retornado(s):
- (-1702201032) Chevrolet Corsa Hatch 1.6
- (-198062857) Ford Fiesta Hatch 1.6
- (-1702201032) Chevrolet Corsa Hatch 1.6
- (-198062857) Ford Fiesta Hatch 1.6
Fazer override nos métodos equals() e hashCode() me deu a possibilidade de criar um tipo de chave primária no banco (notem os hashCodes iguais na segunda listagem).
Neste exemplo usei o db4o em modo embutido, apesar de ele também funcionar em modo cliente-servidor. Até o momento estou gostando bastante da experiência de fazer persistência de objetos usando um banco de dados OO. Porém, como o modelo ainda é bastante imaturo (em relação ao modelo relacional) é bom mantê-lo somente no contexto acadêmico.

9 Comentários
Laboratório de Banco de Dados né? Mudou o Banco era fastObjects. Bons tempos de graduação
Pois é velho hehehe
Apesar de usar bancos OO ser bem chato é legal. Gostei de aprender! O db4o só precisa de uma documentação melhor pra crescer. Tive que apelar pra fóruns e blogs de outras pessoas pra tirar algumas dúvidas.
Aew zael, post bacana… aproveitando só uma dúvida: e a dml ? é implícita na inserção ? abraços.
David, no db4o não existe DML. Não há a possibilidade de criar um objeto através de algo como “create object carro (varchar2 fabricante, varchar2 modelo)”. Você simplesmente cria uma classe em .NET ou Java e utiliza os métodos do gerenciador para fazer a persistência em disco.
Também não existe DDL. São três métodos de pesquisa: Query by Example, Native Queries e SODA. Isso é motivo pra outro post, talvez semana que vem!
Existe uma ferramenta chamada ObjectManager, também dos criadores do db4o, que permite abrir um banco de dados criado com o db4o e visualizar tudo que está dentro dele. É possível modificar algumas configurações como indexação e realizar consultas.
Esqueci de comentar…
David, isso acontece exclusivamente com o db4o. Eu esperava que ele seguisse o padrão ODMG, que define como são as linguagens de consulta e definição (OQL e ODL), mas ele vai contra essa filosofia.
Existem bancos orientados a objetos que seguem o padrão ODMG. Se não me engano, o Versant é um deles.
Ótimo post. Vou recomendar uma leitura aos colegas.
Legal o post…. Só pra complementar, o db4o pode ser usado no Android também correto?
Link legal pra quem programa para o Android - http://www.portalandroid.org
abraço,
Marcos.
Marcos, ainda não tive tempo pra brincar no Android mas creio que ele possa ser usado sim
[...] alguns dias coloquei um post que explicava um pouco do funcionamento de bancos de dados orientados a objetos. Hoje vou colocar o [...]