Duvida classe DAO

Oiii gente! Estou fazendo uma loja, ja fiz o sql (postgresql) são 3 tabelas: Cliente,Pedido e Produto. (a tabela pedido contém as fk de cliente e produto)
Logo fiz as 3 classes em java, sendo que a classe pedido terá um objeto cliente e um objeto produto para saber quem comprou o que, fiz uma classe também
para conectar ao banco de dados (postgresql) e está funcionando, ja testei e consigo ver as tabelas certinho no eclipse.
Minha dúvida, tenho que criar uma classe DAO para cada uma delas? (clienteDao,PedidoDAO e ProdutoDAO)
O programa apenas tem que mostrar o pedido, contendo o cliente e o produto. Fiz alguns inserts, selects e um update. Gostaria se possível que me ajudassem
a montar a classe DAO.

Obrigada e beijokas!

Você pode criar um Dao Generico, para o seu projeto, e depois se for necessário criar Daos Especificos, foi o que eu fiz no meu projeto de monografia, mas acabei tendo que criar Daos espeficos para todas minhas classes.

De um jeito ou de outro você terá que criar DAOs específicos, eu também to usando na minha monografía, então como nosso amigo acima falou , você pode criar um DAO Genérico e os específicos.

neste post que criei tem o DAO Generico que eu criei, dá uma olhada

http://www.guj.com.br/posts/list/198258.java#995828

t+

"cvinicios e Anderson S."
Obrigada! Vou olhar e depois volto a postar aqui.
beijokas!

EDIT: Desculpa gente, mas eu achei meio pesado esse exemplo, complexo demais pra mim q sou meio burrinha … rs rs

Vc tem que criar uma tabela dos produtos no pedido, pois um pedido pode ter vários produtos.

douglastc, sim, no sql, a tabela Pedido contém as foreign keys de produto e cliente, era isso que você se referiu?
Obrigada!

[quote=Mariana.Vecci]douglastc, sim, no sql, a tabela Pedido contém as foreign keys de produto e cliente, era isso que você se referiu?
Obrigada![/quote]

Mariana, o seu pedido tem vários produtos, como que ficaria a tabela Pedido? Um pedido tem vários produtos, é relacionamento 1 pra N, vc tem que criar uma tabela pra guardar os produtos do pedido.

pq ao inves do DAO vc num cria um MVC ??..Fica td mais facil e simples de manutencao…

ai ficaria assim.


//model
String sql = String.format("SELECT * FROM tabela WHERE cliente = '%s' ", textfieldCliente.getText()); //sua string sql para execucao...vc pode criar no form ou em metodos ou em classe,,,muito melhor de manipular.

//view
textfieldCliente.setText("nome do cliente"); //seu form propriamente dito

//controller, classe de execucao dos seus sql ...aqui vc pode fazer td de uma vez so, conectar, desconectar e executar sql no bd postgresql q escolheu.
public void executaSQL(String sql){ //metodo que executa seus sql use PreparedStatement ou Statement
PreparedStatement stm = conexao.PreparedStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stm.executeQuery();
}

…Com DAO vc precisa mandar a sua classe inteira tipo…Cliente cliente, eu acho meio trabalhoso pq tem q reescrever d+++, mas com MVC fica concluido…Dessa maneira vc centraliza a execucao dos seus SQL na msma classe, onde ele recebe uma string para executar o sql que precisa, SELECT, INSERT, UPDATE e DELETE…Sendo assim, vc sabe onde td acontece sempre.

fernandopaiva: Oii, é que sou obrigada a fazer com DAO… rs rs…
douglastc: Entendi agora o que você falouu, mas a tabela auxiliar não é quando é uma relação de n pra n?

Mariana Você ta usando Hibernate? pq se não estiver vc pode usar o mesmo esquema de Daos mas colocar mais parametros ao invés de passar um objeto, assim:

public void adicionar(Long id, String nome, String endereco, ....){

//sql de inserção
}

não seria um modo muito legal, vc teria que criar Daos especificos, e te daria muita mais trabalho do que usando o hibernate, além de dificultar a manutenção.

ou vc pode passar somente o objeto e depois monstar um sql com os propiedades dele sem usar o hibernate.

OBS: Os Daos fazem parte do modelo MVC, são os repositórios de dados.

cvinicios: Não estou, o banco de dados é o postgresql.
achei um exemplo na internet e o modifiquei para o meu programa, mas não funciona… rs rs…
classe para conectar ao banco:

[code]

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

