DB, XML, XSLT - Problemas

15 respostas
P

Olá amigos !!

Há algum tempo atrás li uma mensagem num fórum onde um colega disse que na empresa onde ele trabalhava, existia um recurso muito interessante para se evitar reescrever SQL para vários Bancos de Dados diferentes. Não sei ao certo como isso é feito mas tenho interesse neste assunto e ficaria muito grato se alguém pudesse ajudar.
Alguém conhece alguma ferramenta ou sabe como evitar o problema de se trabalhar com vários SGDB’s diferentes. É cansativo ter que escrever uma consulta que funcione em Oracle, DB2, SQLServer várias vezes. Sei que isso pode ser facilitado com XML e XSLT.
Seria algo parecido com Java, só que para o mundo dos bancos de dados - “Write once, runs anywhere”
:shock:
É isso aí pessoal, agradeço desde já.

Até mais

Cleverson Schmidt

15 Respostas

C

É um objetivo dificil, mas depende muito do que você pretende fazer… se for uma grande aplicação, pode até valer a pena utilizar XMl para fazer algumas coiass…

ainda assim é possível minimizar este trabalho mantendo as querys SQL em arquivos fora do código java por exemplo, permitindo fazer alterações sem recompilar código…(existe um artigo sobre isto aqui no GUJ)

P

Olá Carlos

Antes de mais nada agradeço a ajuda. Eu já li este artigo mas ainda não resolve meu problema. Eu gostaria de encontrar algum mecanismo de trasformação do SQL entre os diferentes bancos que eu utilizo. Acho que muita gente passa por este problema, e desta forma seria interessante se conseguissemos descobrir como resolve-lo.

Se você ou mais alguem tiver alguma idéia…

Até mais amigos

Cleverson

Rafael_Steil

