1 de set. de 2018

Java Desktop, Cadastro CRUD - 4: Classe DAO

Vejamos nesta parte as rotinas de código que fazem o CRUD, inserindo, lendo, atualizando e deletando dados do banco. 


Para isso, criamos uma classe no pacote dao (Data Access Object), ClienteDAO, funcionando os objetos de acesso a dados.

Implementação da Interface DAO


java-desktop-cadastro-crud-parte-4

Crie a classe ClenteDAO (conforme visto na parte 2): botão direito do mouse sobre o pacote br.com.cliente.dao - New - Class):


java-desktop-cadastro-crud-parte-4
1-Eclipse - Nova Classe

Use o atalho de teclado Ctrl + barra de espaço da IDE Eclipse para implementar a Interface Dao criada na parte 2, do pacote util. Digite, após o nome da classe ClienteDAO, implements (escrevendo as primeiras letras e pressionando o atalho Ctrl + barra de espaço abre uma lista e autocompleta o comando); e após implements, digite Dao, ou somente a letra D (maiúscula) e pressione o atalho Ctrl + barra de espaço, conforme a próxima imagem:


java-desktop-cadastro-crud-parte-4
2-Implementando Interface

É importante usar o atalho de teclado do Eclipse para que ele crie os imports automaticamente.


Implementando os métodos da interface...


Após implementar a interface Dao na classe ClienteDao, é preciso implementar os métodos da interface, o que fica a cargo da classe. Observe que o Eclipse sublinha em vermelho o nome da classe. Basta colocar o cursor sobre ClienteDao, abrindo abaixo duas opções em azul. Clique em Add unimplemented methods. Vide abaixo.

java-desktop-cadastro-crud-parte-4
3-Adicionando métodos

Os métodos da interface serão criados automaticamente:


1 package br.com.cliente.dao;
2 
3 import java.util.List;
4 
5 import br.com.cliente.util.Dao;
6 
7 public class ClienteDao implements Dao {
8 
9  @Override
10 public void insert(Object o) {
11  // TODO Auto-generated method stub
12  
13 }
14
15 @Override
16 public void update(Object o) {
17  // TODO Auto-generated method stub
18  
19 }
20
21 @Override
22 public void delete(Object o) {
23  // TODO Auto-generated method stub
24  
25 }
26
27 @Override
28 public Object select(int i) {
29  // TODO Auto-generated method stub
30  return null;
31 }
32
33 @Override
34 public List select() {
35  // TODO Auto-generated method stub
36  return null;
37 }
38 
39 }


Rotinas de códigos dos métodos


Para inserir um cadastro no banco, após preencher os campos no formulário, o insert faz o comando SQL para inserir os dados no banco, onde nos valores (values) serão preenchidas as incógnitas (?) de acordo com o que "pegar" o método get, em cada atributo da classe Cliente relacionada aos campos do banco. Confira as sequências de códigos abaixo comentados. 

Só reforçando que, digitando o código, a sua memória "grava", mas copiando e colando, nem com "reza brava"!

1 public void insert(Object arg0) {
2   Cliente c = (Cliente) arg0; //Cast para inserir com Object um objeto da classe Cliente;
3   String sql = "insert into cliente (nome,endereco,municipio,cep,tel,cel,cpf,cnpj,genero) values (?,?,?,?,?,?,?,?,?)";
4   //Comando SQL para fazer a inserção no banco dos valores preenchidos no formulário (objeto Cliente);
5    try {
6     PreparedStatement ps = Conector.getConexao().prepareStatement(sql);
7     ps.setString(1, c.getNome());
8     ps.setString(2, c.getEndereco());
9     ps.setString(3, c.getMunicipio());
10    ps.setString(4, c.getCep());
11   ps.setString(5, c.getTel());
12   ps.setString(6, c.getCel());
13   ps.setString(7, c.getCpf());
14   ps.setString(8, c.getCnpj());
15   ps.setString(9, c.getGenero());
16   //Pega os valores do objeto Cliente (gets) e atribui aos campos da tabela;
17   
18   ps.execute(); //Executa o PreparedStatement
19  } catch (SQLException e) {
20   //TODO Auto-generated catch block
21   e.printStackTrace();
22  }
23 } 

Em seguida, deletar dados no banco consiste em executar o comando SQL delete pelo identificador id (chave primária) do registro ou cadastro que estiver aberto no formulário do sistema. 

1 public void delete(Object arg0) {
2   Cliente c = (Cliente) arg0;
3   String sql = "delete from cliente where id=?";
4   //Comando SQL para fazer a exclusão no banco pelo campo chave primária - id;
5   try {
6    PreparedStatement ps = Conector.getConexao().prepareStatement(sql);
7    //Faz a conexão com o banco e prepara o comando SQL;
8    ps.setInt(1, c.getId());
9    //Pega o valor do objeto Cliente (c.getId) e abribui ao campo chave primária - id;
10   ps.execute();
11   //Executa o comando;
12  } catch (SQLException e) {
13   // TODO Auto-generated catch block
14   e.printStackTrace();
15  }
16 }

