Iterator objeto

6 respostas
castiel

Bom dia\tarde\noite.
pessoal estou desenvolvendo um DAO para JDBC genérico. Essa é a minha classe Pessoas:

public class Pessoas {
	
	private int iPessoas;
	private int dv;
	private String nome;
	private String nomeFantasia;
	private String tipoPessoa;
	private String ddd;
	private String telefone;
	private String fax;
	private String dddCel;
	private String celular;
	private String inscricaoMunicipal;
	private String email;
	private int codUnificacao;
	
//GETTERS AND SETTERS ...
//...	
	public Object[] iterator() {
		Object[] obj = {getiPessoas(), getDv(), getNome(), getNomeFantasia(),
				getTipoPessoa(), getDdd(), getTelefone(), getFax(), getDddCel(),
				getCelular(), getInscricaoMunicipal(), getEmail(), getCodUnificacao()};
		return obj;
	}
}

Esse método iterator. Está certo? Pois estou usando ele para settar os campos no PreparedStatement:

public class PessoasDAO {
	
	private Connection connection = null;
	private PreparedStatement pStatement = null;
	
	public void insert(Pessoas pessoa) throws SQLException {
		String sql = "Insert into pessoas " +
				"values (?,?,?,?,?,?,?,?,?,?,?,?,?)";
		connection = SyBaseConnectionFactory.getConnection();
		pStatement = connection.prepareStatement(sql);
		System.out.println(pessoa.toString());
		int i = 0;
                //aqui chamo o iterator
		for(Object obj : pessoa.iterator()){
			i++;
			System.out.println(obj);
			if(obj != null)
				pStatement.setObject(i, obj);
			else
				pStatement.setObject(i, "");
		}
		pStatement.execute();
		pStatement.close();
		connection.close();		
	}

}

Devo usar esse método iterator(), ou tem algum jeito de eu iterar pela minha classe pessoa para pegar os dados de cada variável? Por que se não terei que criar um método iterator para todas as minhas classes.
Grato.

6 Respostas

nel

Já pensou em algo como foreach? Tenho certeza que vai facilitar e muito a sua vida.
Só um detalhe, você está fazendo um Insert, caso queira pegar os valores do banco faça um Select.

Um exemplo simples de foreach.
//supondo que o método getAllPessoas() retorne uma lista de objetos Pessoas
List<Pessoas> list = getAllPessoas();

for(Pessoas pessoa: list){
      pessoa.getiPessoas();
      //e assim sucessivamente
}

Abraços

castiel

nel, no caso seria um forEach estou até usando ele, falou sobre o meu método iterator(), não quero usar ele, pois se não eu vou ter que colocar ele em todas as minhas classes exemplo:(Pessoas, Produtos, Cidades), entendeu, vou ter que ter um método para iterar todos os meus getters em cada classe, estou desenvolvendo para ser algo genérico um método no meu dao genérico, para eu passar apenas no “insert into” do sql, e não se preocupar com o settar o PreparedStatement. Estou pesquisando sobre reflection, acho que o certo será eu usar o reflection para iterar os meu getters. Tem alguma outra idéia?
Grato.

nel

Boa tarde.

Não compreendi bem a sua explicação, veja se é isso: você quer um método que simplesmente retorne o seu objeto já preenchido com os atributos correspondentes a ele, é isso? :?:

nel

Cara, acho que entendi mais ou menos o que você quer. Você quer simplesmente enviar um objeto com os seus atributos já preenchidos e setar esse Objeto no seu statement de forma que ele já “set” os respectivos valores no seu Insert, é isso?

castiel

Consegui faze-lo a pouco:

public void insert(Pessoas pessoa) throws SQLException,
			ClassNotFoundException, IllegalArgumentException,
			IllegalAccessException, InvocationTargetException {
		String sql = "INSERT INTO pessoas VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)";
		connection = SyBaseConnectionFactory.getConnection();
		pStatement = connection.prepareStatement(sql);
		// reflection
		Class<?> clazz = pessoa.getClass();
		Method methods[] = clazz.getDeclaredMethods();
		int i = 0;
		for (Method method : methods) {
			if (method.getName().toString().substring(0, 3).contains("get")) {
				i++;
				System.out.println(i);
				Object arglist[] = new Object[0];
				if (method.invoke(pessoa, arglist) != null)
					pStatement.setObject(i, method.invoke(pessoa, arglist));
				else
					pStatement.setNull(i, 1);
			}
		}
		System.out.println();
		pStatement.execute();
		connection.commit();
		pStatement.close();
		connection.close();
	}

O que acha do método? Meu proximo passo é fazer um DAO genérico para todos os meus outros DAOs.

castiel

Esqueci de mencionar. Com o reflection eu elimino o método iterator, da classe Pessoa.

Criado 14 de outubro de 2009
Ultima resposta 15 de out. de 2009
Respostas 6
Participantes 2