public class ConFactory {

public static final int POSTGRESQL = 0;  
private static final String POSTGRESQLDriver = "org.postgresql.Drive";  

public static Connection conexao(String url, String nome, String senha,  
     int banco) throws ClassNotFoundException, SQLException {  
   switch (banco) {        
   case POSTGRESQL:           
      Class.forName(POSTGRESQLDriver);  
      break;  
   }  
   return DriverManager.getConnection(url, nome, senha);  
}

}[/code]

clienteDAO

[code]import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.JOptionPane;

//import model.Pessoa;

public class ClienteDAO {
// Configura essas variáveis de acordo com o seu banco
private final String URL = “jdbc:postgresql://localhost:5432/LojaVideoGame”,
NOME = “postgres”, SENHA = “odraude6969”;

private Connection con;  
private Statement comando;  


public Vector<Cliente> buscarTodos() {  
   conectar();  
   Vector<Cliente> resultados = new Vector<Cliente>();  
   ResultSet rs;  
   try {  
      rs = comando.executeQuery("SELECT * FROM cliente");  
      while (rs.next()) {  
         Cliente temp = new Cliente(0, NOME, NOME);  
         // pega todos os atributos da pessoa  
         temp.setCodc(rs.getInt("cod"));  
         temp.setNomec(rs.getString("nome"));  
         temp.setFonec(rs.getString("fone"));  
         resultados.add(temp);  
      }  
      return resultados;  
   } catch (SQLException e) {  
      imprimeErro("Erro ao buscar clientes", e.getMessage());  
      return null;  
   }  
}  

public Vector<Cliente> buscar(String codc) {  
  conectar();  
   Vector<Cliente> resultados = new Vector<Cliente>();  
   ResultSet rs;  
  try {  
      rs = comando.executeQuery("SELECT * FROM cliente WHERE codc LIKE '"  
            + codc + "%';");  
      while (rs.next()) {  
         Cliente temp = new Cliente(0, codc, codc);  
         // pega todos os atributos da pessoa  
         temp.setCodc(rs.getInt("cod"));  
         temp.setNomec(rs.getString("nome"));  
         temp.setFonec(rs.getString("fone"));   
         resultados.add(temp);  
      }  
      return resultados;  
   } catch (SQLException e) {  
      imprimeErro("Erro ao buscar pessoa", e.getMessage());  
      return null;  
   }  

}  

public void insere(Cliente cliente){  
   conectar();  
   try {  
      comando.executeUpdate("INSERT INTO Cliente VALUES('"  
            + cliente.getCodc() + "', '" + cliente.getNomec() + "',"  
           + cliente.getFonec() + "')");  
      System.out.println("Inserida!");  
   } catch (SQLException e) {  
      imprimeErro("Erro ao inserir Cliente", e.getMessage());  
   } finally {  
      fechar();  
   }  
}  

private void conectar() {  
	       try {  
          con = ConFactory.conexao(URL, NOME, SENHA, ConFactory.POSTGRESQL);  
	          comando = con.createStatement();  
	          System.out.println("Conectado!");  
	       } catch (ClassNotFoundException e) {  
	          imprimeErro("Erro ao carregar o driver", e.getMessage());  
	       } catch (SQLException e) {  
	          imprimeErro("Erro ao conectar", e.getMessage());  
	       }  
	    }  

private void fechar() {  
   try {  
      comando.close();  
      con.close();  
      System.out.println("Conexão Fechada");  
   } catch (SQLException e) {  
      imprimeErro("Erro ao fechar conexão", e.getMessage());  
   }  
}  

private void imprimeErro(String msg, String msgErro) {  
   JOptionPane.showMessageDialog(null, msg, "Erro crítico", 0);  
   System.err.println(msg);  
   System.out.println(msgErro);  
   System.exit(0);  
}  

} [/code]

erro java.lang.NoClassDefFoundError: lojavideogame/SQLStatement Caused by: java.lang.ClassNotFoundException: lojavideogame.SQLStatement at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) Exception in thread "main"

o projeto não esta encontrando a classe SQLStatement

tenta fazer o import java.sql.*;

obs: vc faz uma conexão a cada método e algumas vc não fecha, isso não é legal.

faça um método que verifique se a conexão já foi feita, caso não ele faz, se já foi feita ele devolve a conexão para o solicitante.

public static final Connection getConexao()
	{		
		// se não houver conexao "cria"
		if (con==null)
		{
			conexao = new Conectar();		
		}
		// se já houver uma conexao ativa envia
		return con;
	}    

