DAO do JAdressBook dor jairelton

2 respostas
J

Amigos,Não entendi muito bem o relacionamento de um método que to estudando da JAdressBook que baixei no jairelton.com… segue a baixo o código… quem puder me dar uma dica de como ele funciona e como se relaciona com os métodos que seguem ficarei grato…

Classe DAO

<blockquote>

protected Object fill(Class clazz, Map<String, String> mapping, ResultSet res) throws DAOException{

Object obj = null;

try{

obj = clazz.newInstance();
for(String field: mapping.keySet()){
			Object value = res.getObject(field);
			String attribute = mapping.get(field);
			attribute = attribute.substring(0, 1).toUpperCase()+attribute.substring(1);
			String setterName = "set"+attribute;

			Method[] methods = clazz.getMethods();
			Method setter = null;

			for(Method m:methods){
				if(setterName.equals(m.getName())){
					setter = m;
					break;
				}
			}

			if(setter==null){
				throw new DAOException("Can't find setter for attribute '"+attribute+"'");
			}
			
			setter.invoke(obj, new Object[]{value});
		}
		
	}catch(Exception e){
		throw new DAOException(e.getMessage(), e);
	}
	return obj;
}</blockquote>

Ele se relaciona com os seguinte métodos da classe UserDAO

<blockquote>

public List<User> retrieveAll() throws DAOException{

List<User> all = new ArrayList<User>();

PreparedStatement stmt = null;

ResultSet res = null;

try{

stmt = DAO.getConnection().prepareStatement(select * from users);

res = stmt.executeQuery();
while(res.next()){    // AKÍ ESTÁ ELE, NÃO ENTENDI ISSO.
			all.add(fill(res));
		}
	}catch(SQLException sqle){
		throw new DAOException(sqle.getMessage(), sqle);
	}finally{
		try{
			res.close();
			stmt.close();
		}catch(SQLException sqle){
			throw new DAOException(sqle.getMessage(), sqle);
		}
	}
	
	return all;
}</blockquote>

E tb se relaciona com esse outro fill tb da classe UserDAO

<blockquote>

private User fill(ResultSet res) throws DAOException{		

Map<String, String> mapping = new HashMap<String, String>();

mapping.put(id, id);

mapping.put(name, name);

mapping.put(login, login);

mapping.put(password, password);
return (User)super.fill(User.class, mapping, res);
}</blockquote>

É que eu to estudando classes DAO e gostaria de entender melhor esse relacionamento… Sei que tem haver com mapeamento… e confesso ainda não ter entendido muito bem essa parte, quem sabe se alguem me explicar eu possa compreender melhor esses detalhes…
Abraço.

2 Respostas

J

Na realidade, pra eu não ter que fazer algo assim:

while&#40;res.next&#40;&#41;&#41;&#123;
   User usu = new User&#40;&#41;;
   usu.setId&#40;res.getInt&#40;&quot;id&quot;&#41;&#41;;
   usu.setName&#40;res.getString&#40;&quot;name&quot;&#41;&#41;;
   usu.setLogin&#40;res.getString&#40;&quot;login&quot;&#41;&#41;;
   usu.setPassword&#40;res.getString&#40;&quot;password&quot;&#41;&#41;;

   all.add&#40;usu&#41;;   
&#125;

Sendo que essa parte onde eu pego os valores do ResultSet e crio o objeto eu tenho em varios lugares, eu criei um metodo que faz isso, ele recebe um ResultSet, e cria um objeto com os dados do registro corrente.

O primeiro metodo fill() recebe a classe que será mapeada, e os nomes dos campos e atributos a serem mapeados, já o segundo é só uma simplificação do primeiro, ele já sabe internamente qual classe será mapeada e o Map com os parametros do mapeamento, assim quando você chama o fill(ResultSet) ele chama o outro fill() passando a classe a ser mapeada, e o Map com os parametros, e te retorna um objeto com os dados do registro corrente do ResultSet.

J

Muito obrigado amigo jairelton, tu nem imaginas o quanto tens me ensinado, não só com as resposatas as minhas duvidas aqui no pj mas tb com os tutoriais e materiais do teu, são realmente todos muito bons e indico www.jairelnton.com (vale a pena conferir pessoal).

Cara, entendi agora o sentido desse fill, realmente limpa bem o código e promove a reutilização legal mesmo… Vou agora da uma estuda mais profunda nele prafazer sempre assim… Só mais uma coisa, pq tu não implementou os métodos delete?

Abraço irmão.

Criado 14 de novembro de 2006
Ultima resposta 14 de nov. de 2006
Respostas 2
Participantes 2