Newsgroup: it.comp.java
Titolo: [long] & [niubbo] vettore di ResultSet e affini

ciao a tutti
tempo fa un ragazzo chiese come infilare i dati presi da un database dentro 
un array di record..
gli era stato risposto di creare una classe che rappresentasse il resultset 
e poi di popolare una array o similare con tutte le varie istanze di quella 
classe..
ma e' l'unico metodo? o cmq il piu' efficace?
la mia idea in proposito, per realizzare quanto appena detto, era questa 
(dando per scontato di avere gia' ricavato il ResultSet rs e di essere 
dentro a un while che cicla ad ogni rs.next())
Vector dati = new Vector();
...
int rsIDCliente = rs.getInt("IDCliente");
String rsNome = rs.getString("Nome");
String rsCognome = rs.getString("Cognome");
dati.add(new ResultClienti(rsIDCliente, rsNome, rsCognome));
dove ResultClienti e' una classe con questo costruttore
ResultIncontri(int rsIDCliente, String rsNome, String rsCognome) {
  this.rsIDCliente = rsIDCliente;
  this.rsNome = rsNome;
  this.rsCognome = rsCognome;
 }
mi sembra che questa sia proprio l'implementazione di cui parlava il secondo 
ragazzo.. ma quello che mi chiedo e' se sia veramente cosi' utile ed 
efficiente questo metodo.. insomma, questo va bene quando so a priori che 
tipo di query SQL faccio, e soprattutto in un numero limitato.. ma quando ci 
sono tante query diverse, di cui alcune magari in cui non si sa a priori 
cosa si sta selezionando.. come si fa?
puo' aver senso aggiungere al vettore direttamente il ResultSet rs e poi 
usarlo castandolo? tipo
dati.add(rs);
System.out.println(((ResultSet) dati.lastElement()).getString("Cognome"));
in questo modo non mi pongo il problema di crearmi 200 classi diverse a 
seconda del ResultSet che avro'..
domanda a parte, quando conviene utilizzare Vector piuttosto di ArrayList 
piuttosto di altri tipe di liste? c'e' da qualche parte una comparativa? 
(sul sito sun non mi sembra di aver trovato..)
grazie a tutti :) 

Ciao,
indipendentemente dalla struttura dati che vuoi usare per memorizzare le
informazioni, potresti scrivere un metodo generico che sfrutta i
ResultSetMetaData (API : java.sql package)  per accedere qualunque tipo di
resuslSet senza sapere a priori il numero o il nome delle colonne.
Infatti tramite i ''metadata" puoi trovare queste info a runtime e
sfruttarle per leggere i valori delle tabelle . In questo modo scrivi una
sola volta il codice e lo usi su qualsiasi tipo di tabella.
Ciao,
Max
"thd" <thd@LE_MANI_DAL_NASOacidboyz.org> wrote in message
news:3b2t9iF...@individual.net...


Fui io a risponderti.
Il problema e' che adesso stai cambiando le carte in tavola; se mi dici "una
query che estrae i clienti e li piazza in un vettore", la soluzione di
creare una classe che astrae il dato e poi popolarlo e' la migliore.
Questo e' ovvio, per applicazioni limitate (es. esercizi scolastici e cosi'
via).
Per applicazioni di portata maggiore la migliore soluzione e' cercarsi un
framework di persistenza (ce ne sono X in giro) che tramite appropriati
strumenti ti permette di astrarre una singola tabella come una classe... e
di "scrivere query" utilizzando statement java.
Esempio di uno dei tanti framework:
NiusgrupUser nu = new NiusgrupUser();
nu.setField(NiusgrupUser.QUOZIENTE_STUPIDITA, "<0");
ArrayList utentiDecenti = nu.searchAndRetrieveList(NiusgrupUser.NOME);
for (ListIterator utentiDecentiIterator = utentiDecenti.listIterator();
utentiDecentiIterator.hasNext(); ) {
   nu = (NiusgrupUser) utentiDecentiIterator.next();
   System.out.println("Utente non-stupido: "+nu.getField(NiusgrupUser.NOME);
}
I nomi dei metodi dovrebbero spiegare il tutto, no?
Francesco