Duvidas Pacote DAO

3 respostas
Campacci

Olá a todos ...

Estou aprendendo JAVA, porem eu tenho muita dificuldade em entender alguns conceitos ...
Já estou a algum tempo tentando entender o funcionamento dos pacotes DAO ... para isso eu fiz um como exemplo.

1º Criei o banco estoque, com algumas tabelas ... duas delas estão abaixo:
[img]http://img402.imageshack.us/img402/2125/43448119.jpg[/img]

2º Criei a classe ClienteDao
package DAO;

import bean.Cliente;
import conexao.Banco;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Eduardo
 */
public class ClienteDao {

    //Inserir

    public boolean inserir(Cliente cliente) throws SQLException {

                Banco banco = new Banco();
		Connection con = null;

		String sql = "insert into usuario " + "( Id, Nome, Cpf, Id_contato, Id_endereco, Id_categoria, Id_pedido) "
				+ " VALUES(?,?,?,?,?,?,?)";

		try {
                    con = banco.conectar();
			PreparedStatement ps = (PreparedStatement) con.prepareStatement(sql);

			ps.setInt(1, cliente.getId());
			ps.setString(2, cliente.getNome());
			ps.setInt(3, cliente.getCpf());
			ps.setInt(4, cliente.getId_contato());
			ps.setInt(5, cliente.getId_endereco());
                        ps.setInt(6, cliente.getId_categoria());
                        ps.setInt(7, cliente.getId_pedido());


			ps.execute();
			ps.close();
			return true;
                        
		} catch (SQLException e) {
			System.err.println("Erro ao inserir na tabela cliente");
			e.printStackTrace();
			return false;
		} finally {
                    banco.fechaConexao(con);
                }
	}


    // Consulta (Lista)

    public List<Cliente> getLista() throws SQLException {

        Connection con = null;
        Banco banco = new Banco();
    	 String sql = "select * from cliente";
       List<Cliente> listaresultado = new ArrayList<Cliente>();

       try {
    	con = banco.conectar();
        PreparedStatement stmt = con.prepareStatement(sql);

        ResultSet rs = stmt.executeQuery();

        while (rs.next()) {
            Cliente c1 = new Cliente();
            c1.setId_contato(rs.getInt("id_contato"));
            c1.setCpf(rs.getInt("Cpf"));
            c1.setNome(rs.getString("nome"));
            c1.setId_endereco(rs.getInt("id_endereco"));
            c1.setId_categoria(rs.getInt("id_categoria"));
            c1.setId_pedido(rs.getInt("id_pedido"));
            c1.setId(rs.getInt("id"));
            listaresultado.add(c1);

            }
        rs.close();
        stmt.close();
        }catch (SQLException e) {
			System.err.println("Erro na Querry");
			e.printStackTrace();

		}
       finally {
            con.close();
       }
	return listaresultado;

    }





//Remove

public void exclui(Integer Id) throws ClienteException {
		Connection conn = null;
		Banco banco = new Banco();

		try {
			conn = banco.conectar();
			String SQL = "DELETE FROM Usuario WHERE Id = ?";

			PreparedStatement comando = conn.prepareStatement(SQL);

			comando.setInt(1, Id);

			comando.execute();
			comando.close();

		} catch (Exception e) {
			System.out.println("Erro ao tentar deletar usuario: " + e);

			throw new ClienteException(
					"Erro ao tentar alterar informações de um usuario: "
							+ e.getMessage());
		} finally {
			banco.fechaConexao(conn);
		}

	}

//Atualizar (Update)
public void update(Cliente cliente) throws ClienteException {

                Connection conn = null;
		Banco banco = new Banco();

		try {
			conn = banco.conectar();
			String SQL = "UPDATE Cliente SET id = ?, nome = ?, cpf = ?, id_contato = ?, id_endereco = ?, id_categoria = ?, id_pedido = ?, WHERE id = ?";

			PreparedStatement comando1 = conn.prepareStatement(SQL);

			comando1.setInt(1, cliente.getId());
			comando1.setString(2, cliente.getNome());
			comando1.setInt(3, cliente.getCpf());
			comando1.setInt(4, cliente.getId_contato());
			comando1.setInt(5, cliente.getId_endereco());
                        comando1.setInt(6, cliente.getId_categoria());
                        comando1.setInt(7, cliente.getId_pedido());


			// Executa o comando acima
			comando1.execute();
			// Fecha o comando executado.
			comando1.close();
		} catch (Exception e) {
			System.out.println("Erro ao tentar alterar usuario: " + e);

			throw new ClienteException(
					"Erro ao tentar alterar informações de um usuario: "
							+ e.getMessage());
		} finally {
			banco.fechaConexao(conn);
		}

	}

}

Agora vem as duvidas ...

No 1º metodo da classe, onde é inserido os clientes. É necessario descrever no codigo o item ID (Que se refere ao id do cliente)? Pois no banco este campo da tabela cliente esta como auto_incremento. Ou a maneira que eu fiz esta correta?
String sql = "insert into usuario " + "( Id, Nome, Cpf, Id_contato, Id_endereco, Id_categoria, Id_pedido) "
				+ " VALUES(?,?,?,?,?,?,?)";
E o Id_contato, Id_endereco, Id_categoria, Id_pedido Esta certo eu inserir eles na classe cliente mesmo? Pois eles são chaves entrangeiras no BD.

Caso não entendam minhas duvidas, me digam que eu tento explicar de outra forma.

Se alguem puder me ajudar ... qualquer correção, explicação ou dica sera muito bem vinda.

Vlw.

3 Respostas

S

Se eh auto increment não há necessidade de colocar ele na query, então:

String sql = "insert into usuario " + "( Nome, Cpf, Id_contato, Id_endereco, Id_categoria, Id_pedido) "  
 + " VALUES(?,?,?,?,?,?)";

Era somente essa a dúvida, ou vc está mais preocupado com a arquitetura da sua solução?

abs

jamirdeajr

Olá Campacci,

Já que você deixou a cargo do banco de dados fazer a atribuição do id, não é necessário incluir no insert, então ficaria assim:
String sql = "insert into usuario " + "(Nome, Cpf, Id_contato, Id_endereco, Id_categoria, Id_pedido) "  
 + " VALUES(?,?,?,?,?,?)";
Quanto as chaves estrangeiras Id_contato, Id_categoria etc, você deve sim atribuir o valor a hora do insert, ou então null (se for permitido é claro) e depois atualizar com esses valores. Ali no update não é necessário fazer SET do ID, pois você já está trazendo ele, só tire a vírgula antes do WHERE e atribua o valor do id do WHERE no final:
String SQL = "UPDATE Cliente SET nome = ?, cpf = ?, id_contato = ?, id_endereco = ?, id_categoria = ?, id_pedido = ?  WHERE id = ?"; 
comando1.setString(1, cliente.getNome());  
comando1.setInt(2, cliente.getCpf());  
comando1.setInt(3, cliente.getId_contato());  
comando1.setInt(4, cliente.getId_endereco());  
comando1.setInt(5, cliente.getId_categoria());  
comando1.setInt(6, cliente.getId_pedido());  
comando1.setInt(7, cliente.getId());
Espero ter ajudado...
Campacci
S4M4R0N3:
Se eh auto increment não há necessidade de colocar ele na query, então:
String sql = "insert into usuario " + "( Nome, Cpf, Id_contato, Id_endereco, Id_categoria, Id_pedido) "  
 + " VALUES(?,?,?,?,?,?)";

Era somente essa a dúvida, ou vc está mais preocupado com a arquitetura da sua solução?

abs

jamirdeajr:
Olá Campacci, Já que você deixou a cargo do banco de dados fazer a atribuição do id, não é necessário incluir no insert, então ficaria assim:
String sql = "insert into usuario " + "(Nome, Cpf, Id_contato, Id_endereco, Id_categoria, Id_pedido) "  
 + " VALUES(?,?,?,?,?,?)";
Quanto as chaves estrangeiras Id_contato, Id_categoria etc, você deve sim atribuir o valor a hora do insert, ou então null (se for permitido é claro) e depois atualizar com esses valores. Ali no update não é necessário fazer SET do ID, pois você já está trazendo ele, só tire a vírgula antes do WHERE e atribua o valor do id do WHERE no final:
String SQL = "UPDATE Cliente SET nome = ?, cpf = ?, id_contato = ?, id_endereco = ?, id_categoria = ?, id_pedido = ?  WHERE id = ?"; 
comando1.setString(1, cliente.getNome());  
comando1.setInt(2, cliente.getCpf());  
comando1.setInt(3, cliente.getId_contato());  
comando1.setInt(4, cliente.getId_endereco());  
comando1.setInt(5, cliente.getId_categoria());  
comando1.setInt(6, cliente.getId_pedido());  
comando1.setInt(7, cliente.getId());
Espero ter ajudado...

S4M4R0N3
Quem me dera se fosse somente essa duvida rsrsrs. Tenho muito +
Quanto a arquitetura ... usei alguns exemplos, dicas e cheguei nessa aew. Mas se vc tiver alguma orientação para me passar ... vou aproveitar né hehe.

jamirdeajr
Ajudou d+++ ...

Vou criar as outras classes Dao, como contato, endereco, categoria e pedido ...
Aew eu coloco as outras duvidas junto com o codigo que eu for fazendo ... pra ficar mais facil.

Só não sei se posso utilizar este mesmo post !!! rsr

Ahhh ... e se tiverem algum material para eu enteder melhor sobre o pacote Dao, me ajudaria muito ... pois estou com dificuldade enorme para entender.
E os materiais que consigo na internet utilizam uma forma muito tecnica e acabo não entendendo. Desculpe pela ignorancia rsrsrs.

Logo eu volto com mais duvidas aqui ...

Desde já agradeço a ajuda e simplicidade de vcs.

Vlw

Criado 20 de junho de 2011
Ultima resposta 20 de jun. de 2011
Respostas 3
Participantes 3