[RESOLVIDO] Salvar os dados de uma classe que possui herança em uma base de dados

9 respostas
F

Boa noite pessoal,

Primeiramente quero desejar um grande ano de 2011 para todos.

Vamos ao problema.

Estou iniciando em Java e tenho uma dúvida referente a como salvar os dados de uma classe que possui herança em uma base de dados.

Vamos as classes.

Classe Endereço

package br.com.especializacoes;

public class Endereco {
    
    private String bairro;
    private String rua;
    private String cep;
    private String numero;
    private String complemento;

    public String getBairro() {
        return bairro;
    }
    
    public void setBairro(String bairro) {
        this.bairro = bairro;
    }

    public String getRua() {
        return rua;
    }

    public void setRua(String rua) {
        this.rua = rua;
    }

    public String getCep() {
        return cep;
    }

    public void setCep(String cep) {
        this.cep = cep;
    }

    public String getNumero() {
        return numero;
    }

    public void setNumero(String numero) {
        this.numero = numero;
    }

    public String getComplemento() {
        return complemento;
    }

    public void setComplemento(String complemento) {
        this.complemento = complemento;
    }
    
   public Endereco (String bairro, String rua, String cep, String numero, String complemento)
            
    {            
           this.setBairro(bairro);
           this.setRua(rua);
           this.setCep(cep);
           this.setNumero(numero);
           this.setComplemento(complemento);
    }   
}

A classe que herda os dados da classe Endereço

Classe InstituicaoBean

package br.com.instituicao;

import br.com.especializacoes.Endereco;

public class InstituicaoBean {
    
    private int idInstituicao;
    private String nomeInstituicao;
    private Endereco endereco;

    public int getIdInstituicao() {
        return idInstituicao;
    }

    public void setIdInstituicao(int idInstituicao) {
        this.idInstituicao = idInstituicao;
    }

    public String getNomeInstituicao() {
        return nomeInstituicao;
    }

    public void setNomeInstituicao(String nomeInstituicao) {
        this.nomeInstituicao = nomeInstituicao;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }
}

A Classe DAO

package br.com.instituicao;

import br.com.conexao.ConectionManager;

import br.com.especializacoes.Endereco;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class InstituicaoDao {
        
    public void adiciona (InstituicaoBean instituicao) throws SQLException{
    
    Connection conn = null;
    PreparedStatement stmt = null;
    String sql = "INSERT INTO edu_instituicao (instnome, instbairro, instrua, instcep, instnumero, instcomplemento) VALUES (?,?,?,?,?,?)";
     
        try {
            
            conn = ConectionManager.getConexao();
            stmt = conn.prepareStatement(sql);
            
           Endereco end = new Endereco(sql, sql, sql, sql, sql);
                
            stmt.setString(1, instituicao.getNomeInstituicao());
            stmt.setString(2, end.getBairro());
            stmt.setString(3, end.getRua());
            stmt.setString(4, end.getCep());
            stmt.setString(5, end.getNumero());
            stmt.setString(6, end.getComplemento()); 
                      
            stmt.executeUpdate();
            stmt.close();
            
        } catch (Exception e) {
            
            System.out.println(e);
        }
    
    finally{
    
        ConectionManager.close(conn);
        System.out.println("fechado");
        
    }
       
    }
  
}

Amigos o problema é não saber o que colocar nestas linhas de código abaixo.

Está certo em instanciar a classe endereço aqui?

Endereco end = new Endereco(sql, sql, sql, sql, sql);

                
Como devo proceder com as linhas abaixo?

            stmt.setString(1, instituicao.getNomeInstituicao());
            stmt.setString(2, end.getBairro());
            stmt.setString(3, end.getRua());
            stmt.setString(4, end.getCep());
            stmt.setString(5, end.getNumero());

Tentei fazer inúmeras vezes, mas a minha falta de conhecimento em Java não me permitiu resolver está dúvida, por isso solicito uma forcinha de vocês.

Obrigado.

9 Respostas

Lucas_Cavalcanti

Olá Fabiano, feliz 2011 =)

usar JDBC é muito bom pra aprender como as coisas funcionam, mas recomendo que vc use o Hibernate.

