Conectar JasperReport com DB via Hibernate

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!

Relatório Ireport + JasperReport JEE + JSF

olá Pessoal,

No post de hoje, vou apresentar como gerar relatorios de uma base de dados sendo uma aplicação JEE. Em outro post, mostrei como gerar relatorios usando Java Basico com Hibernate, aqui vamos manter a mesma estrutura técnica a diferença apenas que será com foco para JEE. Espero que gostem.
Lets go…

Requisitos

Starting…

Para gerar relatorios em ambiente JEE, há algumas mudancas a nivel de codigo que sofrem alterações, porem tudo de ireport com BD é mantido.

passo 1

  • criar o layout no ireport e fazer a conexao com o banco de dados e definir as colunas do relatorio, enfim definir a estrutura do relatorio

passo 2

  • criar a classe de conexao com banco de dados – Hibernate
  • Criar o bean

passo 3

  • cria um package exclusivo para o relatorio e uma classe, por questao de organizacao importar o jrxml para o projeto e para o package do relatorio por medida de seguranca

passo 4

  • para que o arquivo seja gerado na pagina WEB, eh preciso mudar algumas coisas no metodo responsavel por gerar o relatorio:

FacesContext context = FacesContext.getCurrentInstance();

HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();

ServletOutputStream responseStream = response.getOutputStream();

InputStream caminho = getClass().getResourceAsStream(“../relatorio/reportblog.jrxml”);

response.setContentType(“application/pdf”);

  1. criar um context e objetos de resposta.

  2. Fazemos um stream do caminho onde esta o jrxml. Quando temos dois pontos antes da barra significa que temosum caminho diferente da classe que gera o relatorio

  3. depois um response que informa o tipo do conteudo para o browser saber qual aplicativo chamar caso ele tenha suporte response.setContentType(“application/pdf”);

Na linha a seguir informamos como sera o nome do arquivo a ser gerado

response.setHeader(“Content-Disposition”,”attachment; filename=\”relatorio.pdf\””);

Abaixo temos o padrao para invocao

JasperReport pathReport = JasperCompileManager.compileReport(caminho);

//relatorio gerado

JasperPrint preencher = JasperFillManager.fillReport(pathReport, null,new JRBeanCollectionDataSource(listaUS));

JasperExportManager.exportReportToPdfStream(preencher,responseStream);

responseStream.flush();

responseStream.close();

context.renderResponse();

context.responseComplete();

O resultado

O resultado eh que ao inves de ter um arquivo que é direcionado para um local, ele aparece no browser (firefox, Chrome, IE) do usuario. E o browser decide como vai apresentar esse arquivo. Por exemplo, no FireFox, ele aprende o arquivo no proprio Browser, no Internet Explorer ele abre uma Janela onde o usuario decide se vai abrir ou fazer o download.

JasperViewer

O JasperViewer eh forma de exibir o relatorio em applet, ao inves de usar o browser, pode ser ate mais amigavel que usar o proprio browser, mas deve ser analizado o tempo de carregado disso em producao, basta adiciona a linha abaixo

JasperViewer.viewReport(preencher, false);

E desabilitar as linhas referente ao browser, para que nao seja executada em paralelo

response.setContentType(“application/pdf”);

response.setHeader(“Content-Disposition”,”attachment; filename=\”relatorio.pdf\””);

Vou ficando por aqui, espero que tenham gostado do post.

Abracos, see ya! Have a nice week, guys!




Relatório Ireport + JasperReport com Hibernate

olá Pessoal,

Neste post vou mostrar como gerar um relatório usando Ireport de onde as informações vem do BD. Além disso usaremos o Hibernate para conexão. É bem comum uma aplicação o cliente querer algum tipo de relatório. Para gerar os relatorios vamos usar Ireport e o JasperReport. Fiz uma pesquisa rapida na internet e vi alguns posts eram limitados à criar relatórios sem banco de dados, alguns com banco de dados, porem confusos de entender eu sentir dificuldade de compreender,levando em conta que nunca tivesse visto o assunto. E no “mundo real”, se gera relatório de uma base de dados, que na maioria das vezes é um banco de dados. Bom eu tentarei ser pratico no post e a teorica abordada aqui será o suficiente para saber o que significa se deseja se aprofundar no assunto sugiro usar o velho Google e participar das comunidades ou comprar um livro.

Outro ponto  é que neste post será um Java Project normal, em outro post veremos como fazer isso em JEE em um projeto JSF.

Lets go..

Iniciando

Vou levar em conta, que você já tem um BD e uma tabela de onde deseja extrair a informação. Essa é a minha:

ireportbdus

Requisitos:

Você precisa fazer o download do Ireport. A versão mais recente é 3.7.6 neste momento que escrevo o post.


Configuração

copiar os .jars que estã na pasta ext do Ireport para o projeto Java . Se for JEE, adicionar na pasta lib. Não esquecer do .jar para o banco de dados caso os dados relatório venha de um banco de dados, que é o mais real e comum.

  • commons-beanutils

  • commons-collections

  • commons-digester

  • commons-logging

  • groovy-all

  • iText

  • poi

  • jasperreports


Veja o que é Ireport & JasperReport (de forma simples e direta):

Ireport = é uma especie de IDE para criação do layout do seu relatório, ou seja, que cara vai ter e o que vai ter no seu relatório. E é aqui que fazemos a conexão com o banco de dados e consequentemente as tabelas e onde informamos quais colunas de uma tabela vai aparecer no relatório. Ele gera um arquivo .jrxml que será lido por JasperReport.


