Dicas de Grails #1 – como executar código SQL

A partir de agora iremos publicar dicas rápidas de desenvolvimento aqui no site da itexto: então vamos estreiar com uma nova série, Dicas de Grails, na qual iremos expor alguns usos pouco conhecidos do framework. E a dica de hoje é: como executar código SQL de forma segura.

Rápido background: conheça o Hibernate

Se você usa Grails sabe que por padrão o Hibernate é usado como mecanismo de persistência do framework através do GORM. Então, por que não tirar proveito disto? Uma dica que costumo passar a todos os nossos clientes e alunos é: se deseja dominar o GORM, estude o Hibernate.

Este estudo nos possibilita ter um uso muito mais profundo e produtivo do GORM e, consequentemente, acaba evitando uma série de problemas que as pessoas enfrentam quando estão dando seus primeiros passos com o Grails. Quer ver um exemplo bacana? O acesso ao objeto DataSource.

Há dois caminhos para se executar código SQL: um perigoso e outro correto.

Primeiro caminho: o perigoso

Simplesmente injete o bean DataSource em sua classe de domínio, controlador, serviço ou biblioteca de tags, tal como o exemplo abaixo:

 

class LogicaService {
   def dataSource

   def metodoDeNegocio() {

       def connection = dataSource.getConnection()

     }
}

 

O objeto dataSource é uma implementação interface javax.sql.DataSource. Ele foi injetado pelo Spring como uma dependência ao seu objeto. Portanto você poderá usar aqui tanto a API JDBC padrão do Java ou, se preferir, o suporte do Groovy a bancos de dados relacionais.

(Por trás dos panos quem domina o Grails é o Spring (seu projeto Grails é uma aplicação Spring MVC por baixo dos panos, sabia?). Sendo assim, o conhecimento deste framework lhe trará uma produtividade ordens de magnitude maior ao desenvolver com Grails!)

Qual o problema com esta abordagem? Ao acessarmos o bean dataSource diretamente não há garantia de que a conexão obtida esteja dentro do mesmo contexto transacional que o restante do seu código. E aí as coisas podem se complicar. Use este caminho apenas se tiver muita certeza do que está fazendo.

Segundo caminho: o seguro e correto

Lembra no início do post quando falei que o conhecimento do Hibernate é muito importante? Usando o método withSession, injetado em todas as classes de domínio do Grails podemos ter acesso direto à sessão do Hibernate (JavaDoc). E na sessão há um método chamado doWork, criado justamente para os casos nos quais precisamos executar código SQL nativo.

Este método recebe como parâmetro um objeto que implemente a interface Work , que possuí um único método:

void execute(Connection connection)
throws SQLException

Como ficaria seu código então? Primeiro uma versão com a cara do Java:

ClasseDeDominio.withSession {session -> // olha a sessão do Hibernate aqui!

  session.doWork(
        new org.hibernate.jdbc.Work() {
           public void execute(Connection connection) throws SQLException {
        // seu código SQL usando connection entra aqui
          }
      }
  }

}

Ou, se preferir, pode simplesmente passar um objeto qualquer (ou mesmo um map) que contenha um método cuja assinatura seja equivalente à da interface Work ao método doWork.

PS:

Aos interessados, estamos finalizando (finalmente) a preparação para nossas novas turmas de Groovy e Grails em nosso projeto Formação itexto. Inscreva-se no site para saber mais novidades em breve!

2 comments on “Dicas de Grails #1 – como executar código SQL

  1. Kico, sempre q preciso de executar um sql eu injeto o DataSource e passo no construtor da classe groovy.sql.Sql e aparentemente não tive problema, esse abordagem pode gerar problema?

    1. Oi Weibe, pode sim.

      Se você tiver outras operações de alteração de dados ou pesquisa executadas no mesmo código, sem ser usando o datasource, não há garantia de que todos estejam dentro do mesmo contexto transacional, o que pode gerar erros difíceis de serem resolvidos.

Responda

Your email address will not be published. Required fields are marked *