Oii, aquela minha classe confactory não funciona, então vo usa a antiga:

[code]import java.sql.*;

public class SQLStatement {

public static void main(String args[]) {

   String url = "jdbc:postgresql://localhost:5432/LojaVideoGame"; 

   Connection con; 

   String query = "select * from cliente"; 

   Statement stmt; 

   try { 

       Class.forName("org.postgresql.Driver"); 

   } catch(java.lang.ClassNotFoundException e) { 

       System.err.print("ClassNotFoundException: "); 

       System.err.println(e.getMessage()); 

   } 

   try { 

       con = DriverManager.getConnection(url,"postgres", "odraude6969"); 

       stmt = con.createStatement(); 

       ResultSet rs = stmt.executeQuery(query); 

       ResultSetMetaData rsmd = rs.getMetaData(); 

       int numberOfColumns = rsmd.getColumnCount(); 

       int rowCount = 1; 

       while (rs.next()) { 

           System.out.println("Registro " + rowCount + ":  "); 

           for (int i = 1; i <= numberOfColumns; i++) { 

               System.out.print("   Campo " + i + ":  "); 

               System.out.println(rs.getString(i)); 

           } 

           System.out.println(""); 

           rowCount++; 

       } 

       stmt.close(); 

       con.close(); 

   } catch(SQLException ex) { 

       System.err.print("SQLException: "); 

       System.err.println(ex.getMessage()); 

   } 

}

}

[/code]
Uma dúvida, aquele select no meio da classe de conectar não interfere nas classes DAO?

EDIT: fechei ali a conexão que você estava falando ele acusou de criar um metodo na classe sqlstatement:

[code]import java.sql.*;

