PDA

View Full Version : [Java] - Passaggio dati tra classi


RagingBull
05-07-2008, 16:25
Ciao a tutti, sono alle prime armi con java a causa di un progetto per l'università. Tranquilli non voglio me lo facciate voi. :)

Venendo al dunque. Sto cercando di far passare dei valori da una classe ad un altra per poi qui farci le operazioni necessarie e restituire il risultato al mittente (SET, GET mi sembra). Mi spiego meglio:

Ho creato una classe "Utente" nella quale sono presenti, in variabili, nome e cognome.

Li devo inviare ad una classe "Database" nella quale nome e cognome serviranno come parametri per completare una query MySQL il cui risultato viene inviato alla classe "Utente".

Spero di essere stato chiaro. Ho letto parecchie cose ma ancora non ho capito come si fa praticamente. :muro:

Grazie anticipatamente a tutti!!!

carter100
05-07-2008, 16:41
Ho creato una classe "Utente" nella quale sono presenti, in variabili, nome e cognome.

Li devo inviare ad una classe "Database" nella quale nome e cognome serviranno come parametri per completare una query MySQL il cui risultato viene inviato alla classe "Utente".


Se ho capito bene ti basta solo scrivere 2 funzioni set e 2 get in questo modo

public class Utente
{
private String nome;
private String cognome;
public String getNome ()
{
return nome;
}

//stessa cosa per getCognome
}

public class Database
{
public static void main (String [] args)
{
Utente u=new Utente ();
//carichi nome e cognome in u;
f(u);
}
public void f (Utente u)
{
String nome=u.getNome ();
String c=u.getCognome();
//ora hai il nome e cognome da inserire nel database creando la query
}
}


Oppure o ho capito male?

RagingBull
05-07-2008, 17:02
Dunque. Innanzitutto grazie per la risposta.

Uhm...mi stai dicendo che i dati li deve raccogliere direttamente Database, elaborarli e poi passarli a Utente per mostrarli?

Se è così non è la soluzione che fa al caso mio. Ti spiego.

L'applicazione che devo creare poggia totalmente su MySQL per la gestione dei dati. Ovviamente ci saranno classi che richiederanno query diverse al DB.

Il mio intento era quello di comporre la query all'interno della classe richiedente (a seconda delle esigenze SELECT, UPDATE, etc), passarla alla classe Database che la processa e rimanda i risultati alla classe richiedente.

Mi rendo conto di essere poco chiaro (e magari mi hai anche dato la soluzione al problema e non me ne sono accorto), ma sta cosa mi sta mandando nel pallone.:(

carter100
05-07-2008, 17:11
L'applicazione che devo creare poggia totalmente su MySQL per la gestione dei dati. Ovviamente ci saranno classi che richiederanno query diverse al DB.

Il mio intento era quello di comporre la query all'interno della classe richiedente (a seconda delle esigenze SELECT, UPDATE, etc), passarla alla classe Database che la processa e rimanda i risultati alla classe richiedente.

Cerco di capire che devi fare, oggi sono fuso anch'io.
Se devi registrare nome e cognome, vuoi preparare la query in una funzione della classe Utente?Io non farei così per una questione di forma, ma non ci sono problemi, ti basta una cosa di questo tipo:


class Utente
{
public void f ()
{
String query="insert into tabella (nome, cognome)values ("+nome+","+cognome);
Database d=new Database ();
d.inserimento(query);
}
}
class Database
{
public void inserimento (String q)
{
//connessione al database e esecuzione della query q
}
}


