Como separar código SQL do código Java?

Muitos falam que não é bom misturar o código SQL dentro do código Java.
Mas e para separar os dois ? Quais as técnicas que vocês utilizam ?
Já ouvi falar de colocar códigos Select dentro de txt e chamar a partir de lá. Mas será que é o mais viável ?
E no caso de Insert e Update ? Será que não seria mais complicado ?
O que é melhor fazer p/ separar o código ?

Usar patterns como DAO.
Utilizar uma ferramente de ORM, como EJB 2.0 Entity Beans, Top Link, JDO, Hibernate, OBJ, Prevayler e tantos outros…

[quote=“franklinbenini”]Muitos falam que não é bom misturar o código SQL dentro do código Java.
Mas e para separar os dois ? Quais as técnicas que vocês utilizam ?
Já ouvi falar de colocar códigos Select dentro de txt e chamar a partir de lá. Mas será que é o mais viável ?
E no caso de Insert e Update ? Será que não seria mais complicado ?
O que é melhor fazer p/ separar o código ?[/quote]

Se vc quiser colocar as querys em um arquivo externo, utilize a classe Properties, de uma olhada no GUJ, pois tem um tutorial a respeito disso.

Pessoalmente tambem nao acho legal. Tem um tutorial do Rafael Steil aqui no GUJ falando exatamente sobre isso. :smiley:

Marcio Kuchma

Por favor!!! A não ser que seu projeto seja bem simples não faça isso!!! Experiência prórpia. Tenho SQLs aqui com mais de 60 linhas… por isso em um .properties fica um saco, editar no .properties é um saco. Agora estou terminando umas duas classes para depois implementar uma classe que leia um XML onde ficarão minhas querys que depois serão inseridas em um propertie. Mas fica a ressalva - por minha experiência - , editar querys no .properties pode ser traumatizante.

Gustavo Guilherme BacK

[quote=“back”][Mas fica a ressalva - por minha experiência - , editar querys no .properties pode ser traumatizante.

Gustavo Guilherme BacK[/quote]

Soh tem que tomar o cuidado para nao deixar de usar uma boa solucao para determinado problema por questoes simples ou ideologias, por exemplo.

Eu pessoalmente nunca tive maiores problemas.

Rafael

Tem como mandar essas classes p/ eu dar uma olhada ?

[quote=“Rafael Steil”]Soh tem que tomar o cuidado para nao deixar de usar uma boa solucao para determinado problema por questoes simples ou ideologias, por exemplo.

Eu pessoalmente nunca tive maiores problemas.

Rafael[/quote]

O problema é que eu perco muito tempo passando uma sql pros properties. Quando eu faço um SQL ele fica todo indentado, ando perdendo muito tempo quando preciso fazer uma alteração ou adicionar uma nova query quando vou colocar todo o código em uma única linha, além do que, depois pra analisa-lo fica terrível.

Tem alguma sugestão (numa dessa ando fazendo besteiras)?

Gustavo Guilherme BacK

[quote=“back”]
O problema é que eu perco muito tempo passando uma sql pros properties. Quando eu faço um SQL ele fica todo indentado, ando perdendo muito tempo quando preciso fazer uma alteração ou adicionar uma nova query quando vou colocar todo o código em uma única linha, além do que, depois pra analisa-lo fica terrível.

Tem alguma sugestão (numa dessa ando fazendo besteiras)?

Gustavo Guilherme BacK[/quote]

Concordo com voce. Apenas ressaltei a importancia de nao perder o foco na solucao, pois as vezes o pessoal muda partes imporatnes do sistema, ou partes que tem solucao comprovada ( como patterns, por exemplo ), apenas porque acham “chato” determinada solucao…

No teu caso, daria para rodar uma task do ant para fazer a conversao xml->properties. Alias, a solucao em Properties eh a mais comum, ja que nao precisa de altas estruturas para guardar os dados, mas nada impede de deixar em um xml mesmo…

Rafael

Gostei da tua idéia de converter o xml em um properties. Sabes se essa solução pode ser feita somente com o ant? Ou eu teria de fazer uma classe pra converter o xml em .propertie?

Gustavo Guilherme BacK

Acho que você deveria avaliar o uso do Hibernate, vc terá o trabalho de converter seus fontes uma única vez. Tem se mostrado uma boa saida para estes tipos de problemas.

:2gunfire: :onfire:

Cara, aqui eu não trabalho com cadastros “normais”. Tenho de fazer a apresentação web de um banco multidimensional de dados estatísticos. Eu bem queria poder usar um Hibernate mas a coisa aqui é bem complexa, por isso tenho necessidade de usar sql mesmo.

Gustavo Guilherme BacK

E por que você acha que você não poderia usar Hibernate? Você pode usar SQL em Hibernate, se quiser.

    PreparedStatement p = session.connection().prepareStatement(sql);
//... bla bla bla

:slight_smile:

[quote=“Daniel Quirino Oliveira”] PreparedStatement p = session.connection().prepareStatement(sql);
//… bla bla bla
:)[/quote]

Eu ainda estaria preso ao sql. E isso seria 60% das querys.

Gustavo Guilherme BacK

[quote=“back”]Gostei da tua idéia de converter o xml em um properties. Sabes se essa solução pode ser feita somente com o ant? Ou eu teria de fazer uma classe pra converter o xml em .propertie?

Gustavo Guilherme BacK[/quote]

Bom, nao precisa ser necessariamente assim. Como voce disse que fazia algo parecido, dei uma sugestao de uma possivel maneira de aprimorar a tarefa…

Mas, ate onde eu saiba, nao tem um “conversor de xml para properties”, ate pq nao faria mto sentido ter algo especial para isso. Voce poderia fazer uma classe que le o xml e gera o properties dele, e entao voce colocaria uma task no ant para chamar a classe de conversao automaticamente…

algo nesse estilo.

Rafael

É o que eu estava imaginando agora a pouco. A idéia parece bem legal, vai evitar que eu fique me matando com o sql em uma única linha… :evil:

Gustavo Guilherme BacK

Mas assim, mesm com Properties voce nao eh obrigado a deixar o sql todo em uma unica linha… basta colocar o caracter ao final de cada linha…

campo  = aaa \
     bbbbbbbbbbbbbbbbb \
     cccccccccccccccccccc

Rafael

Dessa é que eu não sabia!!! Agora só vou editar com mais carinho o meu properties e vou poder economizar umas horinhas que ia gastar da outra forma. :stuck_out_tongue:

Valeu Rafael!!!

Gustavo Guilherme BacK

[quote=“Rafael Steil”]Mas assim, mesm com Properties voce nao eh obrigado a deixar o sql todo em uma unica linha… basta colocar o caracter ao final de cada linha…

campo  = aaa \
     bbbbbbbbbbbbbbbbb  \
     cccccccccccccccccccc

Rafael[/quote]

Soh complementando a resposta do Rafael, quando vc utilizar um join ( sinal de igual = ), vc precisa utilizar o escape
Fica assim

selectFuncionario = 
select nome, endereco, nome_empresa from empresa, funcionario \
where empresa.blablabla \= funcionario.blablabla

Quando o .properties é lido pela primeira vez faz essa substituição, sendo assim dá pra colocar só o = e funciona. Pelo menos nunca tive problema com isso.

Gustavo Guilherme BacK