Olá Pessoal,
O objetivo deste post é mostrar como conectar com jasperReport com DB usando Hibernate, é comum ver a conexão via JDBC tradicional, mas nem sempre é isso que queremos.Então veremos agora com Hibernate.
Lets go…
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, sofrerem alterações teremos que mudar em mais de um lugar? Duplicated Context is not good! :). Até um dia desses nunca precisei eu 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:
JasperReport com JEE
JasperReport + Hibernate
Mas, nem sempre HQL,Criteria etc, atende 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. Daí, será q 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 baseado em testes, 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 etc. 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 executar ela, então se .SQL muda, terei que mudar também o HQL, seria maior trabalho;
- Ireport com .SQL eles tem um bom relacionamento;
- Minha app Java fica mais especifica, 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.
Step 1
Na class DAO
Adicione o método a seguir:
publicstatic Connection getConnection() throws HibernateException, SQLException{
returnnew 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 posts mais antigos, a diferença é que não tem mais a List, sendo passada no terceiro parametro.
Feito, isso, salve e rode Java Application.
Resultado:
Vou ficando por aqui, e espero que tenham gostado do post.
See ya!