Ovviamente penso di aver sbagliato a scrivere il codice dell'insert, ma penso quello non sia 1 problema.
Il succo è che in una funzione di Utente prepari la query aggiungendo i campi nome e cognome che hai impostato in precedenza e poi passi la query pronta ad una funzione di Database, questo si connette al db e fa la insert (o l'update o quello che sarà).
Spero di aver capito...:stordita:

demos88
05-07-2008, 17:31
Ciao a tutti, sono alle prime armi con java a causa di un progetto per l'università. Tranquilli non voglio me lo facciate voi. :)

Venendo al dunque. Sto cercando di far passare dei valori da una classe ad un altra per poi qui farci le operazioni necessarie e restituire il risultato al mittente (SET, GET mi sembra). Mi spiego meglio:

Ho creato una classe "Utente" nella quale sono presenti, in variabili, nome e cognome.

Li devo inviare ad una classe "Database" nella quale nome e cognome serviranno come parametri per completare una query MySQL il cui risultato viene inviato alla classe "Utente".

Spero di essere stato chiaro. Ho letto parecchie cose ma ancora non ho capito come si fa praticamente. :muro:

Grazie anticipatamente a tutti!!!
mica potresti indicarci meglio i requisiti? non mi sembrano molto chiari...
hai una classe "Utente" la quale contiene nome e cognome di un utente.
poi hai una classe "Database" che pesca oggetti di tipo "Utente" e ricavandone nome e cognome, costruisce delle query?

Se magari ci dici meglio cosa ti viene richiesto possiamo aiutarti a rivedere lo schema... perchè personalmente, da come sono strutturate quelle classi, mi sa che c'è un pò di confusione nell'idea risolutiva. O almeno non capisco cosa devi fare esattamente.

RagingBull
05-07-2008, 17:41
Il progetto consiste i un programma stand-alone che gestisce un corso di laurea.

Al termine ci sarà una interfaccia grafica che accoglie le richieste dell'utente, le passa al livello di dominio in cui è presente, tra le tante, la classe Utente, che li elabora e li passa successivamente a un DataMapper che preleva i dati dal database li reinvia al livello di dominio che a sua volta li elabora e passa all'interfaccia per la stampa a video.

demos88
05-07-2008, 17:59
Il progetto consiste i un programma stand-alone che gestisce un corso di laurea.

Al termine ci sarà una interfaccia grafica che accoglie le richieste dell'utente, le passa al livello di dominio in cui è presente, tra le tante, la classe Utente, che li elabora e li passa successivamente a un DataMapper che preleva i dati dal database li reinvia al livello di dominio che a sua volta li elabora e passa all'interfaccia per la stampa a video.
mh si ha la sua complessità.
quello che però mi confonde un attimo è la classe Utente. Cioè... se tu ricevi i dati dall'esterno, perchè li memorizzi in oggetti di tipo utente al posto di inserirli direttamente nel database? (azione che mi pare tu voglia fare subito dopo)
Supponendo che tu voglia prima raccogliere tutti i dati degli utenti in un array (o pila, coda, catena che sia...) di oggetti "Utente", potresti leggere l'intero elenco di utenti inserendoli uno per uno con un ciclo iterativo.
Quello che mi sfugge è che dici che il database, deve restituire dei dati agli oggetti "Utente"... non immagino cosa :confused:
Per caso l'applicazione nella sua interezza è del tipo: "l'utente inserisce il suo nome, cognome e matricola e il programma ricerca i dati relativi all'utente nel database e li restituisce a schermo" ?

RagingBull
05-07-2008, 18:18
Proprio per il fatto che ci sono molte query da eseguire stavamo pensando (progetto in gruppo) di creare un prepared statement in maniera tale da non scrivere ogni volta il codice per la connessione al database.

Cmq si, tra le tante richieste che un utente può fare c'è anche la visualizzazione di un profilo completo inserendo in una form dei dati.

demos88
05-07-2008, 18:41
Proprio per il fatto che ci sono molte query da eseguire stavamo pensando (progetto in gruppo) di creare un prepared statement in maniera tale da non scrivere ogni volta il codice per la connessione al database.

Cmq si, tra le tante richieste che un utente può fare c'è anche la visualizzazione di un profilo completo inserendo in una form dei dati.
ritornando al tuo primo post...
allora con get e set in genere indichi appunto metodi che restituiscono e settano i parametri interni a una classe. Se crei una classe "Utente" che ha campi "nome" e "cognome", una volta che li hai settati, l'oggetto è bello completo... cioè ti sei costruito un oggetto di tipo "Utente" contenente i dati che hai indicato.
Presumo avrai una classe "Database" contenente il riferimento al db e tutti i metodi per inserimenti, lettura, modifiche ecc... Tu usi le classi dall'esterno, cioè hai un metodo main in una classe apposita che crea un oggetto "Database" e poi crea tutti gli oggetti "Utente" che vuoi e li inizializza con "nome" e "cognome". Sarà sempre dal metodo main che tu vai a richiamare i metodi set e get degli oggetti "Utente" e poi richiamerai i metodi del "Database" passandogli i dati recuperati. Tutto questo avviene dentro al metodo main. I risultati in uscita non li devi rimandare agli oggetti "Utente" perchè, da come mi sembrano, sono oggetti di memorizzazione in ingresso (cioè li usi per memorizzare i dati inseriti o che devono ancora essere trattati).
I risultati dovrai spararli direttamente su un oggetto grafico quale tabella, frame o quant'altro.

Non so se ho azzeccato la situazione, credo sia più un problema di logica del funzionamento. Hai provato a buttare giù assieme ai tuoi compagni un diagramma di tutte le classi per simularne il funzionamento insieme?

carter100
05-07-2008, 19:23
ritornando al tuo primo post...
Non so se ho azzeccato la situazione, credo sia più un problema di logica del funzionamento.

Si infatti, forse non riesci ad immaginarti tutto il sistema e le interazioni tra le classi, perchè non mi sembra ci sia un problema specifico nell'implementazione, ma come detto oggi sono molto stanco, se hai bisogno ci si sente domani.
P.S. Essendo un progetto di ing del sw, hai preparato i vari diagrammi delle classi ecc?Altrimenti effettivamente immaginare tutto il sistema è dura ;)

