DAO – Data Access Object – Pattern – CRUD – Oracle – IBM DB2 – MSSQL Server – Java

Publicado: 10 de dezembro de 2014 em Java

No ciência da computação, Data Access Object é um padrão para um objeto que fornece uma interface abstrata para algum tipo de banco de dados ou outro mecanismo de persistência e que permite separar regras de negócio das regras de acesso a banco de dados. A vantagem de usar objetos de acesso a dados é a separação simples e rigorosa entre duas partes importantes de uma aplicação que não devem e não podem conhecer quase que nada uma da outra, e que podem evoluir frequentemente e independentemente.

O DAO implementa o mecanismo de acesso necessário para trabalhar com a fonte de dados. A fonte de dados pode ser um armazenamento persistente como um RDBMS, um serviço externo, como uma troca de B2B, um repositório como um banco de dados LDAP, um serviço de negócios acessado via CORBA, Internet Inter-ORB Protocol (IIOP) ou soquetes de baixo nível. O componente de negócio que se baseia no DAO usa a interface mais simples exposta pelo DAO para seus clientes.

CRUD - DAO

CRUD – DAO

DAO Pattern

O DAO é um padrão flexível e não uma regra ele é utilizado em conjunto com Factory Pattern e Broker Pattern (veja Patterns relacionados no link abaixo) por isto é comum você encontrar algumas variações de sua implementação, o padrão possui quatro especificações para que possa ser utilizado corretamente elas são: DataAccessObject, DataSourceObject, BussinesObject e TransferObject.

  1. DataAccessObjecté o objeto principal desse padrão. O Data Access Object abstrai a implementação fundamental de acesso a dados para o Business Objects para permitir acesso transparente à fonte de dados.
  2. DataSourceObjectrepresenta uma implementação da fonte de dados. Uma fonte de dados pode ser uma base de dados tal como um RDBMS, repositório XML, e assim por diante.
  3. BussinesObject – o objeto de negócios representa o dados do cliente. É o objeto que requer acesso à fonte de dados para obter e armazenar dados.
  4. TransferObjectrepresenta um objeto de transferência usado como um suporte de dados. O Data Access Object pode usar um objeto de transferência para retornar dados para o cliente. O Data Access Object também pode receber os dados do cliente em um objeto de transferência para atualizar os dados na fonte de dados.

DAO Pattern: http://www.oracle.com/technetwork/java/dataaccessobject-138824.html

CRUD – DAO

CRUD acrónimo de Create, Read, Update e Delete, utiliza as quatro operações básicas  para criação, consulta, atualização e exclusão de dados.

Através do padrão DAO vamos utilizar as operações CRUD para manipular dados no banco de dados. O DAO é um Patter J2EE, mas como ele separa as regras de negocio do acesso a dados também podemos utiliza-lo com qualquer tipo de interface, seja pela linha de comando, uma GUI desktop ou aplicações web.

Para usar o DAO você utiliza o Factory Pattern para criar uma abstração para o acesso a dados e uma classe concreta para seu tipo de acesso como por exemplo OracleDAOFactory, DB2DAOFactory e assim por diante. Então você pode criar a interface para seu objeto DAO chamada DAOFuncionario e a partir da interface você pode criar as classes DAO como, DAOFuncionarioOracle, DAOFuncionarioDB2 e utilizar o objeto de transferência para manipular dados.

Neste exemplo não criamos uma classe abstrata utilizando o Pattern Factory, cortamos caminho pois utilizamos apenas um objeto DAO para todos os bancos de dados, mas caso deseje criar uma abstração para classes concretas para cada banco de dados siga a especificação oficial do DAO Pattern no link logo acima.

Eclipse IDE - Drivers - Oracle - DB2 - MSSQL

Eclipse IDE – Drivers – Oracle – DB2 – MSSQL

Utilize a imagem acima para ver a organização das Packges para cada classe e os drivers utilizados para cada banco de dados.

Exemplo:

