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!







