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!

26