Neste exemplo usamos o Pattern DAO para criar operações CRUD utilizando uma interface gráfica, como este exemplo não possuí uma tela de login mude o acesso ao banco e usuário e senha diretamente na classe FuncionarioDAO.

Este é o terceiro método que disponibilizamos para manipular dados através de um banco de dados, para ver este mesmo programa utilizando SQL direto da aplicação clique aqui.

Pare ver este programa usando objetos no banco de dados como Views e Triggers clique aqui ou procure na busca também por Stored Procedures e cursores.

Ainda veremos outros métodos para manipular dados através de frameworks específicos como JPA e outros.

SQL

Oracle

-- Cria tabela de funcionarios
create table Funcionarios(
  ID_Funcionario  NUMBER(5),
  Nome            VARCHAR2(30),
  Sobrenome       VARCHAR2(70),
  Cargo           VARCHAR2(30),
  Salario         NUMBER(9,2));

DB2

-- Cria tabela de funcionarios
create table Funcionarios (
    ID_Funcionario  INTEGER,
    Nome            VARCHAR(30),
    Sobrenome       VARCHAR(70),
    Cargo           VARCHAR(30),
    Salario         NUMERIC(9,2));

MSSQL

-- Cria tabela de funcionarios
create table Funcionarios (
   ID_Funcionario  Int,
   Nome            VARCHAR(30),
   Sobrenome       VARCHAR(70),
   Cargo           VARCHAR(30),
   Salario         Decimal(9,2));

Java

JavaBean – Funcionario

package org.desenvolvimento.aberto.modelo;

// Modelos utilizam JavaBean
public class Funcionario {

	// Declara atributos
	private long Id;
	private String nome;
	private String sobrenome;
	private String cargo;
	private double salario;

	// Método construtor padrão do JavaBean
	public Funcionario() {

	}

	// Método construtor Overload
	public Funcionario(long id, String nome, String sobrenome, String cargo,
			double salario) {
		this.Id = id;
		this.nome = nome;
		this.sobrenome = sobrenome;
		this.cargo = cargo;
		this.salario = salario;
	}

	// Declara métodos Getters e Setters
	public long getId() {
		return Id;
	}

	public void setId(long id) {
		Id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getSobrenome() {
		return sobrenome;
	}

	public void setSobrenome(String sobrenome) {
		this.sobrenome = sobrenome;
	}

	public String getCargo() {
		return cargo;
	}

	public void setCargo(String cargo) {
		this.cargo = cargo;
	}

	public double getSalario() {
		return salario;
	}

	public void setSalario(double salario) {
		this.salario = salario;
	}

}

Factory Pattern – DAConexaoFactory

package org.desenvolvimento.aberto.conexao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DAConexaoFactory {

	// Cria string de conexão de banco de dados
	private static String conexao;

	// cria conexões
	// você pode alimentar o nome do servidor, porta e banco de dados
	// de alguma configuração global ou como achar melhor.

	public static Connection getConexao(int fabrica, String usuario,
			String senha) throws ClassNotFoundException, SQLException {

		if (fabrica == 1) {
			conexao = "jdbc:oracle:thin:@localhost:1521:xe";
			Class.forName("oracle.jdbc.driver.OracleDriver");
		}

		if (fabrica == 2) {
			conexao = "jdbc:derby:net://localhost:50000/deva";
			Class.forName("com.ibm.db2.jcc.DB2Driver");
		}

		if (fabrica == 3) {
			conexao = "jdbc:sqlserver://localhost\\SQLEXPRESS:1433;databaseName=devaberto";
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
		}

		// Retorna driver pronto para login
		return DriverManager.getConnection(conexao, usuario, senha);

	}

}

Interface – FuncionarioDAOInterface

package org.desenvolvimento.aberto.dao;

import org.desenvolvimento.aberto.modelo.Funcionario;

public interface FuncionarioDAOInterface {

	// Cria interface
	// A interface propricia os retornos corretos de cada operação.

	public Funcionario buscaFuncionario(String id);

	public boolean insereFuncionario(Funcionario funcionario);

	public boolean updateFuncionario(Funcionario funcionario);

	public boolean deletaFuncionario(Funcionario funcionario);

	// TODO: Insira outros metodos que você deseje que sejam obrigatorios.
}

Objeto DAO – FuncionarioDAO

package org.desenvolvimento.aberto.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.desenvolvimento.aberto.conexao.DAConexaoFactory;
import org.desenvolvimento.aberto.modelo.Funcionario;

public class FuncionarioDAO implements FuncionarioDAOInterface {

	// Cria componentes
	private Connection conn = null;
	private Statement query;
	private String sql;

	public FuncionarioDAO() {

		// Como o exemplo não possui uma tela de login
		// utilizamos uma adaptação no construtor da classe
		// você pode utilizar um login para que o factory da conexão
		// use a string de conexão completa.

		try {

			this.conn = DAConexaoFactory
					.getConexao(1, "user", "password");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public Funcionario buscaFuncionario(String id) {

		// Cria novo objeto
		Funcionario funcionario = new Funcionario();

		// Define SQL
		sql = "SELECT * FROM FUNCIONARIOS WHERE ID_FUNCIONARIO = " + id;

		try {

			// Associa conexão e executa SQL
			query = conn.createStatement();
			ResultSet rs = query.executeQuery(sql);

			// Recupera dados do set
			while (rs.next()) {
				funcionario.setId(rs.getInt("ID_FUNCIONARIO"));
				funcionario.setNome(rs.getString("NOME"));
				funcionario.setSobrenome(rs.getString("SOBRENOME"));
				funcionario.setCargo(rs.getString("CARGO"));
				funcionario.setSalario(rs.getDouble("SALARIO"));
			}

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// Retorna objeto
		return funcionario;
	}

	@Override
	public boolean insereFuncionario(Funcionario funcionario) {

		// Define SQL
		sql = "INSERT INTO FUNCIONARIOS VALUES (?, ?, ?, ?, ?)";

		try {

			// Prepara SQL e alimenta parametros
			PreparedStatement query = conn.prepareStatement(sql);
			query.setLong(1, funcionario.getId());
			query.setString(2, funcionario.getNome());
			query.setString(3, funcionario.getSobrenome());
			query.setString(4, funcionario.getCargo());
			query.setDouble(5, funcionario.getSalario());

			// Executa SQL
			query.execute();
			query.close();
			return true;

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return false;
	}

	@Override
	public boolean updateFuncionario(Funcionario funcionario) {

		// Define SQL
		sql = "UPDATE FUNCIONARIOS SET ID_FUNCIONARIO = ?, NOME = ?, SOBRENOME = ?,"
				+ " CARGO = ?, SALARIO = ? WHERE ID_FUNCIONARIO = ?";

		try {

			// Prepara SQL e alimenta parametros
			PreparedStatement query = conn.prepareStatement(sql);
			query.setLong(1, funcionario.getId());
			query.setString(2, funcionario.getNome());
			query.setString(3, funcionario.getSobrenome());
			query.setString(4, funcionario.getCargo());
			query.setDouble(5, funcionario.getSalario());
			query.setLong(6, funcionario.getId());

			// Executa SQL
			query.execute();
			query.close();
			return true;

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return false;
	}

	@Override
	public boolean deletaFuncionario(Funcionario funcionario) {

		// Define SQL
		sql = "DELETE FROM FUNCIONARIOS WHERE ID_FUNCIONARIO = ?";

		// Prepara SQL e alimenta parametros
		PreparedStatement query;
		try {
			// Executa SQL
			query = conn.prepareStatement(sql);
			query.setLong(1, funcionario.getId());
			query.execute();
			query.close();

			return true;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return false;

	}

}

GUI – DAApp

package org.desenvolvimento.aberto;

import java.awt.ComponentOrientation;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;

import org.desenvolvimento.aberto.dao.FuncionarioDAO;
import org.desenvolvimento.aberto.modelo.Funcionario;

public class DAApp implements ActionListener {
	// Declara componentes
	private JLabel ltitulo;
	private JLabel lid;
	private JLabel lpnome;
	private JLabel lsnome;
	private JLabel lcargo;
	private JLabel lsalario;
	private JLabel lpesquisa;

	private JTextField tid;
	private JTextField tpnome;
	private JTextField tsnome;
	private JTextField tcargo;
	private JTextField tsalario;
	private JTextField tpesquisa;

	private JButton botao;
	private JButton alterar;
	private JButton inserir;
	private JButton deletar;
	private JButton novo;

	private Border borda;

	private JFrame menssagem;

	public Container criaPainel() {
		// cria painel
		JPanel painel = new JPanel();
		painel.setLayout(new FlowLayout());
		painel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
		painel.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
		// Cria titulo
		ltitulo = new JLabel("Database - Fields -Sem conexão");

		painel.add(ltitulo);
		painel.add(Box.createVerticalStrut(60));

		// Cria painel de usuario
		JPanel painelDados = new JPanel(new GridLayout(0, 2, 10, 10));

		// Cria componentes
		lid = new JLabel("Código:");
		lpnome = new JLabel("Primeiro Nome:");
		lsnome = new JLabel("Sobrenome:");
		lcargo = new JLabel("Cargo:");
		lsalario = new JLabel("Salário:");

		tid = new JTextField();
		tpnome = new JTextField();
		tsnome = new JTextField();
		tcargo = new JTextField();
		tsalario = new JTextField();

		tid.setPreferredSize(new Dimension(150, 20));

		// Adiciona componentes no painel
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(lid);
		painelDados.add(tid);
		painelDados.add(lpnome);
		painelDados.add(tpnome);
		painelDados.add(lsnome);
		painelDados.add(tsnome);
		painelDados.add(lcargo);
		painelDados.add(tcargo);
		painelDados.add(lsalario);
		painelDados.add(tsalario);
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(Box.createVerticalStrut(10));

		// Cria painel de pesquisa
		JPanel painelPesquisa = new JPanel(new GridLayout(0, 3, 10, 10));
		borda = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
		painelPesquisa.setBorder(borda);

		// Cria pesquisas
		lpesquisa = new JLabel("Pesquisa código:");
		tpesquisa = new JTextField();
		botao = new JButton("Pesquisar");
		botao.addActionListener(this);

		// Define foco do cursor no campo de pesquisa
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				tpesquisa.requestFocus();
			}
		});

		// Adiciona compoentes ao painel de pesquisa
		painelPesquisa.add(lpesquisa);
		painelPesquisa.add(tpesquisa);
		painelPesquisa.add(botao);

		// Cria painel de pesquisa
		JPanel painelAcao = new JPanel(new GridLayout(0, 4, 10, 10));
		borda = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
		painelAcao.setBorder(borda);

		// Cria botões de manipulação de banco
		novo = new JButton("Novo");
		inserir = new JButton("Inserir");
		alterar = new JButton("Alterar");
		deletar = new JButton("Apagar");

		// Cria ouvintes de eventos
		novo.addActionListener(this);
		inserir.addActionListener(this);
		alterar.addActionListener(this);
		deletar.addActionListener(this);

		// Insere componentes em um painel
		painelAcao.add(novo);
		painelAcao.add(inserir);
		painelAcao.add(alterar);
		painelAcao.add(deletar);

		// Adiciona paineis
		painel.add(painelPesquisa);
		painel.add(painelDados);
		painel.add(painelAcao);

		return painel;
	}

	// Clique do botão de pesquisa
	public void actionPerformed(ActionEvent arg0) {

		// Verifica pesquisa
		if (arg0.getSource() == botao) {

			// Cria funcionario
			Funcionario funcionario = new Funcionario();

			// Busca funcionario
			funcionario = new FuncionarioDAO().buscaFuncionario(tpesquisa
					.getText());

			// verifica resultado
			long resultado = funcionario.getId();

			// Alimenta dados na GUI
			if (resultado != 0) {
				tid.setText(String.valueOf(funcionario.getId()));
				tpnome.setText(funcionario.getNome());
				tsnome.setText(funcionario.getSobrenome());
				tcargo.setText(funcionario.getCargo());
				tsalario.setText(String.valueOf(funcionario.getSalario()));
			} else {

				JOptionPane.showMessageDialog(menssagem,
						"Funcionario não encontrado!");

				javax.swing.SwingUtilities.invokeLater(new Runnable() {
					public void run() {
						tpesquisa.requestFocus();
						tpesquisa.selectAll();
					}
				});
			}
		}

		// Botão Novo
		if (arg0.getSource() == novo) {

			// Limpa GUI
			tid.setText(null);
			tpnome.setText(null);
			tsnome.setText(null);
			tcargo.setText(null);
			tsalario.setText(null);

			javax.swing.SwingUtilities.invokeLater(new Runnable() {
				public void run() {
					tid.requestFocus();
				}
			});

		}

		// Insere dados
		if (arg0.getSource() == inserir) {

			// Cria funcionario usando o construtor Overload
			Funcionario funcionario = new Funcionario(Integer.parseInt(tid
					.getText()), tpnome.getText(), tsnome.getText(),
					tcargo.getText(), Double.parseDouble(tsalario.getText()));

			// Cria objeto DAO
			FuncionarioDAO inserir = new FuncionarioDAO();

			// Insere funcionario
			boolean resultado = inserir.insereFuncionario(funcionario);

			// Exibe resultado
			if (resultado) {
				JOptionPane.showMessageDialog(menssagem,
						"Dados inseridos com sucesso!");
			} else {
				JOptionPane.showMessageDialog(menssagem,
						"Erro ao inserir Dados!");
			}

		}

		// Altera dados
		if (arg0.getSource() == alterar) {

			// Cria funcionario usando o construtor overload
			Funcionario funcionario = new Funcionario(Integer.parseInt(tid
					.getText()), tpnome.getText(), tsnome.getText(),
					tcargo.getText(), Double.parseDouble(tsalario.getText()));

			// Cria objeto DAO
			FuncionarioDAO alterar = new FuncionarioDAO();

			// Altera funcionario
			boolean resultado = alterar.updateFuncionario(funcionario);

			if (resultado) {
				JOptionPane.showMessageDialog(menssagem,
						"Dados alterados com sucesso!");
			} else {
				JOptionPane.showMessageDialog(menssagem,
						"Erro ao alterar Dados!");
			}

		}

		// Deleta dados
		if (arg0.getSource() == deletar) {

			// Cria funcionario utilizando o construtor overload
			Funcionario funcionario = new Funcionario(Integer.parseInt(tid
					.getText()), tpnome.getText(), tsnome.getText(),
					tcargo.getText(), Double.parseDouble(tsalario.getText()));

			// Cria objeto DAO
			FuncionarioDAO apagar = new FuncionarioDAO();

			// Deleta funcionario
			boolean resultado = apagar.deletaFuncionario(funcionario);

			// Exibe resultado
			if (resultado) {
				JOptionPane.showMessageDialog(menssagem,
						"Dados apagados com sucesso!");

				javax.swing.SwingUtilities.invokeLater(new Runnable() {
					public void run() {
						tpesquisa.requestFocus();
						tpesquisa.selectAll();
					}
				});

				novo.doClick();
			} else {

				JOptionPane.showMessageDialog(menssagem,
						"Erro ao apagar Dados!");

			}
		}

	}

	public static void criaGUI() {
		// Cria formulario
		JFrame formulario = new JFrame("Desenvolvimento Aberto");
		formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// cria painel de conteudo
		DAApp app = new DAApp();

		formulario.setContentPane(app.criaPainel());

		// Exibe o formulario
		formulario.setSize(400, 450);
		formulario.setVisible(true);

	}

	public static void main(String[] args) {

		javax.swing.SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {

				// Mostra GUI
				criaGUI();

			}
		});

	}

}

 

Publicidade

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s