Boa tarde pessoal.
Estou criando um DAO genérico, onde a partir dele realizarei as transações de persistência com o Oracle. Comecei pelo método que fará o select na base de dados.
Estou fazendo uma aplicação simples para gerenciar uma agenda. Porém estou utilizando design patterns. Todas as minhas classes que realizarem busca na base de dados herdarão a minha classe genérica DAO.
Minha idéia:
- Executo um select simples (select * from tabela where (1=1)), através de um preparedstatement e o resultado seto em um resultset.
- Do resultset criado executo o método getMetaData() setando no ResultSetMetaData.
- Através ResultSetMetaData pego o nome da classe(getColumnClassName) da coluna “ID” que me retorna como java.math.BigDecimal.
- Então crio a classe teste( Class.forName( java.math.BigDecimal ) ), aqui começa o meu problema, pois não consigo criar um objeto (teste.newInstance()) do tipo BigDecimal. Preciso criar esse objeto para trabalhar com reflection na chamada do meu método “set” passando o parametro do tipo BigDecimal, seta o valor no atributo id da minha classe contato.
Outro problema, não quero utilizar esse metódo somente para o tipo BigDecimal, mas para todas as colunas da minha tabela (String, Date, …).
Por favor, me ajudem!
Utilizo o JDK 1.6 Update 17.
// Trecho do método de select - Classe DAO Select
Class ClasseAtributo;
Object ObjAtributo;
Object ArgList[] = new Object[1];
String NomeMetodo;
Method Metodo;
PreparedStatement pst = getConexao().prepareStatement( "SELECT * FROM CONTATOS WHERE (1=1)" );
rs = pst.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
while(rs.next()){
for(int i=1;i <= rsmd.getColumnCount();i++){
ClasseAtributo= Class.forName( rsmd.getColumnClassName(i) );
ObjAtributo = ClasseAtributo.newInstance(); // Linha Problema
ObjAtributo = rs.getObject(i);
ArgList[0] = ObjAtributo;
MetodoName = "set" + rsmd.getColumnName(i).trim();
Metodo = classe.getMethod( MetodoName, ClasseAtributo );
Metodo.invoke(ClasseAtributo, ArgList);
}
}
//método a ser invacado - Classe Contatos
public void setId_Contato( BigDecimal Id_Contato ){
this.Id_Contato = Id_Contato;
}
Obrigado.