atualizar, SQL update set onde as incógnitas (?) neste caso serão preenchidas com os dados alterados no campo de texto do formulário, para cada campo da tabela do banco, relacionada com os atributos da classe Cliente.


1 public void update(Object arg0) {
2   Cliente c = (Cliente) arg0;
3   String sql = "update cliente set nome=?,endereco=?,municipio=?,cep=?,tel=?,cel=?,cpf=?,cnpj=?,genero=? where id=?";
4   //Comando SQL para fazer a atualização no banco dos valores alterados no formulário (objeto Clente);
5   try {
6    PreparedStatement ps = Conector.getConexao().prepareStatement(sql);
7    ps.setString(1, c.getNome());
8    ps.setString(2, c.getEndereco());
9    ps.setString(3, c.getMunicipio());
10   ps.setString(4, c.getCep());
11   ps.setString(5, c.getTel());
12   ps.setString(6, c.getCel());
13   ps.setString(7, c.getCpf());
14   ps.setString(8, c.getCnpj());
15   ps.setString(9, c.getGenero());
16   ps.setInt(10, c.getId());
17   //Pega os valores do objeto Cliente (gets) e atribui aos campos (?) da tabela;
18   ps.execute();
19  } catch (SQLException e) {
20   // TODO Auto-generated catch block
21   e.printStackTrace();
22  }
23 }

A seleção de um registro do banco, para exibir na tela do formulário, retorna um objeto Cliente, após este ser instanciado; o comando SQL select ser executado e, ao contrário do método insert, os dados serem capturados dos campos da tabela do banco.


1 public Object select(int arg0) {
2   Cliente c = new Cliente();
3   //Faz a instância da classe Cliente;
4   String sql = "select * from cliente where id=?";
5   //Instrução SQL para seleção de registro específico da tabela cliente, pelo id;
6   try {
7    PreparedStatement ps = Conector.getConexao().prepareStatement(sql);
8    ResultSet rs = ps.executeQuery();
9    while(rs.next()){
10   //Laço de repetição para preencher com os dados do banco o objeto Cliente;
11    c.setNome(rs.getString("nome"));
12    c.setEndereco(rs.getString("endereco"));
13    c.setMunicipio(rs.getString("municipio"));
14    c.setCep(rs.getString("cep"));
15    c.setTel(rs.getString("tel"));
16    c.setCel(rs.getString("cel"));
17    c.setCpf(rs.getString("cpf"));
18    c.setCnpj(rs.getString("cnpj"));
19    c.setGenero(rs.getString("genero"));
20    //"seta" os atributos da classe Cliente com os dados dos campos do banco - pega os dados do banco para pesquisa no formulário;
21   }
22  } catch (SQLException e) {
23   // TODO Auto-generated catch block
24   e.printStackTrace();
25  }
26  return c;
27 }

O campo de pesquisa (combobox) do formulário será preenchido mediante a rotina a seguir. Cria uma lista de Clientes List; o comando select SQL faz a leitura de todos os registros da tabela; o laço de repetição while percorre estes registros e atribuem ao objeto da classe Cliente e este objeto, por sua vez, é adicionado à lista (list.add(c)). Completa retornando a lista (return list).


1 public List select() {
2   List list = new ArrayList();
3   //Cra uma lista dos objetos da classe Cliente;
4   String sql = "select * from cliente";
5   //Instrução SQL para seleção de todos os registros da tabela Cliente;
6   PreparedStatement ps;
7   try {
8    ps = Conector.getConexao().prepareStatement(sql);
9    ResultSet rs = ps.executeQuery();
10   //Executa a pesquisa da seleção SQL e atribui o resultado ao ResultSet;
11   while(rs.next()){
12    Cliente c = new Cliente();
13    //Faz a instância da classe Cliente;
14    c.setId(rs.getInt("id"));
15    c.setNome(rs.getString("nome"));
16    c.setEndereco(rs.getString("endereco"));
17    c.setMunicipio(rs.getString("municipio"));
18    c.setCep(rs.getString("cep"));
19    c.setTel(rs.getString("tel"));
20    c.setCel(rs.getString("cel"));
21    c.setCpf(rs.getString("cpf"));
22    c.setCnpj(rs.getString("cnpj"));
23    c.setGenero(rs.getString("genero"));
24    //"seta" os atributos da classe Cliente com os dados dos campos do banco;
25    list.add(c);
26    //Adiciona à lista os dados do resultado do laço while;
27   }
28  } catch (SQLException e) {
29   // TODO Auto-generated catch block
30   e.printStackTrace();
31  }
32  return list;
33 }

Com isso a classe ClienteDao está completa. 

Vale a pena estudar com calma esta classe, linha por linha, pois estes códigos se repetem em todos os projetos para funcionar o CRUD.

Na próxima parte veremos a classe JFrame, para a janela de formulário.