Padrão DAO - Data Access Object

Esse padrão tem por finalidade criar uma camada de acesso ao banco de dados e proporcionando o isolamento da camada de persistência das demais camadas do projeto. Essa camada e composta pela classe DAO e a classe que terá os métodos para o CRUD (Inserir, Deletar, Excluir e Lista) para cada entidade da camada de modelo. No exemplo abaixo a classe PessoaDao representa essa lógica e a entidade a ser persistida no banco de dados é Pessoa. A classe Dao é composta por dois métodos que são: Open() para abrir o banco e o Close() para fechar o banco. E alguns atributos como Connection (Conexão ao Banco de Dados), PreparedStatement (Acessar a Tabela) , ResultSet (Consulta a Tabela) e o CallaBleStatement (Usar Procedures e Function).

Exemplo da Classe DAO

package persistence;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Dao {
	
	Connection con;  // Conexao ao Banco de Dados
	PreparedStatement stmt; // Acessa a Tabela ( insert, update, delete , select)
	ResultSet rs; // Consulta a Tabela( select )
	CallableStatement call; // Procedures e Function
	
	public void open() throws Exception{
		
		Class.forName("com.mysql.jdbc.Driver");
		con = DriverManager.getConnection("caminho", "usuario", "senha");		
	}
	
	public void close() throws Exception{		
		con.close();
	}
}
        

O comando Class.forName() é o caminho do driver de comunicação jdbc com o banco de dados. Cada banco de dados tem o seu driver.

A primeira String do comando DriverManager.getConnection() representa o caminho do banco de dados, que nesse exemplo do mysql é jdbc:mysql://localhost:3306/banco. A palavra banco no caminho ao lado tem referencia ao banco de dados criado no mysql.

A segunda String do comando representa o usuário que irá acessar o banco de dados.

A terceira String do comando representa a senha de acesso ao banco de dados do usuário escolhido. Após definir a classe de conexão do Banco de Dados, o passo seguinte é definir a classe que irá fazer a lógica do CRUD (Inserir, Listar, Atualizar, Deletar). Nesse caso será utilizado a classe PessoaDao para representar essa lógica e nessa classe é herdado a classe Dao.

Exemplo de classe com o CRUD - PessoaDao

package persistence;

import java.util.ArrayList;
import java.util.List;

import entity.Pessoa;

public class PessoaDao extends Dao {
	
	public void salvar(Pessoa p) throws Exception {
		open();
		stmt = con.prepareStatement("insert into pessoa values(null,?,?)");
		stmt.setString(1, p.getNomePessoa());
		stmt.setString(2, p.getEmail());
		stmt.execute();
		stmt.close();
		close();
	}

	public void delete(Pessoa p) throws Exception {

		open();
		stmt = con.prepareStatement("delete from Pessoa where idPessoa = ?");
		stmt.setInt(1, p.getIdPessoa());
		stmt.execute();
		stmt.close();
		close();

	}

	public void update(Pessoa p) throws Exception {

		open();
		stmt = con.prepareStatement("update Pessoa nome = ?, email = ? where idPessoa = ?");
		stmt.setString(1, p.getNomePessoa());
		stmt.setString(2, p.getEmail());
		stmt.setInt(3, p.getIdPessoa());
		stmt.execute();
		stmt.close();
		close();

	}

	public Pessoa finallByCod(int cod) throws Exception {

			open();
			stmt = con.prepareStatement("select * from pessoa where idPessoa = ? ");
			rs = stmt.executeQuery();			
			Pessoa p = null;
			if (rs.next()) {
				p = new Pessoa();
				p.setIdPessoa(rs.getInt("idPessoa"));
				p.setNomePessoa(rs.getString("nomePessoa"));
				p.setEmail(rs.getString("email"));				
			}
			close();
			return p;
	}

