Pegando dados do banco de dados MySql

41 respostas
J

Pessoal, tenho ate vergonha de mostrar esse meu codigo, pq to tendo dificuldades demais pra aprender a mexer com isso mas preciso da ajuda de vcs...

Quando eu abrir meu formulario Cad_Cidades, eu quero que o textfield Codigo e Nome sejam preenchidos com os dados da primeira linha da minha tabela "cidades".

public class Cad_Cidades extends javax.swing.JFrame {

    /**
     * Creates new form Cad_Cidades
     */
    public Cad_Cidades() {
        initComponents();
        Conexao con_cidade = new Conexao();
        try {
            PreparedStatement stmt = con_cidade.connection.prepareStatement("select * from cidades");
            ResultSet rs = stmt.executeQuery();
            rs.first();
            tf_codigo.setText(con_cidade.ResultSet.getString("codigo"));
        } catch (Exception e) {
        }

    }
public class Conexao {
	
	public Connection connection;
	
	public Conexao(){
		this.connection = new ConnectionFactory().getConnection();
        }
}
public class ConnectionFactory {

	public Connection getConnection(){
		try {
			return DriverManager.getConnection(
					"jdbc:mysql://localhost/sakila", "root", "1234");
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}

eu nao consigo utilizar o ResultSet.getString. Alguem pode me ajudar?

Obrigado

41 Respostas

rafadelnero

Tente fazer assim:

Conexao con = new Conexao(); try { PreparedStatement stmt = con.prepareStatement("select * from cidades"); ResultSet rs = stmt.executeQuery(); rs.next(); tf_codigo.setText(rs.getString("codigo"));

Talvez resolva.

Mostre a Exception também se não resolver…

E

ResultSet rs = stmt.executeQuery(); rs.first(); tf_codigo.setText(con_cidade.ResultSet.getString("codigo"));

Aqui um clássico exemplo da “programação orientada a magia”.
Para que serve a variável rs que você acabou de preencher com o resultado do executeQuery?
De onde vem esse valor con_cidade.ResultSet?

E a propósito, enquanto você não ler corretamente a documentação do JDBC, evite dentro da medida do possível usar “first” e “last”.
Eles só fazem o que dizem quando se cria o Statement de forma especial (não a padrão). Use sempre “next”.

J

Obrigado rafal agora compilou sem problemas mas o Textfield Codigo e Nome continuam vazios…oq sera q pode ser??

Certo Entanglement, eh q sou novato e vi no tutorial que pra posicionar na primeira linha do db tinha q usar o First…e depois usaria o Next para ir para as proximas linhas…nao entendo mto bem ^^

rafadelnero

jpedr0:
Obrigado rafal agora compilou sem problemas mas o Textfield Codigo e Nome continuam vazios…oq sera q pode ser??

Certo Entanglement, eh q sou novato e vi no tutorial que pra posicionar na primeira linha do db tinha q usar o First…e depois usaria o Next para ir para as proximas linhas…nao entendo mto bem ^^

Tente usar as convenções para programar também, seu código deve ser claro, por exemplo sua variável con_cidade, deveria ter o nome de apenas conexao, pois é uma classe que vai efetuar a conexão com o banco e mais nada.

J

Entendi, pode deixar. Mas vc sabe oq tem de errado que os campos continuam vazios quando compilo?

Ja descobri, tava direcionado a uma base de dados diferente sem perceber…

Obrigado pela ajuda

E

jpedr0:
Obrigado rafal agora compilou sem problemas mas o Textfield Codigo e Nome continuam vazios…oq sera q pode ser??

Certo Entanglement, eh q sou novato e vi no tutorial que pra posicionar na primeira linha do db tinha q usar o First…e depois usaria o Next para ir para as proximas linhas…nao entendo mto bem ^^

Que tutorial é esse? Fiquei curioso. Deve ser alguma daquelas video-aulas que mais atrapalham que ajudam :frowning:

J

Sao as video aulas do Prof. Neri…o problema eh q livros soh dao conceitos, nao acho livro q ensina na pratica o que fazer infelizmente =/

R

Professor Neri é um excelente professor, problema é que voce percebe que ATE HOJE ele programa como se tivesse parado no tempo, nao segue as convencoes e etc… mas a video-aula de hibernate dele é muito boa (em questao de aprendizado na pratica), a unica que assisti, mas gostei.

J

O Hibernate torna esses tipos de tarefas mais fáceis?? Quando eu posso começar a estudar ele? Tem algum pré requisito?

R

Melhor voce aprender Hibernate depois de ter estudado JDBC e bastante sintaxe SQL. Voce pode começar quando quiser uai =D.

J

Eu to tendo problema com a continuação.. =/

public class Cad_Cidades extends javax.swing.JFrame {

    public Cad_Cidades() {
        initComponents();
        Conexao conexao = new Conexao();
        try {
            PreparedStatement stmt = conexao.connection.prepareStatement("select * from cidades");
            ResultSet rs = stmt.executeQuery();
            rs.first();
            tf_codigo.setText(rs.getString("codigo"));
            tf_nome.setText(rs.getString("nome"));
        } catch (Exception e) {
        }

    }

private void botao_proximoActionPerformed(java.awt.event.ActionEvent evt) {
        try {
            Conexao conexao = new Conexao();
            PreparedStatement stmt = conexao.connection.prepareStatement("select * from cidades");
            ResultSet rs = stmt.executeQuery();
            rs.next();
            tf_codigo.setText(rs.getString("codigo"));
            tf_nome.setText(rs.getString("nome"));
        } catch (Exception e) {
        }
    }

Depois de ter feito os TextField nome e codigo receberem o valor da primeira linha do bd, eu queria q fosse pra proxima linha qndo clicasse no botao_proximo. Mas nao ta funcionando qndo clico no botao.. Me desculpem pelas duvidas idiotas pessoal =x

R

Tente fechar o resultSet a cada ação.

public Cad_Cidades() {  
        initComponents();  
        Conexao conexao = new Conexao();  
        try {  
            PreparedStatement stmt = conexao.connection.prepareStatement("select * from cidades");  
            ResultSet rs = stmt.executeQuery();  
            rs.first();  
            tf_codigo.setText(rs.getString("codigo"));  
            tf_nome.setText(rs.getString("nome"));  
            rs.close();
        } catch (Exception e) {  
        }  

private void botao_proximoActionPerformed(java.awt.event.ActionEvent evt) {  
        try {  
            PreparedStatement stmt = conexao.connection.prepareStatement("select * from cidades");  
            ResultSet rs = stmt.executeQuery();  
            rs.next();  
            tf_codigo.setText(rs.getString("codigo"));  
            tf_nome.setText(rs.getString("nome"));  
            rs.close();
        } catch (Exception e) {  
        }  
    }
J

boa, tava esquecendo disso… Mas ainda nada acontece quando clico no botao.

R

faz um debug, e ve se entra no metodo, talvez ate esteja acontecendo, o que ta faltando é voce atualizar o componente onde é mostrado os dados.

J

como atualizo o componente?

R

Fez o debug ? verificou se esta entrando no metodo realmente ?

J

Deixa pra lah entao…eu nao sei usar o debugger T-T kkkkkk

R

é facil, vai no google que c acha, agora deixa eu resolver umas broncas aqui, boa sorte =D

J

Pelo que vi ta entrando no metodo sim…alguem tem ideia do pq nao ta mudando os valores dos TextFields??

R

Aeeeee, conseguiu o debug ne =D

Entao se voce olhar BEMMMMM diretinho, voce vai ver que nos seus 2 metodos voce ta executando o MESMO SELECT, logo, o resultado vai ser o mesmo e nunca vai mudar nada =D

public Cad_Cidades() {    
        initComponents();    
        Conexao conexao = new Conexao();    
        try {    
            PreparedStatement stmt = conexao.connection.prepareStatement("select * from cidades");    
            ResultSet rs = stmt.executeQuery();    
            rs.first();    
            tf_codigo.setText(rs.getString("codigo"));    
            tf_nome.setText(rs.getString("nome"));    
            rs.close();  
        } catch (Exception e) {    
        }    
  
private void botao_proximoActionPerformed(java.awt.event.ActionEvent evt) {    
        try {    
            PreparedStatement stmt = conexao.connection.prepareStatement("select * from cidades");    
            ResultSet rs = stmt.executeQuery();    
            rs.next();    
            tf_codigo.setText(rs.getString("codigo"));    
            tf_nome.setText(rs.getString("nome"));    
            rs.close();  
        } catch (Exception e) {    
        }    
    }

Nas video-aulas do prof neri de hibernate ele ensina como fazer uma coisa desse tipo ae, ja te adianto, mete todo esse select num List, e depois nas acoes do botao proximo, nem precisa voce ficar fazendo consulta ao banco, basta iterar a List 8)

J

Vixi daii ta exigindo demais da minha sabedoria Rof20004 hahahah

Pior que eu troquei o rs.next(); por rs.last(); e apareceu a ultima linha do meu bd corretamente… pq sera q o Next nao vai? =//

R

Porque o .next é uma iteracao, experimente colocar ele dentro de um while(rs.next()) {} e faça o debug pra voce ver como ta vindo tudo.

R

Isso e trabalho de escola ?

J

nao, soh to estudando e tentando aprender…pq provavelmente vo precisar disso pra meu tcc daqui um tempo. =/

R

hummm, entao vou tentar escrever algum codigo pra voce, nao gosto de ficar dando codigo de mao beijada, geralmente o pessoal ta fazendo trabalho de escola e tal, antes nem ligava pra isso, mas depois vi que tem muito nego abusado, dai começou a me irritar. Tenso…

Posta ae suas classes, e se der, o seu projeto tb, porque acho que o problema nao e so ai nesses 2 metodos nao.

J

Entendo vc parceiro =) eu cheguei da faculdade agora, vou tentar melhorar um pouco, deixar com mais cara de Orientado a objeto pra ver se funciona. Caso nao consiga te peço ajuda xD

J

Ae pessoal, to seguindo em frente com meu programinha e achando mais obstaculos =)...

Agora eu quero inserir dados no banco de dados e meu codigo parece estar certinho, o unico problema eh que tento acessar os TextFields que estao na classe Cad_Cidades pela classe Conexao mas o eclipse acusa que os TextFields sao de acesso privado. Alguem sabe como posso resolver isso?

public void adiciona(){
            String sql = "insert into contatos (id,nome,uf) values (?,?,?,?)";
            try {
                 PreparedStatement stmt = connection.prepareStatement(sql);
                 stmt.setString(1, Cad_Cidades.tf_codigo.getText());
                 stmt.setString(2, Cad_Cidades.tf_nome.getText());
                 stmt.setObject(3, Cad_Cidades.cb_uf.getSelectedItem());
                 stmt.execute();
                 stmt.close();
                 
            } catch (Exception e) {
            }
        }

Obrigado!

rafadelnero

jpedr0, aconselho também você usar a apostila da Caelum FJ-11, e também se quiser tem as vídeo-aulas da universidade XTI.

J

eu ja li essa apostila e to estudando a FJ-21 atualmente… Em nenhum lugar da apostila fala sobre mexer em interface grafica ou sobre como tirar o acesso “private” dos Textfields =) como q faço isso??? por favor

R

Coloca public antes de declara-los.

Ex.:

public JTextField textField = new JTextField();
B

Isto aqui deve te ajudar:

Primeiro crie uma classe Contato contendo Id, Nome e UF, e seus gets e sets.

Classe ContadoDAO:
public void adiciona(Contato contato){

            String sql = "insert into contatos (id,nome,uf) values (?,?,?)";
            try {
                 PreparedStatement stmt = connection.prepareStatement(sql);
                 stmt.setString(1, contato.getId());
                 stmt.setString(2, contato.getNome());
                 stmt.setString(3, contato.getUf());
                 stmt.execute();
                 stmt.close();
                 
            } catch (Exception e) {
            }
        }

Classe onde fica o teu código de Desktop, com os botões, actions, etc

O clicar o botão Adicionar, chame este método:
public void actionAdicionarContatoNaBase() {

  Contato contato = new Contato();

  // aqui você troca meuId pelo lugar de onde está pegando o id, e etc
  contato.setId(meuId);
  contato.setNome(meuNome);
  contato.setNome(minhaUF);

  ContatoDAO dao = new ContadoDAO();
  dao.adiciona(contato);
}

Depois mova todo o teu código de SQL e conexão com banco para esse ContadoDAO.

J

O problema eh q to usando o NetBeans…e essas declarações vêm bloqueadas…não dah pra editar. Tem como ?

R

Tem sim

Clica botao direito do mouse em cima do componente, e clica em Edit source code ou em portugues “Personalizar codigo”

R

La em baixo tem como voce mudar o modificador do componente, simples. Flw.

J

Vlw, consegui mudar o modificador de acesso mas continuou dando uns erros loucos, dai eu pensei numa outra alternativa que aparentemente está correta, mas os dados não tão sendo gravados e nem a mensagem de "gravado com sucesso" ta aparecendo =/

//CLASSE Cad_Cidades!
        private void botao_gravarActionPerformed(java.awt.event.ActionEvent evt) {                                              
        String codigo = tf_codigo.getText();
        String nome = tf_nome.getText();
        Object uf = cb_uf.getSelectedItem();
        conexao.adiciona(codigo, nome, uf);
    }
//CLASSE Conexao!
            public void adiciona(String codigo, String nome, Object uf){
            String sql = "insert into contatos (id,nome,uf) values (?,?,?,?)";
            try {
                 PreparedStatement stmt = connection.prepareStatement(sql);
                 stmt.setString(1, codigo);
                 stmt.setString(2, nome);
                 stmt.setObject(3, uf);
                 stmt.execute();
                 stmt.close();
                 JOptionPane.showMessageDialog(null, "Gravado com sucesso");
                 
            } catch (Exception e) {
            }
        }
B

Nesse exception, coloca alguma coisa para imprimir o erro.

E também da uma olhado no teu SQL, tá com 4 ?, mas somente 3 parâmetros.

J

Obrigado Bruno! Nao tinha reparado no erro na SQL e eh bem melhor deixar pra imprimir o erro…

Agora ta gravando com sucesso mas eu tenho q fechar e abrir o programa pra aparecer a nova cidade gravada. Eu teria que executar um “select * from cidades;” toda hora q eu gravar??

B

Depois de chamar o adiciona, adicione uma nova linha na tua JTable com os dados que você acabou de colocar.

Tente também adicionar um botão Atualizar, para ele fazer o select novamente e atualizar a tua tabela.

J

public void adiciona(String codigo, String nome, Object uf){ String sql = "insert into cidades (codigo,nome,uf) values (?,?,?)"; try { PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, codigo); stmt.setString(2, nome); stmt.setObject(3, uf); stmt.execute(); stmt.close(); JOptionPane.showMessageDialog(null, "Gravado com sucesso"); stmt = connection.prepareStatement("select * from cidades"); rs.first(); } catch (Exception e) { System.out.println(e); } }

private void botao_gravarActionPerformed(java.awt.event.ActionEvent evt) { String codigo = tf_codigo.getText(); String nome = tf_nome.getText(); Object uf = cb_uf.getSelectedItem(); conexao.adiciona(codigo, nome, uf); mostrar_dados(); }

public void mostrar_dados(){ try { tf_codigo.setText(conexao.rs.getString("codigo")); tf_nome.setText(conexao.rs.getString("nome")); cb_uf.setSelectedItem(conexao.rs.getString("uf")); } catch (Exception e) { } }

To gravando e logo depois atualizo com o “select * from cidades” o aplicativo volta pra primeira linha mas msmo assim a ultima linha que acabei de adicionar não aparece. Tem idéia do pq?? Soh fechando e abrindo o programa msmo pra aparecer…

(Gostaria de conseguir fazer sem adicionar um botao Atualizar.)

B
public void adiciona(String codigo, String nome, Object uf){
            String sql = "insert into cidades (codigo,nome,uf) values (?,?,?)";
            try {
                 PreparedStatement stmt = connection.prepareStatement(sql);
                 stmt.setString(1, codigo);
                 stmt.setString(2, nome);
                 stmt.setObject(3, uf);
                 stmt.execute();
                 stmt.close();
                 connection.commit(); // commit das alterações
                 JOptionPane.showMessageDialog(null, "Gravado com sucesso");
            } catch (Exception e) {
                System.out.println(e);
            }
        }
public List<Contato> listarTodos(){

            PreparedStatement stmt = connection.prepareStatement("select * from cidades");
            ResultSet rs = stmt.executeQuery();

            ArrayList<Contato> lista = new ArrayList<Contato>();

            while(rs.next()) {

                 Contato contato = new Contato();
                 contato.setCodigo(rs.getString("codigo"));
                 contato.setNome(rs.getString("nome"));
                 contato.setUf(rs.getObject("uf"));

                 // coleta todas as linhas retornadas em uma lista
                 lista.add(contato);
            }
            return lista;
             
        }
public  mostrar_dados(){
        
    List<Contato> lista = conexao.listarTodos();

    for (Contato contato : lista) {

         // preenche algum lugar com o contato
         adicionaLinhaEmAlgumaTabela(contato);
    }

}
private void botao_gravarActionPerformed(java.awt.event.ActionEvent evt) {                                              
        String codigo = tf_codigo.getText();
        String nome = tf_nome.getText();
        Object uf = cb_uf.getSelectedItem();
        conexao.adiciona(codigo, nome, uf);
        mostrar_dados();
    }
J

Obrigadao pela ajuda Bruno, mas nao consegui… tive que utilizar um botao “atualizar” mesmo =/

Criado 18 de fevereiro de 2013
Ultima resposta 19 de fev. de 2013
Respostas 41
Participantes 5