tutorial: desenvolvimento de aplicações com o hibernate no netbeans

Transcription

tutorial: desenvolvimento de aplicações com o hibernate no netbeans
TUTORIAL: DESENVOLVIMENTO DE APLICAÇÕES
COM O HIBERNATE NO NETBEANS
Glauber da Rocha Balthazar, Fábio Mendes Ramos Guimarães, Melise Maria
Veiga de Paula, Elio Lovisi Filho
Bacharelado em Sistemas de Informação – Faculdade Metodista Granbery (FMG)
Rua Batista de Oliveira, 1145 - 36010-532 - Juiz de Fora – MG
{gbalthazar,fguimaraes}@si.granbery.edu.br,[email protected],
[email protected],
Abstract. In this article presents the tutorial one that it an approach, of
practical form is presented, the use of the Framework of Hibernate persistence
in NetBeans. For this, the construction of a guided application is considered
the Objects, in Java, that has access a Data base Relationary Object through
an architecture developed for this type of application. After that, it is
presented all the steps for the necessary configuration of the objectrelationary mapping between the application and the bank.
Resumo. Neste artigo é apresentado um tutorial que aborda, de forma
prática, a utilização do Framework de persistência Hibernate no NetBeans.
Para isso, é proposto a construção de uma aplicação Orientada a Objetos, em
Java, que acesse um Banco de Dados Objeto Relacional por meio de uma
arquitetura desenvolvida para este tipo de aplicação. Em seguida, são
apresentados todos os passos para a configuração necessária do mapeamento
objeto-relacional entre a aplicação e o banco.
INTRODUÇÃO
Para PRESSMAN (2005), o software tornou-se uma das forças motoras das
empresas, é ele quem dirige a tomada de decisão nos negócios. Este fato justifica a
crescente importância que o processo de desenvolvimento de software vem adquirindo
nos ambientes organizacionais. Contudo, atualmente, observa-se que apesar da evolução
das ferramentas de apoio ao desenvolvimento de software, esta atividade ainda é
considerada uma tarefa bastante complexa para os profissionais da área.
Neste contexto, pode-se observa duas vertentes. De um lado, os usuários vêm se
tornado cada vez mais exigentes, fato que aumenta a complexidade dos requisitos e a
expectativa em relação aos resultados esperados. Além disso, as empresas têm
percebido que um sistema de informação pode ser o seu diferencial perante suas
concorrentes, pois a gerencia das informações e a garantia da segurança e
disponibilidade destas de forma rápida, confiável e sigilosa em qualquer ponto a
qualquer momento permite que diretores, gerentes e vendedores tomem decisões de
forma mais precisa e rápida [OLIVEIRA].
Por outro lado, diversas tecnologias vêm surgindo e amadurecendo, fornecendo
ao desenvolvedor uma variedade de linguagens, ferramentas e softwares que o
aproximem desta realidade. Um exemplo disto é a Orientação a Objetos que vem sendo
explorada no intuito de encontrar padrões para desenvolvimento de softwares de forma
mais simples com uma alta manutenibilidade e reusabilidade dos códigos escritos.
Considerando o cenário descrito, este artigo pretende apresentar, de forma
prática uma visão de como desenvolver uma aplicação orientada a objetos com acesso a
um banco de dados objeto-relacional. Para tanto, serão empregados a linguagem de
programação JAVA e o ambiente de desenvolvimento NetBeans como IDE (Interface
Desktop Environment). Além disso, o Hibernate será usado como a camada de
persistência que deverá fazer a interface entre a aplicação e o sistema gerenciador de
banco de dados PostegreSQL.
O artigo está organizado da seguinte maneira, na seção 2, é descrita a
Arquitetura DAO (Data Access Object) que será utilizada para a construção das classes
de mapeamento e gerencia das informações para o Hibernate. Na seção 3, é descrita a
aplicação a ser considerada nos exemplos práticos. Os capítulo seguintes exploraram a
prática no NetBeans na construção de aplicações.
A ARQUITETURA DAO
Para a construção da aplicação, vamos adaptar o padrão proposto por
[FAERMAN] na revista Java Magazine de Janeiro de 2005, que descreve uma política
para a construção de aplicações que utilizam um Framework para persistência dos
dados.
Será empregada a arquitetura DAO (Data Access Object), onde um objeto
intermediário é responsável pelo acesso aos dados do sistema, independente do SGBD
empregado.
Na figura 1, apresenta-se a arquitetura DAO utilizada para a construção da
aplicação, definindo-se o relacionamento entre as classes que irão compor a estrutura de
persistência do Hibernate.
Action
(Aplicação)
FactoryClasses
Instancia
Implementa
DAOFactory
hibernate.cfg.xml
Implementa
HibernateDAOFactory
Instancia
ClasseHibernateDAO
ClasseDAO
HibernateConfiguration
Abre
Aplicativo
Classe
Interface
XML
Driver
Conecta
BD
Session
Banco de Dados
Figura 1 – Modelo da arquitetura DAO a ser utilizada neste tutorial
2
O banco de dados a ser utilizado assim como o nome de usuário e a senha para
acesso e demais propriedades do banco são mapeados para um arquivo XML
denominado hibernate.cfg.xml, a partir de uma Factory de Classes.
O HibernateDAOFactory será a classe responsável por gerar instâncias dos
objetos a serem utilizados na aplicação. Estes objetos são descritos na arquitetura de
forma genérica como ClasseHibernateDAO (na aplicação será visto como
FuncionárioHibernateDAO) e estes implementarão as suas respectivas interfaces,
também descritas de forma genérica como ClasseDAO (na aplicação como
FuncionarioDAO) que contém todas as assinaturas dos métodos de gerência dos objetos
como incluir (persistir), excluir, dentre outros.
A partir deste ponto, é aberta uma seção com o banco através do
HibernateConfiguration e os métodos chamados poderão ser executados.
A APLICAÇÃO
Com o objetivo de manter um aspecto técnico e prático deste trabalho, será
considerada uma aplicação contendo apenas uma classe, Funcionário. A partir desta
classe, serão construídas as principais funcionalidades de gerência de objetos como
persistir, recuperar apenas um objeto, recuperar todos os objetos persistidos e exclusão.
Desta forma, todos os atributos para esta classe são apresentados na figura 2.
Funcionario
private String nome;
private int idade;
private String cpf;
Figura 2 – Classe Funcionário
Para a arquitetura utilizada como modelo de desenvolvimento desta aplicação, os
métodos de persistência e recuperação dos objetos ficarão escritos em uma classe
específica, deixando apenas na classe Funcionario os atributos e seus métodos de acesso
além do construtor default, apresentando desta forma uma classe com todas as
3
características POJO (Plain Old Java Object) para manipulação do Framework de
persistência Hibernate.
O banco de dados utilizado será o PostgreSQL por ser um banco objetorelacional e apresentar as características de estabilidade e confiabilidade. Desta forma,
os objetos gerados pela aplicação serão persistidos e recuperados no banco através do
Hibernate.
CONSTRUINDO E GERENCIANDO UM PROJETO NO NETBEANS
Para se construir um novo projeto no NetBeans vá até o menu File e escolha New
Project. Em seguida, Na janela New Project vá até a lista Categories, escolha General e
na lista Projects escolha Java Application e em seguida clique em Next.
Na tela seguinte New Java Application, digite o nome do projeto e defina o
diretório do projeto, na caixa Project Name. Neste exemplo digite
MiniCursoHibernatePratica.
Após,
direcione
o
Project
Location
para
C:\minicursoHibernate e desmarque a caixa de opção referente ao Create Main Class
como mostrado na figura 3.
Figura 3 – Definição do nome e diretório do projeto
Por último clique em Finish.
GERENCIANDO LIBRARY’S NO NETBEANS 5.0
Para a utilização das bibliotecas do Hibernate e do driver JDBC que fará o acesso ao
banco, será necessária a construção de Librarys no NetBeans para o armazenamento e
organização destes arquivos. Para isso, deve-se criar duas Librarys, uma para o
Hibernate e outra para o driver JDBC do PostgreSQL.
O NetBeans permite a construção destas Librarys através da opção Library
Manager no menu Tools. Ao escolher esta opção a janela Library Manager será aberta e
basta clicar no botão New Library... no canto inferior esquerdo da mesma como na
figura 4.
4
Figura 4 – Construção de novas librarys
Agora, informe o nome para a Library na caixa Library Name. Para este
exemplo, digite Hibernate e clique em ok.
Com a Library já construída, adicione agora as bibliotecas (.Jar) do Hibernate
3.1. Para isso, clique no botão Add Jar/Folder... Direcione para o local em que o
Hibernate foi descompactado e localize o diretório hibernate-3.1. Dentro dele localize o
arquivo “hibernate3.jar” e adicione-o clicando nele e em seguida no botão Open. Veja
na figura 5 que o ClassPath foi preenchido.
Figura 4 – Construção de novas Librarys no NetBeans
Figura 5 – Preenchimento do ClassPath com o arquivo hivernate3.jar
5
Mas ainda faltam as demais Librarys existentes no diretório lib do hibernate.
Para tanto, volte no botão add Jar/Folder... e direcione para o sub diretório lib existente
no diretório hibernate-3.1 e adicione todas as librarys existentes (todos os arquivos jar) e
em seguida clicando no botão Open, veja na figura 6:
Figura 6 – Seleção das demais bibliotecas do Hibernate na pasta Lib
Figura 6 – Seleção das demais bibliotecas do Hibernate na pasta Lib
Neste momento todas as librarys do hibernate foram adicionadas a Library
criada anteriormente. Por fim, clique em Ok para terminar a construção desta nova
Library no NetBeans.
Repita agora o mesmo procedimento para a construção de uma Library para o
driver JDBC do PostgreSQL. Dê o nome para ela de JDBCPostgreSQL como na figura
7.
Figura 7 – Definição do nome da Library
Após isso, adicione o arquivo postgresql-8.2dev-501.jdbc2.jar .
Por último falta apenas adicionar as duas Librarys criadas anteriormente ao
projeto. Para isso, vá ao inspetor de Projetos e clique com o botão direito sobre as
Libraries e escolha Add Library como na figura 8.
Figura 8 – Adicionando uma Library ao projeto
Escolha agora as duas Librarys criadas anteriormente e clique no botão Add
Libary. Aguarde um momento enquanto o NetBeans atualiza o ClassPath e veja que
6
todas as bibliotecas do Hibernate e do Driver do PostgreSQL foram adicionadas ao seu
projeto através da figura 9.
Figura 9 – Visualizando as bibliotecas adicionadas ao projeto
CONSTRUINDO A CLASSE FUNCIONÁRIO
A classe Funcionário é a uma classe de negócio da aplicação e será mapeada no
Hibernate como tabelas no banco de dados. Classes deste tipo deve estar dentro de um
padrão definido como POJO, que é uma classe que contém todos os atributos
encapsulados e definidos os seus métodos de acesso get e set além do método construtor
default.
Para isso, clique com o botão direito em cima do Default Package e escolha New
e logo em seguida File/Folder, como ilustrado na figura 10.
Figura 10 – Construindo uma nova classe
7
A janela New File será aberta, nela visualize a lista das Categories e escolha
Java Classes e na lista de Files Types escolha Java Class, veja a figura 11.
Figura 11 – Escolhendo o tipo de arquivo
Em seguida, veja a figura 12, clique em Next. Na tela seguinte digite o nome
para a classe (Funcionario) e clique em Finish.
Figura 12 – Definindo o nome da Classe
Pronto, a classe Funcionario foi criada. Agora, complete esta classe com os
atributos descritos na figura 13:
8
Figura 13 – Atributos da classe Funcionario
Construa agora os métodos getters e setters para cada um deles. Para isso, clique
primeiramente em cima de qualquer um dos atributos e vá até o menu Refactor e
escolha Encapsulate Fields...
Na tela Encapsulate Fields – Funcionario, marque todos os métodos a serem
construídos e desmarque a caixa Preview all changes, veja na figura 14:
Figura 14 – Seleção dos métodos a serem construídos
Em seguida clique em Next e pronto, todos os métodos de get e de set foram criados.
CONSTRUINDO O MAPEAMENTO DO FUNCIONÁRIO
Para utilização da camada de persistência, é necessário indicar qual(is) tabela(s)
do banco de dados corresponde à classe de negócio. Isso é feito por meio de um
mapeamento que indica essa correspondência. Neste artigo, visando facilitar o
entendimento do leitor, o mapeamento será feito por meio de um arquivo XML. Outra
forma de mapeamento pode ser vista em BAUER, KING (2005).
9
Para realizar o mapeamento proposto, crie um arquivo XML, selecionando com
o botão direito o Default Package e escolhendo a opção New e em seguida File/Folder,
veja na figura 15:
Figura 15 – Construção do arquivo XML
Na janela seguinte, New File apresentado na figura 16, nas Categories escolha
XML e na lista Files Type escolha XML Document:
Figura 16 – Escolhendo um arquivo XML
Em seguida, clique em Next.
Na última tela, como nome para este arquivo, digite Funcionario.hbm. Por
último clique em Next e na próxima tela em Finish. Veja a figura 17.
10
Figura 17 – Término da construção do arquivo XML
Agora, preencha este arquivo como mostrado na figura 18:
Figura 18 – Configuração do arquivo de mapeamento
No mapeamento acima, a classe Funcionario da aplicação é relacionada à tabela
funcionario do banco de dados. As tags property indicam o mapeamento dos atributos
da classe com os campos da tabela, descrevendo também os valores que podem ser
atribuídos aos mesmos.
CONSTRUINDO O ARQUIVO HIBERNATE.CFG.XML
Seguindo as instruções dispostas na seção 5 deste artigo, construa um novo
arquivo XML e dê o nome para ele de: hibernate.cfg.xml
Em seguida, digite o código da figura 19:
11
Figura 19 – Configuração do arquivo hibernate.cfg.xml
No código acima são definidos, entre outros, o driver de conexão, o usuário e a
senha de acesso, bem como os arquivos que descrevem o mapeamento das classes de
negócio.
CONSTRUINDO A FÁBRICA DE CLASSES – FACTORYCLASS
Para evitar a dependência entre o aplicativo principal e a implementação
concreta do DAO, iremos empregar o padrão Factory Method, no qual um objeto é
responsável pela criação de outros, “fabricando-os”. [FAERMAN, 2005]
Sendo assim, nosso próximo passo consiste em construir a classe FactoryClass
para gerência do Banco de Dados a ser utilizado. Para isso, crie uma nova classe e dê o
nome para ela de FactoryClasses. Em seguida, digite o código mostrado na figura 20
para esta classe:
Figura 20 – Configuração do arquivo.FactoryClasses.java
12
Obs.: Neste ponto, algumas linhas do seu código irão ficar marcadas de vermelho. Não
se preocupe, elas indicam apenas que as demais classes ainda não foram construídas,
isso será feito nos próximos passos.
Agora, crie a interface para a construção do FuncionarioDAO. Chame esta
interface de DAOFactory e digite o código da figura 21 para ela:
Figura 21 – Configuração da interface DAOFactory
Após ter construído a interface DAOFactory, vamos implementá-la em uma
classe. Para isso, crie uma nova classe e a chame de HibernateDAOFactory.
Nesta classe, vista na figura 22, implemente a interface DAOFactory e em
seguida, sobrescreva o método criarFuncionarioDAO( ) adicionando a ele a
funcionalidade de instância do FuncionarioHibernateDAO( ).
Figura 22 – Configuração da classe HibernateDAOFactory
CONSTRUINDO OS DAO’S
Vamos, primeiramente, construir a interface do Funcionario. Nela nós teremos
as assinaturas dos métodos de gerenciamento um novo funcionário. As implementações
serão realizadas posteriormente.
Para isso, crie uma nova interface e chame-a de FuncionarioDAO e adicione a
ela as seguintes assinaturas de métodos descritas na figura 23:
13
Figura 23 – Assinaturas dos métodos do FuncionarioDAO
O método carregarUm irá retornar um funcionário que possua o nome
especificado no parâmetro. Já o método carregarTudoOrdenadoNome irá recuperar
todos os funcionários existentes no banco de dados, ordenados pelo atributo nome. Os
métodos gravar e excluir realizam as funções de inserção e exclusão para os objetos
que forem definidos como seus parâmetros.
Como segundo passo, iremos construir a classe FuncionarioHibernateDAO. Para
isso, construa uma nova classe e dê este nome para ela. Veja o código na figura 24:
Figura 24 – Implementação dos métodos de gerenciamento da classe Funcionario
14
Agora, vamos escrever os códigos de cada um destes métodos, veja nas figuras
abaixo:
a) Método carregaUm, visto na figura 25:
Figura 25 – Implementação do método carregaUm
As classes Session e Transaction controlam, respectivamente, a abertura e o
fechamento de sessões de acesso ao banco de dados, e o início e a conclusão de
transações. Emprega-se a classe Criteria para definir-se critérios de busca de objetos.
Esses critérios podem ser definidos utilizando a classe Expression. [BAUER & KING,
2005]
No código anterior, é definido um critério de busca de objetos da classe
Funcionario, retornando somente aquele que possuir o atributo nome igual ao parâmetro
informado ao método.
b) Método carregaTudoOrdenadoPorNome, visto na figura 26:
Figura 26 – Implementação do método carregaTudoOrdenadoPorNome
No método acima retorna-se uma lista de objetos da classe Funcionario,
ordenados pelo atributo nome.
c) Método gravar, visto na figura 27:
Figura 27 – Implementação do método gravar
Já neste método, deve-se informar um objeto da classe Funcionario o qual será
persistido no banco de dados empregando-se o método saveOrUpdate.
d) Método excluir, visto na figura 28:
15
Figura 28 – Implementação do método excluir
Finalmente, no método acima, um objeto da classe Funcionario é excluído do
banco de dados por meio do método delete.
CONSTRUINDO
O
HIBERNATE
(HIBERNATECONFIGURACAO)
DE
CONFIGURAÇÃO
Como último passo deverá ser construído o arquivo que permitirá abrir uma
sessão com o banco. Este arquivo é uma classe que chama-se HibernateConfiguração,
com os métodos openSession e criaSessionFactory. O primeiro é responsável por
verificar se já existe uma sessionFactory instanciada na aplicação. Se sim, ele retorna
esta sessão para a aplicação que requisitar. O segundo método faz o inverso, caso a
session esteja instanciada, ele será responsável por permitir a instância de uma nova
session, baseando-se no arquivo hibernate.cfg.xml, definido anteriormente.
Para isso construa uma nova classe e chame-a de HibernateConfiguração e
complete-a de acordo com a figura 29, veja:
16
Figura 29 – Configuração do arquivo HibernateConfiguracao.java
CONSTRUINDO UM ARQUIVO DE LOG
Para acompanhar a execução do sistema, e facilitar a identificação de possíveis
erros, será empregado o framework log4j. Para isso, deve-se criar um arquivo com as
suas configurações.
Para construir este arquivo, proceda da seguinte forma:
Vá até o menu File e escolha New File
Na janela New File, escolha nas categorias Other e na lista de Files Types
Properties File. Logo em seguida, clique em Next.
Em seguida, digite para o nome do arquivo: log4j e clique em Finish.
Agora, copie para dentro deste arquivo o código descrito na figura 30:
17
Figura 30 – Configuração do arquivo log4j.properties
CONSTRUINDO A APLICAÇÃO PRINCIPAL
Crie uma classe
AplicacaoTexto.java
executável
(Java
Main
Class)
e
chame-a
de
Em seguida, adicione o código da figura 31 à esta classe:
Figura 31 – Código fonte da aplicação
Agora, para persistir um novo Funcionário, digite o código da figura 32, veja:
Figura 32 – Código para persistir um novo funcionário
18
Para listar todos os funcionários, digite o código da figura 33:
Figura 33 – Código para listar todos os funcionários
Para carregar apenas os dados de um funcionário digite o código da figura 34:
Figura 34 – Código para listar apenas um funcionário
E para excluir um funcionário, digite o código da figura 35:
Figura 35 – Código para excluir um funcionário
19
CONCLUSÃO
pO presente artigo procurou demonstrar de forma prática, a implementação de
uma aplicação simples em Java utilizando a camada de persistência Hibernate para o
armazenamento e manipulação de objetos em um SGBD OR.
Para isso, o artigo foi escrito sobre a forma de um tutorial, apresentando todos os
passos necessários para a construção deste tipo de aplicação começando desde a escrita
das classes POJO, passando pelo mapeamento objeto-relacional e a construção dos
métodos de persistência que utilizam o Hibernate para a manipulação das informações.
Além disso, seguiu-se uma arquitetura (padrão) de desenvolvimento, através de
um modelo proposto por Julio Ferman, na revista Java Magazine, e adaptado para a
solução deste artigo, procurando seguir uma forma de desenvolvimento que se aplique,
de forma genérica, a todas as classes de qualquer sistema que venha a ser desenvolvido
em Java e que faça uso do Hibernate.
Com isso, o artigo mostra como organizar as classes de negócio existentes nas
aplicações com o objetivo de prepará-las para a persistência em um banco de dados, a
forma de construir uma aplicação seguindo uma arquitetura de desenvolvimento própria
para persistência de objetos em bancos relacionais sem gerar códigos desnecessários,
confusos e mal organizados e como aplicar os métodos de gerencia (persistir, recuperar,
dentre outros) em uma aplicação explorando ao máximo a produtividade da mesma sem
que isso gere custos exagerados de processamentos para a máquina, tornando a
aplicação leve e rápida, mesmo se tratando de mapeamento de informações entre um
banco relacional e uma aplicação orientada a objetos.
BIBLIOGRAFIA
BAUER, C. e KING, G. Hibernate em ação. Primeira Edição. 2005: Rio de Janeiro,
Editora Ciência Moderna.
EMILO, C. e SEVER, P. NetBeans IDE 4.1 – Para desenvolvedores que utilizam a
tecnologia Java. Primeira Edição. 2005: Rio de Janeiro, Editora Brasport.
OLIVEIRA, Djalma P. R. de. Sistemas de Informações gerenciais: estratégias,
táticas operacionais. Sétima Edição. São Paulo: Atlas, 2001.
PRESSMAN, R. Engenharia de Software. Sexta Edição. McGraw-Hill, 2005.
SILBERSCHATZ, Abraham, KORTH, Henry F. e SUDARSHA, S. Sistema de Banco
de Dados. Terceira Edição. São Paulo: Makron Books, 1999.
FAERMAN, Julio. Design Patterns Aplicados. Java Magazine, Rio de Janeiro, edição
20, p. 52-58, jan. 2005.
20

Documents pareils