Prévia do material em texto
1
Capítulo 1 – Persistência de Dados
Este capítulo apresenta o desenvolvimento de um exemplo de sistema para
manutenção de dados de departamentos. Apresentam-se aqui as técnicas e as ferramentas
empregadas neste desenvolvimento.
Esse sistema será desenvolvido empregando-se o paradigma da Orientação a Objetos,
o Java, a IDE NetBeans, o framework Hibernate e o SGBD PostgreSQL. Apresenta-se aqui o
desenvolvimento de um exemplo de caso de uso, que implementa as operações básicas de
acesso a um banco de dados.
A aplicação desenvolvida empregará a linguagem de programação JAVA, que é uma
linguagem de programação orientada a objetos. No entanto a maioria dos SGBD's utilizados
atualmente emprega o modelo relacional. Logo, existe a necessidade de realizar a “tradução”
entre os dois modelos, empregando-se para tanto o framework Hibernate.
Nos próximos itens serão apresentadas as atividades necessárias para a criação de um
aplicativo Java que acesse um banco de dados PostgreSQL empregando o framework
Hibernate, utilizando os padrões MVC e DAO
1.1. Padrões Empregados
Um dos principais objetivos do padrão MVC - Modelo, Visão e Controle (Model, View
and Controller) é a organização do código de uma aplicação em camadas, realizando assim a
separação física dos componentes do software. Desta forma, a organização em camadas é a
chave para a independência entre os componentes, objetivando desta forma agrupar
componentes por responsabilidades em comum.
A fundamentação da divisão das funcionalidades de um sistema em camadas surgiu
como alternativa para solucionar alguns problemas existentes nas aplicações monolíticas, nas
quais, dados e código eram armazenados em uma mesma máquina, na qual todas as
funcionalidades eram definidas em um único módulo contendo uma grande quantidade de
linhas de código e de difícil manutenção.
Este modelo consiste em uma tríade de classes frequentemente usadas em sistemas
interativos para construção de interfaces com o usuário. A implementação deste modelo
mantém o núcleo funcional do sistema independente da interface. Assim, as interfaces
internas podem permanecer estáveis, mesmo quando a interface necessita ser alterada para se
adaptar a novas plataformas e dispositivos de interação.
Com isso a apresentação, a lógica (negócio) e o acesso ao banco de dados estão
2
separados em camadas específicas, tornando os sistemas mais manuteníveis e garantindo a
independência entre estas camadas. Desta forma, as camadas de negócio podem ser divididas
em classes podendo ser agrupadas em pacotes ou componentes reduzindo as dependências
entre as mesmas. Esta divisão facilita a reutilização por diferentes partes do aplicativo e até
por aplicativos diferentes.
A abordagem MVC define como os componentes da aplicação irão interagir entre si.
Este padrão de arquitetura divide os objetos em três conjuntos:
Modelo (Model), composto por objeto de entidade da aplicação;
Visão (View), composta por objetos de apresentação na tela; e
Controlador (Controller), que possui objetos que definem a maneira como a
interface do usuário reage às entradas do mesmo.
Além disso, para a manipulação dos dados do sistema foram empregados objetos de
acesso, conhecidos como DAO (Data Access Object), que permitem que as regras de negócio
sejam separadas das regras para acesso aos dados, de forma que sejam criadas classes
exclusivas para o acesso ao SGBD.
1.2. Preparando o Ambiente
Conforme citado anteriormente, para o desenvolvimento deste aplicativo será
empregado o SGBD PostgreSQL. Para este tutorial foi criado um banco de dados chamado
exemplo, em um SGBD com o usuário postgres e a senha também postgres. Utilize o
aplicativo desejado para criar o banco.
3
Nesse banco crie a tabela departamento utilizando o script abaixo:
CREATE TABLE departamento(
id SERIAL PRIMARY KEY,
nome VARCHAR(60) ,
area VARCHAR(60)
);
Na ferramenta NetBeans crie um novo projeto Java chamado ExemploHibernate, sem
classe principal, conforme figura abaixo.
Agora inclua no seu pacote de código fonte (Source Package), os seguintes pacotes:
dao, model, control e view.
4
Além disso, será necessária a utilização das bibliotecas do Hibernate e do driver que
fará o acesso ao banco de dados (PostgreSQL JDBC Driver). Para isso, vá ao inspetor de
Projetos e clique com o botão direito sobre o item bibliotecas (Libraries) e escolha Adicionar
Bibliotecas (Add Library), conforme as figuras a seguir.
5
Agora, no pacote padrão (default package) crie um arquivo de configuração (New –
Other).
6
Na tela seguinte selecione Other – Properties File, e após isso crie o arquivo com o
nome hibernate.
Insira o código abaixo:
7
hibernate.dialect org.hibernate.dialect.PostgreSQLDialect
hibernate.connection.driver_class org.postgresql.Driver
hibernate.connection.url jdbc:postgresql://localhost:5432/exemplo
hibernate.connection.username postgres
hibernate.connection.password postgres
hibernate.show_sql false
hibernate.format_sql false
Observe que neste arquivo são estabelecidos os parâmetros de configuração da
conexão do aplicativo com o SGBD. As propriedades username e password definem o usuário
e a senha de acesso ao banco de dados.
1.3. Criando a Classe de Modelo (model)
No pacote model crie a classe Departamento, com um construtor padrão (vazio) e os
seguintes atributos encapsulados:
id (Integer)
nome (String)
area (String)
8
Os atributos podem ser encapsulados selecionando-se um deles com o botão esquerdo
e utilizando-se o comando Refactor conforme a figura a seguir.
Após isso é exibida a seguinte tela.
9
Agora, será necessário mapear a classe Departamento da aplicação à tabela
departamento do SGBD. Isto é necessário para indicar qual(is) tabela(s) do banco de dados
corresponde(m) à classe de entidade. Isto é feito por meio de uma anotação que indica essa
correspondência.
Neste exemplo faremos o mapeamento por meio de anotações na classe. A figura a
seguir apresenta parte do código.
10
As anotações (precedidas por '@') indicam o mapeamento entre a classe e a tabela do
banco de dados. Algumas importações do pacote javax.persistence serão necessárias neste
ponto.
11
1.4. Construindo a Conexão
No pacote dao, crie a classe HibernateConfiguracao, com o seguinte código.
public class HibernateConfiguracao {
private static SessionFactory sessionFactory;
public HibernateConfiguracao() {
}
public Session openSession() {
if (sessionFactory == null) {
criaSessionFactory();
}
return sessionFactory.openSession();
}
public void criaSessionFactory() {
Configuration configuration = new Configuration();
configuration.addAnnotatedClass(Departamento.class);
ServiceRegistry serviceRegistry =
new ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().
applySettings(configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
}
}
Neste momento será necessário importar algumas classes do Hibernate.
1.5. Criando a Classe dao
A classe da irá permitir o acesso do sistema ao SGBD configurado. Para tanto, iremos
utilizar um dao Genérico que possui os métodos básicos de acesso a um banco de dados.
Incluir;
Alterar;
Excluir;
Consultar;
Listar.
Para a execução básicas destas operações, pode-se empregar estes métodos genéricos.
Crie uma classe chamada DaoGenerico (no pacote dao), com o código exibido a seguir.
public class DaoGenerico {
protected HibernateConfiguracao hibernateConfiguracao;
public DaoGenerico () {
hibernateConfiguracao = new HibernateConfiguracao();}
public void gravar(Object obj) throws HibernateException {
12
Session session = hibernateConfiguracao.openSession();
Transaction transaction = session.beginTransaction();
session.save(obj);
transaction.commit();
session.close();
}
public void alterar(Object obj) throws HibernateException {
Session session = hibernateConfiguracao.openSession();
Transaction transaction = session.beginTransaction();
session.update(obj);
transaction.commit();
session.close();
}
public void excluir(Object obj) throws HibernateException {
Session session = hibernateConfiguracao.openSession();
Transaction transaction = session.beginTransaction();
session.delete(obj);
transaction.commit();
session.close();
}
public List carregarTudoOrdenado(Class clas, String ordem) throws
HibernateException {
Session session = hibernateConfiguracao.openSession();
Criteria criteria = session.createCriteria(clas);
criteria.addOrder(Order.asc(ordem));
List lista = criteria.list();
session.close();
return lista;
}
public Object carregarUm(int id, Class<?> clas) throws HibernateException {
Session session = hibernateConfiguracao.openSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(clas);
criteria.add(Restrictions.eq("id", id));
Object obj = criteria.uniqueResult();
transaction.commit();
session.close();
return obj;
}
}
No mesmo pacote, crie o DaoDepartamento, herdando do DaoGenerico e com um
construtor próprio.
1.6. Construindo o Controlador (Controller)
No pacote control, crie uma nova classe, chamada CtrManterDepartamento. Nesta
classe crie um atributo utilizando o seguinte código:
DaoDepartamento acessohibernatedepto;
Após isso inclua o código a seguir.
13
public CtrManterDepartamento() {
acessohibernatedepto = new DaoDepartamento();
}
public int gravarDepartamento(Departamento departamento) {
try {
acessohibernatedepto.gravar(departamento);
return 1;
} catch (HibernateException e) {
e.printStackTrace();
return 2;
}
}
public List carregarDepartamentos() {
try {
return acessohibernatedepto.carregarTudoOrdenado(Departamento.class,
"nome");
} catch (HibernateException e) {
return null;
}
}
public boolean excluirDepartamento(Departamento departamento) {
try {
acessohibernatedepto.excluir(departamento);
return true;
} catch (HibernateException e) {
e.printStackTrace();
return false;
}
}
public boolean alterarDepartamento(Departamento departamento) {
try {
acessohibernatedepto.alterar(departamento);
return true;
} catch (HibernateException e) {
e.printStackTrace();
return false;
}
}
1.7. Construindo o Formulário (View)
Num primeiro momento, iremos criar um formulário que permita somente a inclusão
dos departamentos. Para isso, no pacote view, crie um novo JFrame, chamado
FrmManterDepartamento.
14
15
Insira um JButton “Incluir” (jBtnIncluir) e dois JtextField (jTxtNome, jTxtArea) para
o nome e a área do departamento. Após isso, crie 2 atributos no código do formulário,
conforme o apresentado abaixo.
CtrManterDepartamento ctrManterDepartamento;
Departamento depart;
Crie instâncias destes objetos na inicialização da tela.
Agora, crie um evento para o botão (selecione com o botão esquerdo - Events – Mouse
– mouseClicked) e insira o código a seguir no evento criado.
depart = new Departamento();
depart.setNome(jTxtNome.getText());
depart.setArea(jTxtArea.getText());
if (ctrManterDepartamento.gravarDepartamento(depart) == 1) {
JOptionPane.showMessageDialog(null, "Objeto persistido");
} else {
JOptionPane.showMessageDialog(null, "Objeto não persistido");
}
16
A seguir, é mostrado um exemplo deste JFrame.
1.8. Construindo a Tela Inicial da Aplicação
No pacote padrão, crie mais um JFrame, chamado Principal, inclua nele um Jbutton
(jBtnExibirDepartamento), e faça as seguintes alterações na classe:
public Principal() {
HibernateConfiguracao configuracao = new HibernateConfiguracao();
configuracao.criaSessionFactory();
initComponents();
}
public static void main(String args[]) {
Principal telaPrincipal = new Principal();
telaPrincipal.setVisible(true);
telaPrincipal.setExtendedState(MAXIMIZED_BOTH);
}
Agora crie um evento actionPerformed no botão e insira o seguinte código.
private void jBtnExibirDepartamentoActionPerformed
(java.awt.event.ActionEvent evt) {
FrmManterDepartamento telaDepartamento = new
FrmManterDepartamento();
telaDepartamento.setVisible(true);
telaDepartamento.setLocationRelativeTo(this);
}
Neste momento o aplicativo já deve permitir a inclusão de departamentos. Execute o
programa para avaliar os resultados. Se desejar, inclua o código para limpar os campos se o
departamento for inserido corretamente.
Deve-se também definir o JFrame principal como tela inicial da aplicação (Project
17
Properties – Run – Main Class).
1.9. Listando os Objetos
Para permitir a visualização dos dados, insira um componente JList no formulário
FrmManterDepartamento e faça as seguintes alterações:
Aumente a largura da lista;
Altere o nome para jLstDepartamentos;
Remova todos os itens de sua propriedade model; e
Altere o selectionMode para Single.
O formulário deve ficar com a seguinte aparência.
A seguir, inclua um novo evento no JFrame (Window – windowActiveted), insira o
código no evento criado e importe as classes necessárias.
DefaultListModel listModel = new DefaultListModel();
List listDepartamento = new ArrayList();
listDepartamento = ctrManterDepartamento.carregarDepartamentos();
if (listDepartamento != null) {
Iterator i = listDepartamento.iterator();
while (i.hasNext()) {
Departamento deptList = (Departamento) i.next();
listModel.addElement(deptList);
}
jLstDepartamentos.setModel(listModel);
}
18
Insira o método abaixo na classe Departamento do pacote model.
public String toString() {
return this.getNome();
}
Observe que a lista foi preenchida com objetos da classe departamento. Logo, a
consulta aos dados de um objeto ficou muito mais simples.
Para exibir os dados de um objeto selecionado na lista, crie um novo evento para a
lista (Mouse – mouseClicked) e acrescente o código a seguir ao evento:
depart = (Departamento) jLstDepartamentos.getSelectedValue();
if (depart != null) {
jTxtNome.setText(depart.getNome());
jTxtArea.setText(depart.getArea());
} else {
JOptionPane.showMessageDialog(null, "Objeto não Encontrado!");
}
Neste momento a execução do programa deverá permitir a inclusão dos objetos da
classe departamento, e também a listagem e consulta dos mesmos.
1.10. Excluindo os Objetos
Iremos agora permitir a exclusão de departamentos. Para tanto, inclua um novo
Jbutton, altere sua propriedade Text para “Excluir” e sua propriedade Name para
“jBtnExcluir”.
Após isso, crieum evento para o novo botão (Events – Mouse – mouseClicked) e insira
o código abaixo.
depart = (Departamento) jLstDepartamentos.getSelectedValue();
if (depart != null) {
if (ctrManterDepartamento.excluirDepartamento(depart)) {
JOptionPane.showMessageDialog(null, "Objeto Excluído");
} else {
JOptionPane.showMessageDialog(null, "Objeto não excluído");
}
} else {
JOptionPane.showMessageDialog(null, "Selecione o Objeto");
}
Execute o programa e observe os resultados. Se desejar, limpe os campos da tela após
a alteração e a exclusão do objeto.
19
1.11. Alterando Objetos
Agora vamos possibilitar a alteração de um objeto selecionado na lista. Para tanto,
inclua um novo botão na tela, conforme exibido na figura abaixo.
Modifique sua propriedade texto para “Alterar”,sua propriedade Name para
jBtnAlterar e crie um novo evento (Mouse – mouseClicked) para o novo botão.
Insira o código abaixo no evento criado para o botão.
depart = (Departamento) jLstDepartamentos.getSelectedValue();
if (depart != null) {
depart.setNome(jTxtNome .getText());
depart.setArea(jTxtArea .getText());
if (ctrManterDepartamento.alterarDepartamento(depart)) {
JOptionPane.showMessageDialog(null, "Objeto persistido");
} else {
JOptionPane.showMessageDialog(null, "Objeto não persistido");
}
} else {
JOptionPane.showMessageDialog(null, "Objeto não localizado");
}