.NET

20 jun, 2007

Iniciando com Db4o

Publicidade

Este artigo foi escrito para servir de ponta-pé inicial para quem deseja iniciar a desenvolver aplicações utilizando Db4o. Para quem quiser seguir a fundo, recomendo a documentação oficial disponibilzada gratuitamente do site do db4o.

Conceitos Básicos

A principal característica do Db4o é que ele armazena os objetos exatamente como eles são representados em bytecode no JAVA ou em CIL no .NET. Isso permite que o desenvolvedor desenvolva em um ambiente puramente orientado a objetos.

O engine do db4o é simplesmente uma DLL (Db4oFactory.Db4o.dll), e é somente dela que precisamos para utilizar o banco de dados db4o. Os objetos salvados ficam armazenados em um arquivo de extensão yap.

Visão Geral da API

Os principais namespaces (ou packages) desta DLL são:

Db4objects.Db4o

Contém a maioria das funcionalidades normalmente utilizadas pelo db4o. 2 classes se destacam aqui:

    Db4oFactory: possui métodos estáticos que permitem abrir e fechar um banco de dados, conectar a um servidor e startar um servidor. Neste artigo vamos nos preocupar apenas com banco de dados local – nada de servidores.
    IObjectContainer: é o banco de dados db4o. Suas instâncias possuem métodos para salvar, deletar e recuperar objetos.

Db4objects.Db4o.Query

Contém a classe utilizada para realizar as chamadas Native Queries, que constituem o principal sistema de consulta suportado pelo db4o. Comentaremos sobre Native Queries nos próximos artigos.

Primeiros Passos

Primeiro, vamos criar uma classe para armazenar seus objetos. Caso queira testar os códigos, crie um projeto do tipo console em sua IDE. Vamos utilizar C em nossos códigos.


using System;

namespace Db4oBrasil.Dominio
{
	public class Usuario
	{
		private string _nome;
		private int _idade;
		
		public string Nome
		{
			get{return _nome;}
			set{_nome=value;}
		}
		
		public int Idade
		{
			get{return _idade;}
			set{_idade=value;}
		}
	
		public override string ToString()
		{
			return _nome + " (" + _idade + ")";
		}
	}
}

Veja como é fácil abrir um banco de dados. Neste momento, começamos a perceber porque dizemos que, de certa maneira, uma instância da classe IObjectContainer, de certa maneira, é um banco de dados Db4o.


// abre o banco
IObjectContainer db = Db4oFactory.OpenFile("C:/Projetos/D4boBrasil/teste.yap");
try
{
    // fazer alguma coisa com db4o
}
finally
{
    db.Close();
}

A partir de agora, vamos nos precupar com o trecho comentado “fazer alguma coisa com db4o”.

Salvando Objetos

Para salvar um objeto é MUITO fácil. Basta chamar o método SET do nosso banco de dados, passando o objeto que se deseja salvar como parâmetro.


Usuario eduardo = new Usuario();
eduardo.Nome="Eduardo";
eduardo.Idade="25";
Usuario flavia = new Usuario();
flavia.Nome="Flavia";
flavia.Idade="23";
db.Set(eduardo);
db.Set(flavia);

Recuperando Objetos

Db4o suporta 3 tipos de sistemas de consulta. Neste artigo veremos somente o mais simples deles: O QBE (Query By Examples).

Quando usamos QBE, nós criamos um objeto protótipo para db4o usar como um exemplo de quais objetos desejamos recuperar. Db4o recuperará todos objetos do mesmo tipo, e com os mesmos valores dos atributos dos objeto protótipo – os atributos com valores nulos do objeto protótipo não são utilizados para restringir a consulta. O resultado será retornado em um instânca do tipo IObjectSet.

Antes de realizar uma consulta, vamos fazer um método para listar o resultado de um consulta:


public static void ListResult(IObjectSet result)
{
     Console.WriteLine(result.Count);
     foreach (object item in result)
     { 
          Console.WriteLine(item);
     }
}

É fácil concluir que para obtermos todos os objetos de um mesmo tipo, basta passarmos um protótipo ‘vazio’:


Usuario prototipo = new Usuario();
IObjectSet result = db.Get(prototipo);
ListResult(result);

A saída seria:


2
Eduardo(25)
Flavia(23)

Se quisermos obter somente os usuarios que tiverem 25 anos fazemos:


Usuario prototipo = new Usuario();
prototipo.Idade=25;
IObjectSet result = db.Get(prototipo);
ListResult(result);

Atualizando Registros

Basta recuperar, alterar e salvar. Vamos aumentar a idade do objeto do tipo Usuario cujo atributo nome é “Eduardo”.


Usuario prototipo = new Usuario();
prototipo.Nome="Eduardo";
IObjectSet result = db.Get(prototipo);
Usuario encontrado = (Usuario)result.Next();
encontrado.Idade=26;
db.Set(encontrado);

Conclusão

Não precisamos em momento algum de criar tabelas ou configurar esquemas de banco de dados. Não foi necessário também criar instruções SQL. Quando utilizamos db4o podemos esquecer tudo que não é orientado a objetos. Uma desvantagem em relação aos bancos relacionais é a de que as restrições de integridade (chaves únicas, campos não nulos) devem ser implementadas na aplicação e não no banco.

Próximos Artigos

E se quiséssemos obter os usuários que possuem idade maior do que 20 anos? Este tipo de consulta é impossível de se realizar utilizando QBE. No próximo artigo, veremos como fazer isto utilizando Native Queries, o principal sistema de consultas do db4o. Veremos também como proceder com classes complexas (classes que possuem outras classes como atributos).

Forte abraço