Loop de Banco de dados sempre adiciona o mesmo valor do objeto

3 respostas
K
Ola pessoal eu tenho o seguinte metodo
public List<Email> getEmailPorParametro(int pessoaId, int emailId)throws Exception {
		Connection conn  = null;
		ResultSet rs = null;
		String sql = BUSCA_POR_PARAMETRO;
		List<Email> listaEmail = new ArrayList<Email>();
		
        try {
			conn = GerenciadorConexao.getConexao();
			CallableStatement clblStmt = conn.prepareCall(sql);   
			clblStmt.setInt(1,pessoaId);
			clblStmt.setInt(2,emailId);			

			rs = clblStmt.executeQuery();
			while (rs.next()) {
				Email email = new Email();				
				email.setId(rs.getInt("EmailID"));
				email.setDescr(rs.getString("EmailDescr"));
				email.setTipoId(email.getTipoId().getContatoTipoPorId(rs.getString("EmailContatoTipoID")));
				listaEmail.add(email);
            }
		} catch (Exception e) {
				throw new Exception(e);
		}
		return listaEmail;
	}
ate ai, esse codigo funciona normal, da forma que tem que ser, porem, eu pensei em criar o objeto email antes do loop ao invez de criar toda vez que rodar o loop (acho que assim consome menos memoria do servidor, estou correto?), para assim, nao ficar criando o objeto toda hora, entao fiz dessa maneira
public List<Email> getEmailPorParametro(int pessoaId, int emailId)throws Exception {
		Connection conn  = null;
		ResultSet rs = null;
		String sql = BUSCA_POR_PARAMETRO;
		List<Email> listaEmail = new ArrayList<Email>();
		Email email = new Email();				
		
        try {
			conn = GerenciadorConexao.getConexao();
			CallableStatement clblStmt = conn.prepareCall(sql);   
			clblStmt.setInt(1,pessoaId);
			clblStmt.setInt(2,emailId);			

			rs = clblStmt.executeQuery();
			while (rs.next()) {
				email.setId(rs.getInt("EmailID"));
				email.setDescr(rs.getString("EmailDescr"));
				email.setTipoId(email.getTipoId().getContatoTipoPorId(rs.getString("EmailContatoTipoID")));
				listaEmail.add(email);
            }
		} catch (Exception e) {
				throw new Exception(e);
		}
		return listaEmail;
	}

porem, dessa forma ele me retorna o numero certo de linhas que vem do banco, mas tudo igual(sempre o ultimo registro), fazendo essa alteracao ele nao deveria adicionar o valor ao "listaEmail" e quando voltar ao loop sobre-escrever os valores e adicionar o valor novo?
é isso mesmo ou fiz algo errado?

abs
T+

3 Respostas

rafaelglauber

É assim mesmo…você criou uma “variável” email e preencheu todo seu arraylist com ela, ou seja, toda hora que você carrega o próximo registro você tá atualizando sua variável que vai ser adicionada novamente ao array…no caso fica o último registro mesmo, pois ele é o último a atualizar email. No fim você tem um array da mesma coisa.

alves.Felipe

ola…

então… se deixar o objeto instanciado fora do while, ele sempre vai sobrescrever os valores qdo passa no while…mas do mesmo objeto…
por exemplo: o rs tem 10 registros… ele vai correr 10 vezes o while, e vai sobrescrever seu objeto email todas as vezes…
pq qdo vc cria um objeto, vc pega uma referencia apenas… e como vc criou apenas um… ele vai alterar apenas este 1 objeto criado…
Esta certo fazer como estava antes… mas vc pode fazer assim

Email email=null;

while(rs.next())

{

email=new Email();

()

}

entendeu??
K

alves.Felipe:
ola…

então… se deixar o objeto instanciado fora do while, ele sempre vai sobrescrever os valores qdo passa no while…mas do mesmo objeto…
por exemplo: o rs tem 10 registros… ele vai correr 10 vezes o while, e vai sobrescrever seu objeto email todas as vezes…
pq qdo vc cria um objeto, vc pega uma referencia apenas… e como vc criou apenas um… ele vai alterar apenas este 1 objeto criado…
Esta certo fazer como estava antes… mas vc pode fazer assim

Email email=null;

while(rs.next())

{

email=new Email();

()

}

entendeu??

</blockquote>

blz

fazer da forma como vc falou, em questao de performance, da no mesmo ou nao?
qual teria um desempenho melhor?(tudo bem que nesse caso é insigficante, porem, eu tenho um retorno de pessoas, e esse pode me retornar ate 100 registros)

abs

obrigado

Criado 6 de maio de 2008
Ultima resposta 7 de mai. de 2008
Respostas 3
Participantes 3