RagingBull
05-07-2008, 20:00
Ammazza, quando ho detto progetto di gruppo avete capito al volo che si trattava di ingegneria del software! :D

Cmq tutta la parte riguardante analisi e progettazione è stata completata, corredata di diagrammi delle classi e diagrammi di sequenza.

Ad ogni modo la classe Utente l'ho completata. Eccovela:

public class Utente
{
private String tabella = "utente";
private String nome = "antonio";
private String cognome = "rossi";

public String getNome()
{
return nome;
}

public String getCognome()
{
return cognome;
}

public String getTabella()
{
return tabella;
}

public void setNome(String name)
{
nome = name;
}

public void setCognome(String surname)
{
cognome = surname;
}

public void setTabella(String table)
{
tabella = table;
}
}

Di seguito l'inizio della classe Mysql con la quale non riesco a recuperare i dati: ottengo errore nelle righe che riguardano le assegnazioni dalle variabili (Cannot make a static reference to the non-static field cognome). Che ho combinato?

public class Mysql {
public String nome;
public String cognome;
public String tabella;

public static void main(String args[])
{
Utente utente;
utente = new Utente();
nome = utente.getNome(); //errore
cognome = utente.getCognome(); //errore
tabella = utente.getTabella(); //errore
}
}

Ad ogni modo piano piano sto capendo questo benedetto passaggio di variabili. :yeah: :yeah:

Per quel che riguarda la connessione al DB mi sa tanto che l'unica cosa che resterà nel prepared statement, oltre la costruzione dell'interfaccia grafica base, sarà la procedura di apertura e chiusura connessione. Tutta la gestione delle query la lascio alle classi del livello di dominio. Penso sia la soluzione più semplice e indolore.

Ora mi prendo una pausa serale: prima che faccia qualcosa di simile :bsod: .....tra caldo e linee di codice (per di più di un linguaggio nuovo)....sto fuso da morire!!!

Non so davvero come ringraziarvi per la disponibilità!!! A domani!!!

demos88
05-07-2008, 20:38
Ammazza, quando ho detto progetto di gruppo avete capito al volo che si trattava di ingegneria del software! :D

asd io pure fo ingegneria, dell'informazione. Sono solo al primo anno ma avendo fatto una scuola per periti informatici me la cavo :P


Di seguito l'inizio della classe Mysql con la quale non riesco a recuperare i dati: ottengo errore nelle righe che riguardano le assegnazioni dalle variabili (Cannot make a static reference to the non-static field cognome). Che ho combinato?