public class SQLStatement {

public static void main(String args[]) {

   String url = "jdbc:postgresql://localhost:5432/LojaVideoGame"; 

   Connection con; 

   String query = "select * from cliente"; 

   Statement stmt; 

   try { 

       Class.forName("org.postgresql.Driver"); 

   } catch(java.lang.ClassNotFoundException e) { 

       System.err.print("ClassNotFoundException: "); 

       System.err.println(e.getMessage()); 

   } 

   try { 

       con = DriverManager.getConnection(url,"postgres", "odraude6969"); 

       stmt = con.createStatement(); 

       ResultSet rs = stmt.executeQuery(query); 

       ResultSetMetaData rsmd = rs.getMetaData(); 

       int numberOfColumns = rsmd.getColumnCount(); 

       int rowCount = 1; 

       while (rs.next()) { 

           System.out.println("Registro " + rowCount + ":  "); 

           for (int i = 1; i <= numberOfColumns; i++) { 

               System.out.print("   Campo " + i + ":  "); 

               System.out.println(rs.getString(i)); 

           } 

           System.out.println(""); 

           rowCount++; 

       } 

       stmt.close(); 

       con.close(); 

   } catch(SQLException ex) { 

       System.err.print("SQLException: "); 

       System.err.println(ex.getMessage()); 

   } 

}

public static Connection conexao(String uRL, String nOME, String sENHA) {
// TODO Auto-generated method stub
return null;
}

[/code]

[code]import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.JOptionPane;

//import model.Pessoa;

public class ClienteDAO {
// Configura essas variáveis de acordo com o seu banco
private final String URL = “jdbc:postgresql://localhost:5432/LojaVideoGame”,
NOME = “postgres”, SENHA = “odraude6969”;

private Connection con;  
private Statement comando;  


public Vector<Cliente> buscarTodos() {  
   conectar();  
   Vector<Cliente> resultados = new Vector<Cliente>();  
   ResultSet rs;  
   try {  
      rs = comando.executeQuery("SELECT * FROM cliente");  
      while (rs.next()) {  
         Cliente temp = new Cliente(0, NOME, NOME);  
         // pega todos os atributos da pessoa  
         temp.setCodc(rs.getInt("cod"));  
         temp.setNomec(rs.getString("nome"));  
         temp.setFonec(rs.getString("fone"));  
         resultados.add(temp);  
      }  
      return resultados;  
   } catch (SQLException e) {  
      imprimeErro("Erro ao buscar clientes", e.getMessage());  
      return null;  
   }  
}  

public Vector<Cliente> buscar(String codc) {  
  conectar();  
   Vector<Cliente> resultados = new Vector<Cliente>();  
   ResultSet rs;  
  try {  
      rs = comando.executeQuery("SELECT * FROM cliente WHERE codc LIKE '"  
            + codc + "%';");  
      while (rs.next()) {  
         Cliente temp = new Cliente(0, codc, codc);  
         // pega todos os atributos da pessoa  
         temp.setCodc(rs.getInt("cod"));  
         temp.setNomec(rs.getString("nome"));  
         temp.setFonec(rs.getString("fone"));   
         resultados.add(temp);  
      }  
      return resultados;  
   } catch (SQLException e) {  
      imprimeErro("Erro ao buscar pessoa", e.getMessage());  
      return null;  
   }  finally {  
      fechar();  
   }  

}  

public void insere(Cliente cliente){  
   conectar();  
   try {  
      comando.executeUpdate("INSERT INTO Cliente VALUES('"  
            + cliente.getCodc() + "', '" + cliente.getNomec() + "',"  
           + cliente.getFonec() + "')");  
      System.out.println("Inserida!");  
   } catch (SQLException e) {  
      imprimeErro("Erro ao inserir Cliente", e.getMessage());  
   } finally {  
      fechar();  
   }  
}  

private void conectar() {  
	       try {  
          con = SQLStatement.conexao(URL, NOME, SENHA);  
	          comando = con.createStatement();  
	          System.out.println("Conectado!");  
	       } catch (SQLException e) {  
	          imprimeErro("Erro ao conectar", e.getMessage());  
	       }  
	    }  

private void fechar() {  
   try {  
      comando.close();  
      con.close();  
      System.out.println("Conexão Fechada");  
   } catch (SQLException e) {  
      imprimeErro("Erro ao fechar conexão", e.getMessage());  
   }  
}  

private void imprimeErro(String msg, String msgErro) {  
   JOptionPane.showMessageDialog(null, msg, "Erro crítico", 0);  
   System.err.println(msg);  
   System.out.println(msgErro);  
   System.exit(0);  
}  

} [/code]

[quote=fernandopaiva]pq ao inves do DAO vc num cria um MVC ??..Fica td mais facil e simples de manutencao…

ai ficaria assim.


//model
String sql = String.format("SELECT * FROM tabela WHERE cliente = '%s' ", textfieldCliente.getText()); //sua string sql para execucao...vc pode criar no form ou em metodos ou em classe,,,muito melhor de manipular.

//view
textfieldCliente.setText("nome do cliente"); //seu form propriamente dito

//controller, classe de execucao dos seus sql ...aqui vc pode fazer td de uma vez so, conectar, desconectar e executar sql no bd postgresql q escolheu.
public void executaSQL(String sql){ //metodo que executa seus sql use PreparedStatement ou Statement
PreparedStatement stm = conexao.PreparedStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stm.executeQuery();
}

…Com DAO vc precisa mandar a sua classe inteira tipo…Cliente cliente, eu acho meio trabalhoso pq tem q reescrever d+++, mas com MVC fica concluido…Dessa maneira vc centraliza a execucao dos seus SQL na msma classe, onde ele recebe uma string para executar o sql que precisa, SELECT, INSERT, UPDATE e DELETE…Sendo assim, vc sabe onde td acontece sempre.

[/quote]

Isso vc chama de MVC? :roll:

A maneira como usa o Statement da muito trabalho, vc precisa trabalhar e concatenar muita string…com PreparedStatement fica mais facil veja.

// insere banco
Connection con = ClasseConexao.getConnection();
// Com PreparedStatement vc nao precisa de concatenar, basta passar o indice do campo para o PreparedStatement, fica mais limpo e facil de localizar os erros.
PreparedStatement stm = con.PreparedStatement("INSERT INTO tabela (nome, endereco, bairro, cidade) VALUES (?,?,?,?)"); 
stm.setString(1, nome.getText()); //indice 1
stm.setString(2, endereco.getText()); //indice 2
stm.setString(3, bairro.getText()); //indice 3
stm.setString(4, cidade.getText()); //indice 4
stm.execute();

//consulta banco
PreparedStatement stm = con.PreparedStatement("SELECT * FROM tabela WHERE nome LIKE ?  ORDER BY nome");
stm.getString(1, "%" + nome.getText() + "%"); //mandando a string pronta para o LIKE isso vai chegar assim %meunome%
ResultSet rs = stm.execute();
rs.next();
nome.setText(rs.getString("nome");

Dessa maneira vc evita ate o SQL Injection na aplicacao…ou ainda tente usar String.format

veja:

String sql = String.format("INSERT INTO tabela (codigo, nome,cidade) VALUES (%d ,'%s', '%s')", codigo.getText(), nome.getText(), cidade.getText()); //monta a string sql usando String.format

//metodo que executa seu sql
public void executaSQL(String sql){
    stm.executeQuery(sql);
}

Como eu disse, da para fazer um DAO ou MVC, depende de como quer trabalhar…Eu uso MVC, prefiro.

t+

[quote=fernandopaiva]A maneira como usa o Statement da muito trabalho, vc precisa trabalhar e concatenar muita string…com PreparedStatement fica mais facil veja.

// insere banco
Connection con = ClasseConexao.getConnection();
// Com PreparedStatement vc nao precisa de concatenar, basta passar o indice do campo para o PreparedStatement, fica mais limpo e facil de localizar os erros.
PreparedStatement stm = con.PreparedStatement("INSERT INTO tabela (nome, endereco, bairro, cidade) VALUES (?,?,?,?)"); 
stm.setString(1, nome.getText()); //indice 1
stm.setString(2, endereco.getText()); //indice 2
stm.setString(3, bairro.getText()); //indice 3
stm.setString(4, cidade.getText()); //indice 4
stm.execute();

//consulta banco
PreparedStatement stm = con.PreparedStatement("SELECT * FROM tabela WHERE nome LIKE ?  ORDER BY nome");
stm.getString(1, "%" + nome.getText() + "%"); //mandando a string pronta para o LIKE isso vai chegar assim %meunome%
ResultSet rs = stm.execute();
rs.next();
nome.setText(rs.getString("nome");

Dessa maneira vc evita ate o SQL Injection na aplicacao…ou ainda tente usar String.format

veja:

String sql = String.format("INSERT INTO tabela (codigo, nome,cidade) VALUES (%d ,'%s', '%s')", codigo.getText(), nome.getText(), cidade.getText()); //monta a string sql usando String.format

//metodo que executa seu sql
public void executaSQL(String sql){
    stm.executeQuery(sql);
}

Como eu disse, da para fazer um DAO ou MVC, depende de como quer trabalhar…Eu uso MVC, prefiro.

t+[/quote]

E quem disse que não dá pra usar DAO e MVC juntos?
Melhor, eles geralmente andam juntos…

Mariana.Vecci,
tava vendo ali atraz que vc ta usando uma classe de conexão com o banco muito complexa… eu tenho uma classe de conexão aqui bem simples vou postar ela pra você, e vou te mostrar um exemplo de como instancia-la dentro de um método de uma classe DAO qualquer… bjs!!! :twisted:
CLASSE DE CONEXÃO COM O BANCO


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

public class Conexao {

	// Método que irá estabelecer a conexao como o Banco de Dados
   public static Connection getConexao() throws SQLException{

	   try{
		// Aqui é o processo de se registrar o drive
		   Class.forName("org.postgresql.Driver");
		   System.out.println("Conectado ao banco");

		// Processo de estabelecer a conexão
		   return DriverManager.getConnection("jdbc:postgresql://localhost/Nome do Schema do Banco" , "Usuário" , "Senha");

		   // Tratamento de erro, caso ocorra algum!!
	   }catch(ClassNotFoundException e){

		   // Caso ocorra erro, irá aparecer uma mensagem
	   throw new SQLException(e.getMessage());
	   }

   }

}

UM EXEMPLO DE COMO UTILIZA-LA

import java.sql.*;

public class FulanoDAO{

          public void CadastrarFulano(String exemplo_Nome,String exemplo_Email) throws SQLException// Isso é só um exemplo
         {
              Connection conn = Conexao.getConexao();// CLASSE DE CONEXÃO COM O BANCO SENDO INSTANCIADA
              String sql = "INSERT INTO tabelaDoBanco(nome,email) VALUES(?,?)";
              PreparedStatement stmt = conn.PreparedStatement(sql);//É bem melhor utilizar o PreparedStatement
              stmt.setString(1,exemplo_Nome);
              stmt.setString(2,exemplo_Email);
            
             stmt.execute();
             stmt.close();
         }
}

Anderson S.: Obrigada! ajudou muito os teus exemplos!

Essa classe de conexão ai é simples e serve para qualquer banco, basta mudar os endereços, a parte da instancia, ou seja, abertura de uma conexão com o banco é bem simples você viu ai, eu sempre utilizo essa classe nas minhs aplicações, e o padrão DAO que uso é esse que você viu acima, quase não tenho erro nessa parte de persistencia… :mrgreen: