Escolar Documentos
Profissional Documentos
Cultura Documentos
db4o (database for objects) é um Banco de Dados Orientado a Objetos. É open source e
possui interface para desenvolvimento de aplicações utilizando a Plataforma Java da
SUN , a Plataforma .NET da Microsoft e Projeto MONO.
Índice
[esconder]
De acordo com a empresa que produz o db4o, este banco roda até 44 vezes mais rápido
que os Bancos de Dados conhecidos como Hibernate com MySql. O benchmark de
licença GPL, PolePosition, tem um método de teste chamado Barcelona que faz escrita,
leitura, consultas e remoção de objetos com uma estrutura de herança de 5 níveis.[6]
Segundo o teste, o db4o se saiu melhor em relação a vários Bancos de Dados conforme
detalhes da Tabela Abaixo.
QBE (Query by Example): No método QBE, você cria um modelo de objeto, que é
uma instância da classe que você deseja pesquisar. Se atribuir valores para um ou mais
atributos no seu modelo, então db4o procura por objetos no Banco de Dados com os
atributos correspondentes. É um método simples e de fácil aprendizagem, mas só é ideal
para consultas que não precisam de operadores lógicos. SODA (Simple Object Data
Access): Constrói um grafo de consulta navegando referências em classes e as restrições
que impõe. Utiliza strings para identificar os campos. Rápido, mas o conceito pode ser
difícil de acostumar. NQ (Native Query): É uma consulta nativa expressa inteiramente
na linguagem de programação e com checagem de tipos durante a compilação. Oferece
consultas com várias vantagens importantes.
//INSERÇÃO
p.setCod(20);//Instanciando o objeto com o código 20
p.setNome("David");//Instanciando o objeto com o nome David
db.set(p);//Armazenando o objeto no banco
System.out.println("O objeto foi inserido");
//ATUALIZAÇÃO
p.setCod(20);//Instanciando o objeto com o código 20
result = db.get(p);//Recupera o objeto p do Banco
achou_p = (Pessoas) result.next();//retorna o objeto se
existir
achou_p.setCod(20);//Instanciando o objeto encontrado com
código 20
achou_p.setNome("Jaqueline");//Alterando o objeto para o
nome Jaqueline
db.set(achou_p);//Armazenando o objeto no Banco
System.out.println("O objeto foi atualizado");
//CONSULTA
p.setCod(20);
result = db.get(p);
achou_p = (Pessoas) result.next();
System.out.println("O objeto foi consultado");
//Imprime o resultado da consulta
System.out.println("O resultado da consultado é:");
System.out.println("Código: " + achou_p.getCod());
System.out.println("Nome: " + achou_p.getNome());
//REMOÇÃO
p.setCod(20);
result = db.get(p);
achou_p = (Pessoas) result.next();
db.delete(achou_p);//Apaga o objeto
System.out.println("O Objeto foi apagado");
db.close();//Fechando o Banco
}
}
Saída do Programa
O resultado da consultado é:
Código: 20
Nome: Jaqueline
http://www.algoritma.com.br/rodrigo.sendin/2008/11/e-o-linq-to-sql.html.
Recentemente eu tenho dado atenção a outro tipo de solução para este problema: Os
Bancos de Dados Orientado a Objetos. Não vou entrar nos detalhes de siglas e
definições deste tema, basta saber que há muita gente desenvolvendo databases ou
frameworks que armazenam os dados na forma de Objetos, e não em estruturas
relacionais.
De forma bem resumida posso dizer que as principais características do db4o são:
• É simples de usar, basta usar uma única DLL para as operações básicas;
• Comporta soluções locais e também Client/Server;
• Possuí uma versão para o .NET Compact Framework e para o Projeto Mono;
Com certeza é difícil vender essa idéia, afinal os bancos de dados relacionais tem
dominado o mercado ja a algum tempo. Mas de modo prático pro cliente final não
muda nada. O que certamente vai melhorar com o uso de uma ferramenta como o
db4o, é a sua produtividade, e esse benefício pode ser repassado para o cliente final
em forma de redução de custos.
Mas vale a pena ficar por dentro de como um banco de dados orientado a objetos
funciona, e quais são os benefícios e problemas frente aos relacionais. É por isso que
eu vou começar a abordar este assunto aqui em futuros posts, de forma mais
detalhada e com demonstrações técnicas. Se você tiver interesse em conhecer mais,
também começarei a publicar alguns artigos nas edições impressas da .NET Magazine
sobre esse tema. E também vídeo-aulas no Portal da DevMedia
(www.devmedia.com.br). Aguarde e confira!
A primeira coisa que você deve fazer para iniciar o uso do db4o é o seu download no
site da comunidade de desenvolvedores: http://developer.db4o.com/. Como você pode
ver na figura abaixo, o download pode ser feito logo na primeira página, no canto
direito.
Note que existem duas versões para a plataforma .NET. Uma para .NET 2.0 e a outra para o
.NET 3.5. Vamos fazer o download e instalação da versão 7.4 do db4o para .NET 3.5.
A instalação também é extremamente simples, pode aplicar a técnica NNF que não tem erro.
(NNF = Next - Next – Finish). Só peço a sua atenção para a segunda tela do Wizard de
instalação, que você vê na figura a seguir:
Aqui você pode ver o diretório onde o db4o vai ser instalado, e também pode modificar esse
caminho se quiser. A importância de saber onde o db4o vai ser instalado, é que para utilizá-lo
em nossos projetos .NET, precisaremos apontar para as DLLs que estarão aqui.
Com isso você pode notar que a instalação do db4o é praticamente uma simples
descompactação. Nada é registrado em GAC ou nos registros do Windows. Essa é uma
característica que eu particularmente gosto, pois torna o uso e principalmente a distribuição
muito mais fácil e portável.
Terminada a instalação, abra o Windows Explorer e vá até o diretório onde o db4o foi
instalado na sua máquina. Veja na parte esquerda da figura abaixo, a estrutura de diretórios
criada:
~\Db4objects\dv4o-7.4\src\ é onde você vai encontrar todo o código fonte do db40. Sim, você
já tem acesso ao código fonte da ferramenta.
~\Db4objects\dv4o-7.4\doc\ uma vasta documentação para que você possa dar os primeiros
passos com o db4o. A maioria dos exemplos que você verá neste blog será adaptada dessa
documentação.
Outra observação importante é que ao término da instalação, você teve a opção de iniciar o
tutorial que vem junto com o db40. Esse tutorial também pode ser acessado pelo menu iniciar,
na pasta db4objects.
Grande Abraço!
Marcadores: db4o
postado por Rodrigo Sendin @ 09:13 0 Comentários Links para esta postagem
http://www.algoritma.com.br/rodrigo.sendin/2008/11/e-o-linq-to-sql.html.
Recentemente eu tenho dado atenção a outro tipo de solução para este problema: Os
Bancos de Dados Orientado a Objetos. Não vou entrar nos detalhes de siglas e
definições deste tema, basta saber que há muita gente desenvolvendo databases ou
frameworks que armazenam os dados na forma de Objetos, e não em estruturas
relacionais.
De forma bem resumida posso dizer que as principais características do db4o são:
• É simples de usar, basta usar uma única DLL para as operações básicas;
• Comporta soluções locais e também Client/Server;
• Possuí uma versão para o .NET Compact Framework e para o Projeto Mono;
Com certeza é difícil vender essa idéia, afinal os bancos de dados relacionais tem
dominado o mercado ja a algum tempo. Mas de modo prático pro cliente final não
muda nada. O que certamente vai melhorar com o uso de uma ferramenta como o
db4o, é a sua produtividade, e esse benefício pode ser repassado para o cliente final
em forma de redução de custos.
Mas vale a pena ficar por dentro de como um banco de dados orientado a objetos
funciona, e quais são os benefícios e problemas frente aos relacionais. É por isso que
eu vou começar a abordar este assunto aqui em futuros posts, de forma mais
detalhada e com demonstrações técnicas. Se você tiver interesse em conhecer mais,
também começarei a publicar alguns artigos nas edições impressas da .NET Magazine
sobre esse tema. E também vídeo-aulas no Portal da DevMedia
(www.devmedia.com.br). Aguarde e confira!
A primeira coisa que fazemos quando vamos criar um banco de dados é definir a sua
estrutura. Porém aqui estamos falando de um banco de dados orientado a objetos, e
não um database relacional como o SQL Server ou Oracle.
A primeira coisa que você tem que saber sobre os databases OO é que a estrutura de
dados é definida através de Classes e não de Tabelas. Na prática, o que temos que
fazer é criar nossas classes em C#, no próprio Visual Studio.
Vou começar com um exemplo muito simples, porém preparado para comportar os
exemplos mais avançados que veremos nos posts futuros. Sendo assim, criei no
Visual Studio uma Solution chamada Algoritma, e dentro dessa solution adicionei um
projeto do tipo Class Library, chamado Algoritma.Model. Será aqui que iremos criar
as classes que definirão a estrutura de dados do nosso database.
Você pode criar suas classes usando o diagrama de classes do Visual Studio. Com ele
o processo de modelagem fica bem mais simples e prático. Veja na imagem abaixo
que eu criei uma classe chamada Country.
E por fim o método ToString(), que foi sobrecarregado da classe Objects, e aqui irá
retornar uma string que exibe todas as propriedades do país.
A princípio essa será a única classe que iremos criar. Veremos agora como criar um
banco de dados no db4o e armazenar instancias da classe Country nele.
Antes disso você deve ter observado que até agora não utilizamos nenhum recurso do
db4o. Esse é um diferencial importante, pois podemos definir nossas classes da
maneira que quisermos, e o db4o se encarregará de armazenar os objetos no
database.
Para criarmos nosso banco de dados no db40, vamos adicionar um novo projeto na
Solution, agora do tipo Console Application. Neste exemplo eu criei um projeto
chamado Algoritma.ConsoleApp.
De cara, neste projeto devemos adicionar duas referencias. Uma referencia ao projeto
Algoritma.Model, para que possamos ter acesso à nossa classe Country. E uma
referencia à DLL Db4objects.Db4o.dll, que como foi dito no post anterior, é a DLL
principal do db4o. Essa DLL você provavelmente irá encontrar no seguinte caminho:
C:\Program Files\Db4objects\db4o-7.4\bin\net-3.5.
Com as duas referências criadas, vamos agora ao processo de criação e abertura do
banco de dados, que nada mais é do que uma simples linha de código na classe
Program.cs, veja a seguir:
Como você pode notar estamos criando uma instancia da interface IObjectContainer,
através do método estático OpenFile() da classe Db4oFactory. Veja que este método
aponta para um arquivo com extensão .yap. Esta é a extensão dos databases do
db4o, que neste caso foi nomeado como Algoritma.yap. Caso o arquivo não exista,
ele será criado e aberto, caso exista será apenas aberto.
Em seguida temos uma estrutura try/finally que irá garantir que o database seja
devidamente fechado assim que terminarmos de utilizá-lo.
Muito bem, com isso já podemos fazer nossos primeiros testes CRUD. Comecemos
com um método de inclusão. Basta incluir o método do código abaixo e fazer a sua
chamada no método Main, conforme você vê na própria listagem a seguir:
O Método InsetCountries está criando 3 instancias da classe Country, e armazenando-as no
database através do método Store() que temos no IObjectContainer. Note que ao final
estamos chamando o método Commit(). Este método está implicitamente concluindo a
transação. A partir do momento em que abrimos o database, já estamos em uma transação. E
após a chamada do método Commit() a transação atual foi concluída, e outra iniciada.
Execute sua aplicação e veja que os países são inclusos e exibidos na Console. Confira na Figura
abaixo.
De tão simples parece estranho não é? Parece que não aconteceu nada, que estes objetos
estão apenas na memória, e que ao finalizar a aplicação eles vão ser perdidos. Mas não, eles
foram gravados em disco, lá no arquivo Algoritma.yap, e portanto estão armazenados no
database db4o.
Execute a aplicação e veja como mostra a imagem abaixo, que é exibido o total de países
cadastrados, juntamente com os dados detalhados de cada país.
Abaixo temos o método UpdateCountry, que como você pode ver está realizando um outro
tipo de pesquisa, utilizando o padrão QBE. QBE quer dizer Query By Example, ou “Consulta por
Exemplo”. Isso significa que o db4o deverá nos retornar todos os objetos armazenados que
forem iguais ao do exemplo passado no parâmetro.
Com o objeto recuperado do database, podemos fazer a alteração que desejarmos e salvarmos
essa alteração através do mesmo método Store(). Veja o resultado da execução deste código
na figura a seguir:
Para finalizar segue o código do método DeleteCountry, que também usa QBE para recuperar
o país US do database, e excluí-lo do banco.
O resultado da execução deste método você confere na figura abaixo:
Este foi apenas um exemplo básico de como criar um database db4o e realizar as operações
mais simples com ele.
Mas aqui nós já podemos ver que o processo de gravação e recuperação dos dados é muito
simples, bem mais simples do que estamos acostumados em ambientes de mapeamento
objeto / relacional. Veremos muito mais facilidades nos próximos exemplos.
Nos próximos POSTs iremos ver quais são as principais formas de realizar Queries com o db40.
Grande Abraço e até lá!
A idéia é criar um protótipo que servirá de exemplo para os registros que devem ser
retornados pela pesquisa. Este tipo de query é muito comum na orientação a objetos.
Se quiser conhecer mais sobre o conceito, dê uma olhada neste artigo publicado no
Wikipédia: http://en.wikipedia.org/wiki/Query_by_Example
No db4o quando você usa o QBE, deve fornecer como parâmetro um objeto de
template. O db4o irá retornar todos os objetos que tiverem as propriedades iguais aos
do objeto template, ignorando apenas as propriedades que contiverem valores
defaults.
Fazendo uma consulta na base de dados criada no POST anterior, veja o exemplo
abaixo:
O QBE também pode ser utilizado como uma forma simples e rápida de retornar todos
os objetos de uma determinada classe, veja o exemplo do código abaixo:
A API SODA pode ser utilizada para queries dinâmicas, pois identifica os campos das
classes como strings. Para a maioria das aplicações o ideal é utilizar uma API
fortemente tipada, como é o caso da NQ e do LINQ, mas em certas aplicações a
construção de queries dinâmicas pode ser necessária. A API SODA preenche essa
lacuna.
Para escrever Queries com a API Soda precisamos da interface IQuery, e para isso é
preciso importar o seguinte namespace: using Db4objects.Db4o.Query; Adaptando
para o nosso exemplo, uma Query SODA para retornar todos os países ficaria assim:
Note que a constraint da query é uma “meta descrição” dos objetos que queremos
retornar. O resultado é a lista de todos os países cadastrados, o mesmo resultado que
obtivemos com o QBE e NE nos outros POSTs.
A única restrição das Queries SODA que eu particularmente não gosto, é que as
constraints precisam ser criadas apontando para os atributos privados da classe
(private fields), e não para as propriedades. Isso inviabiliza o uso das Queries SODA
quando usamos as propriedades automáticas (recurso incluso no C#3.0), conforme
fizemos no exemplo da classe Country.
Porém, se nossa classe tivesse sido declarada sem o recurso das propriedades
automáticas, como neste exemplo abaixo:
Poderíamos então executar uma Query SODA com uma condição aplicada aos
atributos, conforme você pode ver no exemplo abaixo:
Esses exemplos mostram apenas o básico que se pode fazer com as Queries SODA.
É possível criar queries bem mais avançadas. Mas o importante a notar aqui é que
esse é um mecanismo bem mais complexo de se criar Queries, se comparado com as
NQs. Porém, toda NQ por debaixo dos panos, é convertida em SODA, o que significa
que as Queries SODA são mais performáticas.
No fim vamos notar que cada estilo de Query atende à uma necessidade, e não será
incomum usar mais do que um estilo na mesma aplicação. No próximo POST vou falar
do LINQ e fechar a sequencia de posts sobre as Queries em db4o.