Um conhecimento só é válido quando compartilhado.

quinta-feira, 15 de setembro de 2016

ORMBr - Mapeamento objeto-relacional

Mapeamento objeto-relacional (ou ORM, do inglês: Object-relational mapping) é uma técnica de desenvolvimento utilizada para reduzir a impedância da programação orientada aos objetos utilizando bancos de dados relacionais. As tabelas do banco de dados são representadas através de classes e os registros de cada tabela são representados como instâncias das classes correspondentes.
Com esta técnica, o programador não precisa se preocupar com os comandos em linguagem SQL; ele irá usar uma interface de programação simples que faz todo o trabalho de persistência.
Não é necessária uma correspondência direta entre as tabelas de dados e as classes do programa. A relação entre as tabelas onde originam os dados e o objecto que os disponibiliza é configurada pelo programador, isolando o código do programa das alterações à organização dos dados nas tabelas do banco de dados.
ORM não é uma técnicas tão recentes, pois jé exitem a algum tempo em outras linguagens como Java, e C#, acredito que muitos já ouviram falar sobre Hibernate ORM para a linguagem Java, e Entity Framework para as linguagens .NET da Microsoft.
Já para o Delphi, essa técnica é mais recente, começou a se expandir a partir da versão Delphi 2010, após as enormes melhorias na RTTI e o recurso Generics.
Ultimamente, acredito que a maioria de vocês, tem lido ou ouvido algo sobre ORM, mas a questão é, qual seria as ventagens e quanto isso me custaria para implementar em meus sistemas já existentes, e por fim qual o melhor ORM para eu analisar?
Venho a algum tempo, analisando e estudando as vantagens e funcionalidades de alguns ORMs do mercado, assistindo videos, analisando exemplos etc... e cheguei a conclusão que o ORM seria um grande aliado para nós desenvolvedores, principalmente com a falta de profissionais qualificados no mercado para nos ajudar na continuidade em nossos projetos.
Vou citar aqui um ponto de vantagem, veja se concorda:
Muitos de nós somos desenvolvedores solitários, o qual temos um sistema e a N vezes pensamos em contratar alguém para nos ajudar a mantê-lo, mas nosso tempo é curto e nosso código é tão enraizado em nossos modo de desenvolvimento que ao pensar em ensinar alguém, até desanimamos, pois isso iria nos consumir tempo enorme, então  preferimos nós mesmos pegar e fazer.
Com um ORM, temos ventagens nesse ponto, pois um ORM irá exigir uma linha de aprendizado bem curta a um desenvolvedor que possamos contrata-lo para nos ajudar, isso porque o ORM irá fazer a parte pesada nos bastidores, aliviando e agilizando o aprendizado em um novo profissional.
Poderia ficar aqui citando várias situações das quais, acredito eu que 100% de nós desenvolvedores sofremos no dia dia para conseguirmos ajuda em nosso projetos, mas não vou fazer isso, o exemplo acima já nos mostrar uma visão geral de nossas dificuldades.
Bom, deixa eu mostrar agora para você como que seria simples explicar para um aprendiz, para ele fazer uma tela, o mais simples que seja usando um ORM.
Vou demostrar as imagens para que vocês tenham uma visão da funcionalidade e após vou postar o código usado para chegar a esse resultado.
Acima está a lista de clientes, os componentes usados para que os dados possam ser visualizados são os Dataware, já conhecidos de todos os desenvolvedores Delphi.
Essa tela é a página detalhe do clientes selecionado na lista na primeira imagem, através dessa tela podemos Incluir, Alterar e Excluir registros.
O que usamos para gerar essa tela usando o ORM? 
Um TFDConnection ou poderíamos usar no lugar um TSQLConnection ou ZConnection.
Dois TClientDataSet ou poderíamos usar no lugar um TFDMemTable. 
Dois TDatasources
TDBGrid, TDBEdits e um TDBNavigator, familiar, não ?
Observe aqui que estou usando componentes já conhecidos nosso, não existe uma componente criado especificamente para atender ao ORM.
Agora vamos ao código para que os dados apareçam na tela grade  e detalhe, e para que as modificações sejam persistidas no banco de dados.
procedure TFrmCadastroCliente.FormCreate(Sender: TObject);
begin
  oConn := TFactoryFireDAC.Create(FDConnection1, dnSQLite); 
  oCliente_Pesquisa := TContainerClientDataSet<tcliente>.Create(oConn, ClienteDataSet1);
  oCliente_Detalhe  := TContainerClientDataSet<tcliente>.Create(oConn, ClienteDataSet2);
  oCliente_Detalhe.Controller := TControllerCliente< tcliente >.Create;
  oCliente_Pesquisa.DataSet.Open;