Mágica nao da para fazer. Os banco de dados não seguem um padrao de SQL, muitas coisas funcionam diferente entre as varias opcoes disponiveis no mercado. Dê uma olhada no Castor ( http://www.castor.org ) e no JGrinder ( http://www.jgrinder.com ), talvez eles possam te ajudar.

Rafael

guariba

Bom, aqui eu criei uma superclasse que representa tabelas do banco de dados. Para cada tabela existente, eu extendo essa superclasse. Na superclasse defini os métodos SELECT, INSERT, UPDATE e DELETE que são construídos automaticamente usando reflection na hora em que a tabela é instanciada. Dessa forma vc pode criar filtros na superclasse que ajustam as chamadas SQL ao banco utilizado. Algumas vantagens:

. Não precisa ter scripts para criação das tabelas no banco, basta um método CREATE e pronto.

. As variáveis nas subclasses representam extamente as colunas da tabela. Não precisa criar variáveis nos programas para receber os dados vindos do banco.

. Dá pra checar constraints no cliente, automaticamente.

. Pode criar um método que verifique as colunas do banco e suas representantes na classe e atualizar a definição da tabela no banco - automaticamente. Mais uma vez, adeus scripts.

. Criando objetos GUI com o mesmo nome das colunas da tabela, eu os atualizo automaticamente via reflection (Santa Reflection!!!). Os aplicativos ficam pequeninos.

E consultas em geral? Passo todas elas a outra classe que representa o database e ele faz todo o trabalho.

Um exemplo:

public class Cliente extends Table{
 static
 Column codigo         = NUMBER(6).NOT_NULL,
       nome           = VARCHAR2(40).NOT_NULL,
       endereco       = VARCHAR2(30),
       bairro         = VARCHAR2(15),
       cidade         = VARCHAR2(15),
       uf             = VARCHAR2( 2),
       cep            = NUMBER(8);

static
Constraint cliente_pk = PRIMARY_KEY(codigo),
                uf_fk = FOREIGN_KEY(uf).REFERENCES("UF", "CODIGO");

static
Index nome_idx = INDEX(nome);

 static public void main(String arg[]){
   Database dtb = new Database("TST");
   Cliente c = new Cliente(dtb);
   codigo.set(10);
   nome.set("JOSE DA SILVA");
   c.INSERT();
   dtb.COMMIT();

   codigo.set(2);
   codigo.SELECT();
   System.out.println("Codigo: " + c.codigo + " Endereço: " + c.endereco);

   double c;
   String  n;

   dtb.SELECT   ("CODIGO, NOME").
       FROM     ("CLIENTE").
       WHERE    ("CODIGO BETWEEN 5 AND 30").
       ORDERBY  ("NOME");

   dtb.executa();

   c = dtb.getI(1);
   n = dtb.getS(2);

   dtb.executa("SELECT ENDERECO FROM CLIENTE WHERE CODIGO = 1");
   System.out.println("Endereço=" + dtb.getS(1));
   }
}

Bom, espero ter ajudado.

anjomal

Gostei muito da sua solução so que boiei em uma parte do seu exemplo :shock: podia me dar umas dicas, to iniciando em JDBC …

Mais achei a ideia legal, se tiver documentação dela e puder nos ajudar

Agradeço :wink:

Elvis.The.Pelvis

Uma outra opção, que utilizamos aqui na empresa, propicia uma transparência de banco de dados sem recompilação de código, mas você ainda não pode fugir do SQL.

Nós usamos a arquitetura em camadas do CESAR, daqui de recife, veja como ela funciona:

1 - A arquitetura é dividida em várias camadas

I   - Fachada do sistema
II  - Uma camada controladora
III - A camada de negócios
IV  - O repositório de dados

Esta arquitetura permite que, se você precise fazer alguma alteração na aplicação, a penas a camada responsável é modificada, sem afetar as demais. Você pode até mesmo trocar uma camada por uma outra, implementada de forma diferente e tudo funciona blz.

Mas vamos a parte que interessa. Entre a camada de negócios e a camada de repositório, existe algumas interfaces com métodos de persistência apropriados para cada entidade persistente. Por exemplo, vamos supor que temos duas classes que precisam ser persistidas: Cliente e Pedido. Criariamos duas interfaces IRepositorioCliente e IRepositorioPedido com os métodos:

IRepositorioCliente
-------------------
getCliente(int idCliente);
getClientes();
updateCliente(Cliente c);
deleteCliente(int idCliente);
insertCliente(Cliente c);


IRepositorioPedido
------------------
getPedidos(int idCliente);
getPedido(Cliente c, int idPedido);
getPedido(int idPedido);
insertPedido(Pedido p);

Cliente e Pedido encapsulam os campos das tabelas correspondentes.

Agora para cada banco de dados em específico, criamos uma classe que implementa IRepositorioPedido ou IRepositórioCliente, por exemplo
ClienteOracle, ClientePSQL, ClienteMySQL, que ao implementar os métodos da interface, utilizam os SQL correspondente de cada banco.

Para a camada de negócios, existe então apenas a interface. Você cria instâncias do repositório através de uma Factory e se precisar mudar o banco, precisamos apenas mudar um property em algum arquivo de texto para que a Factory comece a criar repositórios do novo tipo de banco.

Desvantagens:
Você precisa ter uma classe para cada entidade persistente para cada banco.

Vantagens:
Seu repositório pode ser qualquer coisa, uma banco Oracle ou Interbase, um arquivo XML, um txt, um stream pela rede para algum servidor em outro lugar, entre outros.
Não há necessidade de recompilação (a não ser que o novo repositório não exista e ainda precise ser criado, mesmo assim, só precisa compilar o código do NOVO repositório)

P

valeu pela força galera !! :lol: :lol: :lol: :lol: :lol: :lol:

guariba

Um bom começo Anjo, é dar uma estudada no tutorial sobre JDBC e reflection aqui no próprio GUJ. O que eu mais admiro no Java é a simplicidade, e JDBC não escapa disso. A parte mais chata é a conexão com o banco, mas todos eles possuem exemplos muito bem documentados.

O que eu adorava no C++ e estou babando no Java é esta caracteristica expansível que a OOP nos possibilita. É quase como criar uma linguagem dentro da linguagem. Se não achou muito confortável a maneira como a Sun desenvolveu o acesso ao banco vai lá e cria o seu próprio modelo, ou melhor, extende o modelo existente! O espírito é esse.

Ainda não terminei de implementar o modelo que usei no exemplo. Mas a idéia é a seguinte: criar uma classe que sabe como executar todo o trabalho apenas “enxergando” as definições das suas subclasses. Por exemplo, o método SELECT da superclasse pesquisa (via reflection) os atributos da subclasse e constroi a chamada SQL correspondente. Novamente usando reflection o resultado é armazenado nos atributos da subclasse. Se precisar fazer algum ajuste em função do banco será necessário faze-lo somente na superclasse.

Eu não sou conhecedor das diferenças entre os bancos, mas desconfio que a maior parte delas, senão todas, estarão nos SELECTs. Vc certamente irá fazer pesquisas das mais diversas no banco, com as mais variadas tabelas e o SELECT da superclasse acima não haverá de servi-lo. Então será necessário um SELECT generalizado que simplesmente retorne o resultset. Isso vc consegue criando um método SELECT vinculado a classe que representará a conexão com o banco de dados (a que eu chamei de Database). As possíveis diferenças vc pode traduzir entre as versões dos bancos antes de efetivamente enviar o SQL simplesmente “xeretando” o SQL e substituindo, por exemplo, uma função LENGTH por LEN.

Como já foi recomendado por outro colega, não esqueça de separar o aplicativo em mais que 2 camadas, isolando apresentação-regras de negócio-dados no mínimo (3-tier). Isso trará longevidade!

No mais, eu estou aprendendo tb :lol:
Espero ter sido util. Boa sorte!

anjomal

Po blz … mais se não for pedir muito vc poderia me mandar um exemplo ou mesmo postar ele aqui, pois estou desenvolvendo um programa e usando essa metodologia sua acho que vai ser bem mais rapido …

Mais de qualquer forma agradeço …

Ai Valew pela ajuda …

:smiley:

anjomal

Po blz … mais se não for pedir muito vc poderia me mandar um exemplo ou mesmo postar ele aqui, pois estou desenvolvendo um programa e usando essa metodologia sua acho que vai ser bem mais rapido …

Mais de qualquer forma agradeço …

Ai Valew pela ajuda …

:smiley:

IvoD

“powercle”:
Olá amigos !!

Há algum tempo atrás li uma mensagem num fórum onde um colega disse que na empresa onde ele trabalhava, existia um recurso muito interessante para se evitar reescrever SQL para vários Bancos de Dados diferentes. Não sei ao certo como isso é feito mas tenho interesse neste assunto e ficaria muito grato se alguém pudesse ajudar.
Alguém conhece alguma ferramenta ou sabe como evitar o problema de se trabalhar com vários SGDB’s diferentes. É cansativo ter que escrever uma consulta que funcione em Oracle, DB2, SQLServer várias vezes. Sei que isso pode ser facilitado com XML e XSLT.
Seria algo parecido com Java, só que para o mundo dos bancos de dados - “Write once, runs anywhere”
:shock:
É isso aí pessoal, agradeço desde já.

Até mais

Cleverson Schmidt

Caro,

No J2EE vc pode usar EJB… em EJB vc nao escreve sql…
vc so tem que criar arquivos xml para cada banco somente…

veja na documentacao do j2ee que vc vai ter mais ajudass…

guariba

Anjo, te mandei as classes. Recebeu?

anjomal

Ai guariba valeuzão pela força !!!

Qualquer coisa estamos ai valew !!!

PRA QUE JANELAS SE POSSO VIVER SEM PAREDES !!!
SEJA LIVRE USE LINUX !!!

alisson_belinki

Meu que cara mais feio esse anjo.

Ataxexe

Cara, suas últimas mensagens só foram pra desenterrar tópicos sem o menor motivo. Dê uma olhada nas regras do fórum e pense melhor antes de brincar de Deus e ressussitar os tópicos pois isso só ajuda a bagunçar o fórum.

Criado 20 de dezembro de 2002
Ultima resposta 9 de mai. de 2014
Respostas 15
Participantes 9