Dê uma olhada nessa apostila (e no curso ;)) da Caelum:
http://www.caelum.com.br/curso/fj-21-java-web/

Abraços

Lucas_Cavalcanti

bom, não respondi a pergunta :stuck_out_tongue:

no seu caso vc não precisa instanciar o Endereço, já que vc já vai passar ele direto pra PreparedStatement. Passe os valores direto no setString… ou receba um Endereço já preenchido como parâmetro do método

[]'s

luxu

da pra postar essas duas tabelas do banco?

F

Boa noite luxu,

Estou trabalhando com esta tabela para o projeto.

CREATE TABLE `edu_instituicao` (
  `edu_idinstituicao` INTEGER(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `instnome` VARCHAR(100) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',
  `instbairro` VARCHAR(60) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',
  `instrua` VARCHAR(60) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',
  `instcep` VARCHAR(20) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',
  `instnumero` VARCHAR(20) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',
  `instcomplemento` VARCHAR(200) COLLATE latin1_swedish_ci DEFAULT NULL,
  PRIMARY KEY (`edu_idinstituicao`)
)ENGINE=InnoDB
AUTO_INCREMENT=1 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci';

Obrigado pela força

F

Lucas obrigado pela força.

Quando busco os dados via setString ele não me trás os atributos da classe mãe (Classe Endereço).

Como devo trazer este atributos?

teria como me mostrar um exemplo

Abraços!

paulo1911

Olá amigo,

Feliz 2011 pra vc!!

Bem eu recomendo o seguinte,

Mude sua estrutura de classe, veja que se vc utilizar as perguntas básicas da Orientação a Objeto vc vai ver que tem coisa errada ( na minha opinião).

Instituição (TEM UM) (Has a) endereço ao invès de,

Instituição (É UM) (Is a) endereço.

Na cua classe instituição vc deve possuir uma instancia da Classe endereco, juntamente com o set e get dela…

Vc instanciaria a classe instituição e depois de setar a classe de endereco vc usaria o metodo get para pegar os atributos do endereco e passar para o prepared statment.

Veja:

class Instituicao{

private Endereco endereco;

public void setEndereco(Endereco e){

this.endereco=endereco;
}
public Endereco getEndereco(){

return this.endereco;

}

no DAO:

public void adiciona (InstituicaoBean instituicao) throws SQLException{  
       
     Connection conn = null;  
     PreparedStatement stmt = null;  
     String sql = "INSERT INTO edu_instituicao (instnome, instbairro, instrua, instcep, instnumero, instcomplemento) VALUES (?,?,?,?,?,?)";  
        
         try {  
               
             conn = ConectionManager.getConexao();  
             stmt = conn.prepareStatement(sql);  
               
                   
             stmt.setString(1, instituicao.getNomeInstituicao());  
             stmt.setString(2, instituicao.getEndereco().getBairro());  
             stmt.setString(3, instituicao.getEndereco().getRua());  
             stmt.setString(4, instituicao.getEndereco().getCep());  
             stmt.setString(5, instituicao.getEndereco().getNumero());  
             stmt.setString(6, instituicao.getEndereco().getComplemento());   
                         
             stmt.executeUpdate();  
             stmt.close();  
               
         } catch (Exception e) {  
               
             System.out.println(e);  
         }  
       
     finally{  
       
         ConectionManager.close(conn);  
         System.out.println("fechado");  
           
     }  
          
}

Dentro do seu objeto instituição vc já vai ter seu objeto endereco na ideia de que Instituição tem um endereco.
qndo vc instanciar a instituição vc instancia o endereco e passa ele para o objeto Instituição pelo setEndereco.

Endereco end=new Endereco();
end.setRua(String.valueOf("Rua da olivas"));

//mais sets aqui...

Instituicao inst=new Instituicao();
inst.setEndereco(end);

Espero ter ajudado!!
Fallow

}

bernardlcs

Olá amigo
bom dia

Na sua dúvida, vc fala em Herança mais não está aplicando o conceito.
mudei algumas coisas no seu código segue:

public class Endereco {
	private String bairro;
	private String rua;
	private String cep;
	private String numero;
	private String complemento;

	public String getBairro() {
		return bairro;
	}

	public void setBairro(String bairro) {
		this.bairro = bairro;
	}

	public String getRua() {
		return rua;
	}

	public void setRua(String rua) {
		this.rua = rua;
	}

	public String getCep() {
		return cep;
	}

	public void setCep(String cep) {
		this.cep = cep;
	}

	public String getNumero() {
		return numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}

	public String getComplemento() {
		return complemento;
	}

	public void setComplemento(String complemento) {
		this.complemento = complemento;
	}	
}

''com o “Extends Endereco” vc está aplicando o conceito de Herança, com isso vc não precisa criar variaveis do tipo endereço.

public class InstituicaoBean extends Endereco {	
	
	private int idInstituicao;  
    private String nomeInstituicao;  
    
    public int getIdInstituicao() {  
        return idInstituicao;  
    }  
  
    public void setIdInstituicao(int idInstituicao) {  
        this.idInstituicao = idInstituicao;  
    }  
  
    public String getNomeInstituicao() {  
        return nomeInstituicao;  
    }  
  
    public void setNomeInstituicao(String nomeInstituicao) {  
        this.nomeInstituicao = nomeInstituicao;  
    }  
    
    public InstituicaoBean(String bairro, String rua, String cep, String numero, String complemento,
    		int idInstituicao, String nomeInstituicao) {
    	
    	this.setBairro(bairro);
    	this.setRua(rua);
    	this.setCep(cep);
    	this.setNumero(numero);  
        this.setComplemento(complemento);  
        this.setIdInstituicao(idInstituicao);
        this.setNomeInstituicao(nomeInstituicao);
        
	}
}

’ eu costumo dividir as Consultas, inserções, Exclusões e Atualizações SQL em uma classe. E a Conexão em outra chamada “conexao”

public class InstituicaoDao {
	
	private conexao conexao;
	
	
	public InstituicaoDao() {
		conexao = new conexao();
	}
	
	public void adiciona (InstituicaoBean instituicao) throws SQLException{  
	      
		InstituicaoBean inst = new InstituicaoBean("bairro","rua","cep","numero","complemento",0,"nomeInsti");
	    String sql = "INSERT INTO edu_instituicao (instnome, instbairro, instrua, instcep, instnumero, instcomplemento) " +
	    		"VALUES (" + inst.getNomeInstituicao() + ","+ inst.getBairro() + "," + inst.getRua() + 
	    		"," + inst.getCep() +","+ inst.getNumero() + ","+ inst.getComplemento() + ")"; 
        
	    try {
            conexao.executar(sql);
        }catch (Exception e) {                
            e.printStackTrace();  
        }finally{
	        System.out.println("fechado");  
	    }  
	         
	}  

}
public class conexao {

	Connection con;
	Statement s;
	
	public conexao(){
			try {
			
			String url, usuario, senha;
			url = "jdbc:postgresql://localhost:5432/nome_da_base_de_dados";
			usuario = "postgres";
			senha = "admin";
		      con=null;		      
		      Class.forName("org.postgresql.Driver");
		      con=DriverManager.getConnection(url,usuario,senha);		      
		   } catch(Exception e){
			   e.printStackTrace();
		   }
	}
	
	public String executar(String sql){
		try{				
			s = con.createStatement();		    
		    s.execute(sql);		
		    s.close();			  		    
			return "success";	
		}catch (Exception ee){
			ee.printStackTrace();
			return "failure";
		}
	}
	
}
F

Bom dia Pessoal,

Paulo obrigado pela força, entendi perfeitamente o que vc falou.

Ajudou muito.

Consegui fazer aqui com a força de vocês.

Java é muito bacana cara, vou estudar muito para aprender.

Não sabia que este fórum era tão bom e com pessoas realmente querendo ajudar muito.

Obrigado a todos que me ajudaram.

FELIZZZZ 2011 PESSOAL!

paulo1911

Oi Fabiano Almeida,

Legal que vc tenha entendido,

Estou a disposição, bom 2011 pra vc tb!!

Bons estudos.

Fallow

Criado 2 de janeiro de 2011
Ultima resposta 3 de jan. de 2011
Respostas 9
Participantes 5