	public List findAll() {
		try {
			open();
			stmt = con.prepareStatement("select * from pessoa");
			rs = stmt.executeQuery();
			List lista = new ArrayList();
			while (rs.next()) {
				Pessoa p = new Pessoa();
				p.setIdPessoa(rs.getInt("idPessoa"));
				p.setNomePessoa(rs.getString("nomePessoa"));
				p.setEmail(rs.getString("email"));
				lista.add(p);
			}
			close();
			return lista;
		} catch (Exception e) {
			System.out.println(e.getMessage());
			return null;
		}
	}
}    

Para efetuar um teste com a lógica do CRUD tem que criar o banco e a tabela pessoa pelo SQL, que é a linguagem padronizada para todos os bancos de dados, e copiar no mysql. Logo é criado um arquivo chamando script.sql.

Exemplo de script.sql

# O símbolo # serve para comentar no script.sql

# Comando usado para apagar o banco 
# Não utilizado em ambiente de construção de sistemas
drop database if exists aula;

# Comando usado para criar o banco
create database aula;

# Comando usado para acessar o banco
use aula;

# Comando para drop a tabela;
drop table pessoa;

# comando para criar uma tabela
create table pessoa(
	idPessoa int primary key auto_increment,
	nomePessoa varchar(50),
	email varchar(50)
);    

Camada de Modelo

A Camada de modelo encontra-se a classe de dados que nesse exemplo é Pessoa.

package entity;

public class Pessoa {
	
	private Integer idPessoa;
	private String nomePessoa;
	private String email;
	
	public Pessoa() {	
	}
		
	public Pessoa(String nomePessoa, String email) {
		super();
		this.nomePessoa = nomePessoa;
		this.email = email;
	}

	public Pessoa(Integer idPessoa, String nomePessoa, String email) {
		super();
		this.idPessoa = idPessoa;
		this.nomePessoa = nomePessoa;
		this.email = email;
	}

	@Override
	public String toString() {
		return "Pessoa [idPessoa=" + idPessoa + ", nomePessoa=" + nomePessoa + ", email=" + email + "]";
	}

	public Integer getIdPessoa() {
		return idPessoa;
	}
	public void setIdPessoa(Integer idPessoa) {
		this.idPessoa = idPessoa;
	}
	public String getNomePessoa() {
		return nomePessoa;
	}
	public void setNomePessoa(String nomePessoa) {
		this.nomePessoa = nomePessoa;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;	
	}
}

Executando o CRUD no main

public static void main(String[] args) {
		
		//Para testar a Lógica do CRUD
		//A chave primaria é null porque no banco de dados está auto increment
		//Quer dizer, chave primaria está sendo incrementa pelo banco.
		
		Pessoa p1 = new Pessoa(null, "jose", "jose@gmail.com");
		Pessoa p2 = new Pessoa(null, "joao", "joao@gmail.com");
		PessoaDao pd = new PessoaDao();
		try {
			
			//Comando para gravar no banco;
				pd.create(p1);
				pd.create(p2);
				
			//Comando para listaTodos
			    System.out.println(pd.findAll());
			
			//Comando para alterar uma pessoa;
			    
			    // 1º Passo
			    //Busca pelo Codigo
			   	// 2 -> é a chave primaria de pessoa no banco
			    Pessoa pessoa = pd.finallByCod(2);	
			    
			    System.out.println("pessoa:" + pessoa);
			    pessoa.setEmail("joao2@gmail.com");
			    // 2º Passo
			   	//Alterar o usuario 2
			    System.out.println("pessoa:" + pessoa);
			    			    
			    pd.update(pessoa);
			    
				//Comando para listaTodos e verificar a alteração
			    //Varrendo a lista vinda do findAll
			    //e imprimindo cada linha
			    //Classe objeto : lista de valores	
			    for(Pessoa p : pd.findAll()){
			    	System.out.println(p);
			    }
			    
				//Comando para deletar uma pessoa;    
			    //1º Passo : buscar o Codigo
			    Pessoa pessoa1 = pd.finallByCod(2);
			    //2º Passo
			    pd.delete(pessoa1);
			  
				//Comando para listaTodos
			    System.out.println(pd.findAll());   
			    
		} catch (Exception e) {
			System.out.println("Error:  " + e.getMessage());
		}		
	}