end;
procedure TFrmCadastroCliente.Cliente_DetalheAfterDelete(DataSet: TDataSet);
begin
  oCliente_Detalhe.DataSet.ApplyUpdates(0);
end;
procedure TFrmCadastroCliente.Cliente_DetalheAfterPost(DataSet: TDataSet);
begin
  oCliente_Detalhe.DataSet.ApplyUpdates(0);
end;
Esse monte de código acima, irá proporcionar os recursos de Incluir, Alterar e Excluir, sem nem mais uma linha.
Cadê o comando "SELECT" ? O ORM irá cria-lo automaticamente.
Cadê o comando "DELETE", bem esse o Delphi já faz para nós, mas como no ORM se trabalha desconectado quem irá fazer é o próprio ORM.
Cadê o comando "UPDATE", mesma situações do comando "DELETE"
Mas como ele sabe como gerar o SELECT sabe qual tabela abrir, sabe quais campos mostrar, enfim como o ORM identifica tudo?
Bem o código acima mostra a simplicidade de uso para um desenvolvedor, seja ele um aprendiz, com conhecimento ou um expert, criar algo real.
Por traz disso existe o que chamamos de Modelo, o modelo irá dizer tudo para o ORM, dessa forma desenvolvedores mais experientes podem cuidar dos modelos, enquanto os demais fariam o designer de forma simples e funcional.
Veja como fica o modelo usado para esse exemplo na imagem abaixo:
unit ormbr.model.cliente;

interface

uses
  Classes,
  /// orm
  ormbr.mapping.attributes;

type
  [Entity]
  [Table('cliente','')]
  Tcliente = class
  private
    { Private declarations }
    Fcliente_id: Integer;
    Fcliente_nome: String;
    Fcliente_endereco: String;
  public
    { Public declarations }
    [PrimaryKey()]
    [Column('cliente_id', ftInteger)]
    [Dictionary('Código','Mensagem de validação','','','',taCenter)]
    property cliente_id: Integer Index 0 read Fcliente_id write Fcliente_id;

    [Column('Nome do Cliente', ftString)]
    [Dictionary('cliente_nome','Mensagem de validação','','','',
    taLeftJustify)]
    property cliente_nome: String Index 1 read Fcliente_nome write Fcliente_nome;

    [Column('Endereço', ftString)]
    [Dictionary('cliente_endereco','Mensagem de validação','','','',taLeftJustify)]
    property cliente_endereco: String Index 2 read Fcliente_endereco write Fcliente_endereco;
  end;

implementation

end.
Como vocês puderam vê, o desenvolvedor não precisou escrever um linha se quer de comando SQL, e convenhamos qual ser humano não teria condição de aprender a criar uma tela de cadastro desse, usando ORM? Se não fosse o ORM teríamos que ensinar ainda sobre tudo comando SQL aumentando assim consideravelmente a linha de aprendizado de um possível novo funcionário contratado, o ORM nos proporciona também criarmos linha de produção, definindo os setores de Tela, de Modelos e de Regras de Negócio separadamente, cada um, responsável por seu setor e código, isso não é um sonho? Confesse para si mesmo.

Bom, com isso venho apresentar para vocês:
ORMBr, como o nome já diz, e assina Brasil, é um Framework criado por mim, e apesar de ser uma criança ainda, já mostrou um QI acima da média, e a ótima notícia é que ele é OpenSource, podendo ser baixado direto no Bitbucket.
Estamos providenciando um Site e um Fórum para ele, para que possamos juntos, ver essa criança crescer e nos encher de orgulho por suas conquistas.

Fórum Discussão : http://ormbr.forumeiros.com/ 

Vai lá se cadastre, baixe e teste, conto com todos vocês, e até breve.

SAC Automação Delphi e Lazarus

SAC Automação Delphi e Lazarus
Assine nosso SAC Automação Delphi e Lazarus para ter suporte técnico especializado em desenvolvimento

Quem sou eu

Minha foto

Proprietário/Administrador de Empresa em TI (Tecsis Informática)
  • Autor dos projetos OpenSource ORMBr, e DBCBr
  • Autor dos componentes ACBrInstall, ACBrSped, ACBrPaf, ACBrInStore, ACBrDownload.

Total de visualizações

Postagem em destaque

ORMBr - Mapeamento objeto-relacional

Mapeamento objeto-relacional ( ou ORM, do inglês: Object-relational mapping ) é uma técnica de desenvolvimento utilizada para reduzir...

Todo os direitos reservados.. Tecnologia do Blogger.

Seguidores

Google+ Seguindores