Pessoal,
Gostaria de saber o motivo pelo qual na minha classe TestaListaDAO cujo código está abaixo :
package br.com.caelum.jdbc.dao;
import java.sql.SQLException;
import java.util.List;
import br.com.caelum.jdbc.dao.ContatoDAO;
import br.com.caelum.jdbc.modelo.Contato;
public class TestaListaDAO {
public static void main(String[] args) throws SQLException {
ContatoDAO dao = new ContatoDAO();
List<Contato> contatos = dao.getLista();
for (Contato contato : contatos) {
System.out.println("Id : " + contato.getId() );
System.out.println("Nome : " + contato.getNome());
System.out.println("Email : " + contato.getEmail());
System.out.println("Endereço: " + contato.getEndereco() + "\n");
}
}
}
É sempre exibo “0” para o campo ID do Contato.
Conectando ao banco
Id : 0
Nome : Caelum
Email : contato@caelum.com.br
Endereço: R. Vergueiro 3185 cj57
Id : 0
Nome : Luiz Henrique
Email : luiznenhique@meuprovedor.com.br
Endereço: Av. Das Nações, 342
Id : 0
Nome : joão carlos
Email : jcarlos@minhaempresa.com.br
Endereço: Av. Brasília, 381
Na minha base MySQL os valores gravados na tabela são 4,5 e 6.
Esse campo é um auto-incremento, mas as linhas acima só exibem “0” para todos os objetos.
Por quê isto está acontecendo ? Como resolver este probleminha ?
Agradece,
Max
Coloque o código da classe Contato e ContatoDAO também.
Como o Joao.Gabriel disse, você precisa postar as outras classes, pois essa parte do código que foi postada, pra mim não tem erros.
Talvez o incremento zere cada vem que você chama não sei. Posta ae ^^
Pessoal,
Segue, abaixo, o código-fonte da classe Contato
/**
*
*/
package br.com.caelum.jdbc.modelo;
/**
* @author Max Carvalho
*
*/
public class Contato {
private Long id;
private String nome;
private String endereco;
private String email;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getEndereco() {
return endereco;
}
public void setEndereco(String endereco) {
this.endereco = endereco;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
E logo abaixo, o da classe ContatoDAO
[code]/**
*
*/
package br.com.caelum.jdbc.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import br.com.caelum.jdbc.ConnectionFactory;
import br.com.caelum.jdbc.modelo.Contato;
/**
*/
public class ContatoDAO {
// a conexão com o banco de dados
private Connection connection;
public ContatoDAO() throws SQLException {
this.connection = ConnectionFactory.getConnection();
}
public void adiciona(Contato contato) throws SQLException {
// prepared statement para inserção
String sql = "insert into contatos (nome,email,endereco) values (?,?,?)";
PreparedStatement stmt = connection.prepareStatement(sql);
// seta os valores
stmt.setString(1,contato.getNome());
stmt.setString(2,contato.getEmail());
stmt.setString(3,contato.getEndereco());
// executa
stmt.execute();
stmt.close();
}
}
[/code]
Espero que consigam me ajudar.
Agradece,
Max
Faltou tu postares o método getLista do DAO.
Pessoal,
Me desculpem, mas a versão da classe ContatoDAO que tenho no Eclipse aqui no trabalho está desatualizada.
Como eu tenho mexido nela aqui e em casa, terminou acontecendo este lance de falta de um controle melhor de versão.
Até amanhã estarei postando a versão completa.
De qq forma, já agraço-lhes pela enorme atenção.
[]'s
Max
Pessoal,
Conforme solicitado, segue, abaixdo, o código completo da classe ContatoDAO, incluindo o método getLista().
/**
* classe ContatoDAO
*/
package br.com.caelum.jdbc.dao;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
import java.util.ArrayList;
import br.com.caelum.jdbc.modelo.Contato;
import br.com.caelum.jdbc.ConnectionFactory;
/**
* @author Max Carvalho
*
*/
public class ContatoDAO {
// conexao com o banco de dados
private Connection connection;
public ContatoDAO() throws SQLException {
this.connection = ConnectionFactory.getConnection();
}
public void adiciona(Contato contato) throws SQLException {
// prepared statement para insercao
String sql = "insert into contatos(nome,email,endereco) values (?,?,?)";
PreparedStatement stmt = connection.prepareStatement(sql);
// set os valores
stmt.setString(1, contato.getNome() );
stmt.setString(2, contato.getEmail());
stmt.setString(3, contato.getEndereco() );
//executa
stmt.execute();
stmt.close();
}
public List<Contato> getLista() throws SQLException {
PreparedStatement stmt = this.connection.prepareStatement("select * from contatos");
ResultSet rs = stmt.executeQuery();
List<Contato> contatos = new ArrayList<Contato>();
while (rs.next()) {
// criando o objeto Contato
Contato contato = new Contato();
contato.setNome(rs.getString("nome"));
contato.setEmail(rs.getString("email"));
contato.setEndereco(rs.getString("endereco"));
// adicionando o objeto à lista
contatos.add(contato);
}
rs.close();
stmt.close();
return contatos;
}
public Contato pesquisar(int idContato) throws SQLException {
String sql = "select * from contatos where id = ?";
PreparedStatement stmt = this.connection.prepareStatement(sql);
stmt.setInt(1,idContato);
ResultSet rs = stmt.executeQuery();
// se o contato não existir retorna null
Contato contato = null;
while (rs.next()) {
// criando o objeto Contato
contato = new Contato();
contato.setNome( rs.getString("nome") );
contato.setEmail( rs.getString("email") );
contato.setEndereco( rs.getString("endereco") );
}
rs.close();
stmt.close();
return contato;
}
}
Agradece,
Max
O atributo ID está sempre zerado porque tu não estás alimentando-o.
Tens de alterar o loop no getLista, ficando mais ou menos assim:
Contato contato = new Contato();
contato.setId(rs.getInt("id")); // <<<<<
contato.setNome(rs.getString("nome"));
contato.setEmail(rs.getString("email"));
contato.setEndereco(rs.getString("endereco"));
Yky,
Não pensei que isto foste necessário, porque o campo correspondente na tabela em MySQL é um auto-incremento, daí pensei que o Resulset já pegasse o valor dele automaticamente da forma como está no banco.
Quer dizer que mesmo o campo sendo auto-incremento, eu preciso atualizar o estado do objeto a cada passagem do “cursor” resulset ?
Mesmo assim, muito obrigado pela dica.
[]'s
Max
Sim, tu precisas atualizar o estado do objeto.
O teu Bean não tem nenhuma relação com a tua tabela no banco de dados.
Uma questão diferente que responde a sua.
O objeto Contato vai saber seu próprio id apenas setando os outros campos?
Entendido.
Obrigado pessoal.
Valeu mesmo, aí pela ajuda.
Infelzimente, continua dando o mesmo erro cloquei assim :
...
while (rs.next()) {
// criando o objeto Contato
Contato contato = new Contato();
contato.setId(rs.getLong("id")); // <<<<<
contato.setNome(rs.getString("nome"));
contato.setEmail(rs.getString("email"));
contato.setEndereco(rs.getString("endereco"));
// adicionando o objeto à lista
contatos.add(contato);
}
...
Uma vez que :
...
public class Contato {
// atributos
private long id;
private String nome;
private String email;
private String endereco;
}
...
Aliás,
Deu certo sim. Desculpem o engano.
Segue, abaixo, a versão final classe ContatoDAO :
package br.com.caelum.jdbc.dao;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
import java.util.ArrayList;
import br.com.caelum.jdbc.modelo.Contato;
import br.com.caelum.jdbc.ConnectionFactory;
public class ContatoDAO {
private Connection connection;
public ContatoDAO() throws SQLException {
this.connection = ConnectionFactory.getConnection();
}
public void adiciona(Contato contato) throws SQLException {
String sql = "insert into contatos(nome,email,endereco) values (?,?,?)";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, contato.getNome() );
stmt.setString(2, contato.getEmail());
stmt.setString(3, contato.getEndereco() );
stmt.execute();
stmt.close();
}
public List<Contato> getLista() throws SQLException {
PreparedStatement stmt = this.connection.prepareStatement("select * from contatos");
ResultSet rs = stmt.executeQuery();
List<Contato> contatos = new ArrayList<Contato>();
while (rs.next()) {
Contato contato = new Contato();
contato.setId(rs.getLong("id")); // <<<<<
contato.setNome(rs.getString("nome"));
contato.setEmail(rs.getString("email"));
contato.setEndereco(rs.getString("endereco"));
contatos.add(contato);
}
rs.close();
stmt.close();
return contatos;
}
public Contato pesquisar(int idContato) throws SQLException {
String sql = "select * from contatos where id = ?";
PreparedStatement stmt = this.connection.prepareStatement(sql);
stmt.setInt(1,idContato);
ResultSet rs = stmt.executeQuery();
// se o contato não existir retorna null
Contato contato = null;
while (rs.next()) {
contato = new Contato();
contato.setId( rs.getLong("id"));
contato.setNome( rs.getString("nome") );
contato.setEmail( rs.getString("email") );
contato.setEndereco( rs.getString("endereco") );
}
rs.close();
stmt.close();
return contato;
}
public void altera(Contato contato) throws SQLException {
PreparedStatement stmt = connection.prepareStatement("update " +
"contatos set nome=?, email=?, endereco=? where id=?");
stmt.setString(1, contato.getNome());
stmt.setString(2, contato.getEmail());
stmt.setString(3, contato.getEndereco());
stmt.setLong(4, contato.getId());
stmt.execute();
stmt.close();
}
public void remove(Contato contato) throws SQLException {
PreparedStatement stmt = connection.prepareStatement("delete from contatos where id=?");
stmt.setLong(1, contato.getId());
stmt.execute();
stmt.close();
}
}
E da classe TestaListaDAO :
package br.com.caelum.jdbc.dao;
import java.sql.SQLException;
import java.util.List;
import br.com.caelum.jdbc.dao.ContatoDAO;
import br.com.caelum.jdbc.modelo.Contato;
public class TestaListaDAO {
public static void main(String[] args) throws SQLException {
ContatoDAO dao = new ContatoDAO();
List<Contato> contatos = dao.getLista();
for (Contato contato : contatos) {
System.out.println("Id : " + contato.getId() );
System.out.println("Nome : " + contato.getNome());
System.out.println("Email : " + contato.getEmail());
System.out.println("Endereço: " + contato.getEndereco() + "\n");
}
Contato novoContato;
novoContato = dao.pesquisar(4);
if ( novoContato != null ) {
System.out.println( "Id : " + novoContato.getId() ) ;
System.out.println( "Nome : " + novoContato.getNome() ) ;
System.out.println( "Email : " + novoContato.getEmail() ) ;
System.out.println( "Endereço: " + novoContato.getEndereco() + "\n");
} else {
System.out.println("Contato não encontrado");
}
}
}
Ainda vou melhor o código dos métodos altera()e remove() para não executarem suas funcionalidades de o contato não existir.
Muito obrigado a todos.
Valeu aí pela ajuda.
[ ]'s Max.