DataARTIGO

Conectando o JasperReport com DB via Hibernate

Olá, pessoal! O objetivo deste artigo é mostrar como conectar com JasperReport com DB usando Hibernate. É comum ver a conexão via jdbc tradicional, mas nem sempre é isso que queremos – ainda mais quando já estamos usando o Hibernate em nossa app. 

Contexto

Talvez você já tenha passado por o problema abaixo:

Class.forName("com.mysql.jdbc.Driver"); String db = "jdbc:mysql://localhost:3306/relatorios"; conn = DriverManager.getConnection(db,"camilo","lopes");

E não será nada legal ter que colocar esses dados dentro do seu code Java, ou criar um arquivo separado só para isso, e quando o user/ password/ url sofrer alterações, teremos que mudar em mais de um lugar. “Duplicated Context is not good!”. Até um dia desses nunca precisei e não tinha preocupação com a conexão, uma vez que já passava para o JasperPrint uma lista(list) dos dados recuperados via HQL, conforme os posts a seguir:

Mas nem sempre o HQL,Criteria e outros atendem a uma regra de negócio da melhor forma. No meu caso, já tinhamos o SQL com as devidas queries e lá que estavam as regras com base no DB que estamos trabalhando, que vai além de um simples retrieve. Será que eu deveria usar HQL/ Criteria somente porque estou usando Hibernate? Neste caso, a resposta é não. Tive que analisar o impacto, o custo disso e onde as mudanças aconteceriam; e após uma investigação baseada em testes, vi que usar o SQL será a melhor solução pelo seguintes pontos:

  • Toda mudança de regra de negócio referente à DataWarehouse acontece de fato no banco, nos SQL. Então, não tem porque eu querer “repetir” as regras do SQL dentro do código Java;
  • Evitou a duplicação de código, porque se a regra vem da DW, o código Java só ia executá-la; então se o SQL muda, terei que mudar também o HQL – o que me daria um maior trabalho;
  • Ireport tem um bom relacionamento com SQL;
  • Minha app Java fica mais específica, com o objetivo apenas de gerar o report;

Desenvolvendo

Levando em conta que você já tem seu report pronto, vou mostrar apenas como configurar sua app para conectar do DB via Hibernate.

Na class DAO, adicione o método a seguir:

public static Connection getConnection() throws HibernateException, SQLException{
return new AnnotationConfiguration().configure().buildSettings().getConnectionProvider()
.getConnection();
}

Agora, na sua classe que gera o Report,  adicione (não esqueça de importar o arquivo .jrxml para o seu projeto no eclipse):

JasperReport pathRxml = JasperCompileManager.compileReport("layout/reportcamilo.jrxml"); 
JasperPrint printReport = JasperFillManager.fillReport(pathRxml, null, DAO.getConnection());
JasperExportManager.exportReportToPdfFile(printReport, "reportexcamilo.pdf");

Pronto, era apenas isso! Passar o objeto Connection vindo do Hibernate para o método fillReport(). Se você viu os artigos mais antigos, percebeu que a diferença é que não tem mais a List sendo passada no terceiro parametro.

Feito isso, salve e rode a Java Application.

Espero que tenham gostado e até a próxima!

é Bacharel em Sistemas de Informação e Especialista em Gestão e Estratégia de Negócios. Trabalha com TI desde 2003 e possui as certificações SCJP 5 e SCM. Trabalhou na IBM Brasil como Analista Programador Java, passou pelo laboratório da Enterprise Computing Lab (ECL) HP como Software Engineer, Ci&T como Engenheiro de Software em projeto JEE. Tem experiência internacional em Índia, Dubai e Londres. Atualmente é cofundador da ITSLabs (www.itslabs.com.br), uma start-up focada na criação de produtos web e mobile para start-ups. Também é autor dos livros "Guia do Exame SCJP", "Guia Prático JEE com Frameworks" e "TDD na prática".

Ver perfil