JasperReport = É uma API que permite nossa classe Java estabelecer uma “conversa” com o nosso layout-relatório. Isso vem a ser util para que sua aplicação Java, gere relatórios em um único ambiente. O usuário não percebe que foi gerado por algo “fora” Java(isso para aqueles que sabem o que é Java).

Na pratica como acontece:

– o desenvolvedor vai lá e cria o layout do relatório com base no proposito deste e põe logomarca da empresa e os dados que devem aparecer. Não precisa ser um webdesigner para desenhar o layout. E é no Ireport que falamos de onde vem a info se será de um BD ou não.

-No JasperReport apenas setamos onde está o layout .jrxml do Ireport e em seguida informamos e é aqui que informamos para qual tipo vamos exportar o relatório: PDF,XML, HTML, TEXT. Podemos dizer que será gerado um arquivo em um local especifico ou se for um JEE, que vai ser carregado pelo Browser.

Note: os nomes das variaveis da classe devem estar iguais aos nomes dos campos (fields) no layout do relatório.

Mão na massa

Vamos colocar mão na massa por partes:

Parte 1: ir para o Ireport (não vou enumerar porque vai ficar zuado a formatação)

vamos primeiro criar um arquivo no Ireport e seguir as instruções do assistente que é bem simples:

ireportimg1

Na parte de banco de dados basta informar os de conexão do banco.

ireportimg2

Feito isso temos o o relatório na tela e podemos edita-lo. Observe que já foi montando com os dados do banco de dados, ou seja, com os nomes da coluna e nos devidos locais, isso acontece no Ireport mais recente, as vezes antigas não faziam isso.

ireportimg3

Parte 2: No Eclipse

Agora no Eclipse precisamos criar um projeto. Este será um Java Project.

Passos:

-Crie o Bean (os nomes entre o bean e os fields no layout devem ser os mesmos)

-Crie conexão com banco de dados (usamos o Hibernate)

-Crie um método List na classe DAO usando HQL com a query que deseja;

-importar para o projeto do eclipse o arquivo jrxml

-crie a classe main com exportando o relatório


Abaixo veja a estrutura do meu projeto

ireportprojectbdmain

note: é recomendavel colocar o .jrxml em um package para terceiro não ter acesso, mas coloquei fora só para mostrar que é possível rodar fora sem problemas algum.

A classe Bean

  1. @Entity
  2. @Table(name=“tusuario”)
  3. public class Usuario {
  4. @Column
  5. private String nome;
  6. @Column
  7. private String email;
  8. @Id
  9. private int id;
  10. //gets/sets omitidos

Gerando o relatório

Essa é a classe principal que de fato faz gerar o relatório em PDF, pegando o layout definido no Ireport o JasperReport faz a conversão, veja:

  1. public class GerarRelatorio {
  2. public static void main(String[] args) throws JRException,SQLException {
  3. System.out.println(“Gerando relatório…”);
  4. UsuarioDAO usuarioDAO = new UsuarioDAO();
  5. List listaUs = usuarioDAO.listaTodos();
  6. JasperReport pathjrxml = JasperCompileManager.compileReport(“relatorio/reportex.jrxml”);
  7. JasperPrint printReport = JasperFillManager.fillReport(pathjrxml, nullnew JRBeanCollectionDataSource(listaUs));
  8. JasperExportManager.exportReportToPdfFile(printReport, “relatorio/reportex.pdf”);
  9. System.out.println(“Relatorio gerado”);
  10. }

Entendendo o código acima

Minha classe UsuarioDAO: ela retorna todos os usuarios atraves de uma query HQL.

  1. public List listaTodos(){
  2. Query query = getSession().createQuery(“from Usuario”);
  3. List listaUs = query.list();
  4. return listaUs;
  5. }

Note: Informando o JRXML: Link interessante

Na classe relatório precisamos informar onde está o arquivo jrxml(nao esqueca de criar o folder)

  1. JasperReport report = JasperCompileManager.compileReport(“relatorio/reportcamilo.jrxml”);

Dica:

Se o jrxml estiver no mesmo package que a classe que gera o relatório o código acima é valido do contrario, deve ser conforme abaixo:

  1. “../relatorio/reportblog.jrxml”

Passando o DATA SOURCE

O data source nada mais eh que uma lista com os dados que serao inseridos no relatorio.

  1. JasperPrint print = JasperFillManager.fillReport(report, null,new JRBeanCollectionDataSource(listaUS));

obs. No primeiro argumento temos o caminho do layout do relatorio gerado pelo ireport, parametro pode ser null e criamos um data source com o conteudo da lista que tem o resultado HQL

  1. class dao
  2. public List listaUsuario(){
  3. Query query = getSession().createQuery(“from Tusuario”);
  4. List lista = query.list();
  5. return lista;

em outra classe ….
TUsuarioDAO tusuariodao = new TUsuarioDAO();
List listaUS = tusuariodao.listaUsuario();

em outra classe …

  1. TUsuarioDAO tusuariodao = new TUsuarioDAO();
  2. List listaUS = tusuariodao.listaUsuario();

Exportando para um Formato

Para exportar temos metodos para cada formato de exportacao

  1. JasperExportManager.exportReportToPdfFile(print,“relatorio/RelatorioUser.pdf”);

obs. No primeiro argumento temos a variavel que tem o relatorio preenchido e o caminho que deve ser exportado .So rodar a classe main, agora.

Download do Projeto

Vou ficando por aqui espero que tenham gostado do post.

See you next post. 🙂