Noiosissimo errore :D
credo sia dovuto al modo concettualmente errato di costruzione della classe utente. In ogni caso per come l'hai scritta tu, tutti gli oggetti Utente avranno stesso nome e cognome, non credo sia esattamente quello che vuoi xD.
Te la ripropongo usando un metodo costruttore:
public class Utente
{
private String tabella;
private String nome;
private String cognome;

public Utente (String tabella, String nome, String cognome)
{
this.tabella=tabella;
this.nome=nome;
this.cognome=cognome;
}

public String getNome()
{
return nome;
}

public String getCognome()
{
return cognome;
}

public String getTabella()
{
return tabella;
}

public void setNome(String name)
{
nome = name;
}

public void setCognome(String surname)
{
cognome = surname;
}

public void setTabella(String table)
{
tabella = table;
}
}
poi nella classe Mysql, al momento della creazione di un oggetto Utente scriverai

utente = new Utente("tabella","nome","cognome");

così durante la creazione, assegnerai già i parametri.
in ogni caso domandona: ma perchè crei un oggetto di cui conosci già i parametri per poi recuperarli con il get? proprio non mi torna :D
e in questo caso potresti addirittura togliere i metodi di set, visto che dopo averla creata la leggi solamente.



Ora mi prendo una pausa serale: prima che faccia qualcosa di simile :bsod: .....tra caldo e linee di codice (per di più di un linguaggio nuovo)....sto fuso da morire!!!

lol pure io, tutto il giorno che sto dietro a un menu flash con questo maledetto actionscript :muro:

buona serata

carter100
06-07-2008, 08:19
CUT


Ti basta anche richiamare 1 funzione dal main in Mysql, qualcosa tipo:

public class Mysql {
public String nome;
public String cognome;
public String tabella;

public static void main(String args[])
{
Mysql m=new Mysql ();
m.f ();
}
public void f ()
{
Utente utente;
utente = new Utente();
nome = utente.getNome();
cognome = utente.getCognome();
tabella = utente.getTabella();
}
}


In questo modo funziona. Resta valido il fatto del costruttore di demos, tieni però presente che se non ho capito male dovrai fare 1 applicazione in Swing, quindi il main avrà l'unica funzione di far apparire la schermata del programma, il resto sarà su funzioni diverse, quindi quell'errore non lo avresti comunque più

khelidan1980
06-07-2008, 11:25
a parte le considerazioni de demos88 sul fatto che avrai oggetti con gli stessi campi nome ecc,presumibilmente quello che vuoi fare e una lettura da console dei nomi ecc(oppure da swing ma concettualmente è la stessa cosa) inoltre non capisco il motivo di un campo tabella,avrai più di una tabella in cui conterrai gli utenti nel db?Inoltre secondo me la classe utente non deve sapere niente della struttura del db,quella classe modella il concetto di utente,la persona del mondo reale,il tuo utente non sa niente del tuo db

demos88
06-07-2008, 13:41
a parte le considerazioni de demos88 sul fatto che avrai oggetti con gli stessi campi nome ecc,presumibilmente quello che vuoi fare e una lettura da console dei nomi ecc(oppure da swing ma concettualmente è la stessa cosa) inoltre non capisco il motivo di un campo tabella,avrai più di una tabella in cui conterrai gli utenti nel db?Inoltre secondo me la classe utente non deve sapere niente della struttura del db,quella classe modella il concetto di utente,la persona del mondo reale,il tuo utente non sa niente del tuo db
Infatti... anzi non so nemmeno se serva per forza una classe Utente; quando leggi dall'input, richiami direttamente un metodo della classe che gestisce il db che eseguirà la query necessaria. La classe Utente, per come la presenti, mi pare solo un passaggio non necessario tra l'input e l'elaborazione. Avrebbe significato se raccogliessi in successione molti identificativi (quindi per esempio un array di Utente) per poi elaborarli in un secondo momento.
Come giustamente detto da carter, nel main avrai solo la classe grafica dell'interfaccia input/output, il resto si snoda su una struttura di classi a patto tu non voglia creare una applicazione con diversi thread separando le interfacce dall'elaborazione (più client verso un solo server) ma allora la cosa diventa ancora più tosta :D

RagingBull
08-07-2008, 09:11
ok raga, scusate se non mi sono fatto vivo questi 2 giorni: altri esami da fare.

ho fatto leggere il thread ai miei colleghi....la soluzione è stata una via di mezzo di tutte le vostre proposte.

Grazie ancora a tutti per l'aiutone!!! Vi devo una birra!!! :cincin: