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!