Utilizzare form con classe da tabella access

di il
6 risposte

Utilizzare form con classe da tabella access

Mi scuso in aticipo per la postazione di un banale problema, ma ho le idee un po confuse e preferisco fare la figura del salame, ma chiarire punti essenziali per il proseguo della trattazione java.
Mi chiamo Moreno 65 anni e con una inesauribile voglia di imparare e conoscere nuovi linguaggi.
Ho affrontato C# e ora mi sta prendendo in maniera molto intensa Java.

Vorrei partire realizzando un banalissimo progetto di tipo desktop, ma penso che l'argomento di cui chiedo spiegazioni possa comenu far parte di informazioni di carattere generale.
Dat punto di vista grafico sto utilizzando sia Netbeans che Eclipse (mi sembra non ci siano molte diversità tra i due IDE)

Ho realizzato una form banalissima per l'aggiornamento della tabella anagrafica.

alcune domande per verificare se ho finora impostato correttamente

Ho strutturato il progetto, per maggior chiarezza utilizzando del Package specifi per raccogliere in maniera più organica i file presenti.
Per esempio nel Package esempio.Windows andranno tutte le form del progetto; nel Package esempio.Images tutti i files .jpg o .png usati, ecc.

Ho creato con questa logica la esempio.Entities dove ho le classi utilizate.

Domanda: E' corretta un'impostazione del genere ?

minutando la classe Anadip contenuta nel Package esempio.Entities mi da errori. Sbaglio certamente a definire le proiperty della tabella anadip.
In allegato il database con la tabella d'esempio.
Puoi aiutarmi a codificarla correttamente ?

Effettuata la corretta compilazione della classe anadip, come posso usarla dentra al programma ?
Puoi correggermi il progetto che ho fatto per poter gestire in maniera funzionale l'aggiornamento del data base utilizzando la classe.

Curiosità: in fase di creazione della classe per la impostazione delle property della tabella anadip nel pannello aperto da netbeans (in allegato lo screenshot) c'erano classe entità e classe enità dal database. sono le stesse della classe java class (che ho scelto) ma con wizard per selezione tabella ? non mi è permesso impostare access.

Non riesco a inviare il dababase access.
ti metto la struttura della tabella

Matricola Numerico
Cognome testo lungo
Nome Testo Lungo
Titolo Numerico
UserName Testo Lungo
Password Testo Lungo
il codice della classe (incompleta) anadip è

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package esempio.Entities;

/**
 *
 * @author mison
 */
public class Anadip {
   
    private long matricola;
    private String cognome;
    private String nome;
    private long titolo;
    private String username;
    private String password;
       
    public long Matricola() {
        return matricola;
    }

    public String Cognome()
    {
        return cognome;
    }
    
    public String Nome()
    {
        return nome;
    }
    
    public long Titolo()
    {
        return titolo;
    }
    
    public String Username()
    {
        return username;
    }
   
    /*    [color=#FF0000]mi da errore[/color]
    
    public String Password
    {
        get
        {
            return password;             
        }
    }
    
  */
      
    
    
    
}



mancano le get / set e i metodi, ma non so come minutarla.
Puoi aiutarmi ?
Grazie


Moreno
Allegati:
19656_3172884c5a174bc5257b5fb645554a48.jpg
19656_3172884c5a174bc5257b5fb645554a48.jpg

19656_80a2a28739a12ccd23d2872d39cd8f28.jpg
19656_80a2a28739a12ccd23d2872d39cd8f28.jpg

19656_485f6af43f75a64b44ba07a453cdf630.jpg
19656_485f6af43f75a64b44ba07a453cdf630.jpg

6 Risposte

  • Re: Utilizzare form con classe da tabella access

    misonsan ha scritto:


    (mi sembra non ci siano molte diversità tra i due IDE)
    Sì, sicuramente. Ma il punto non è quello. Se ti "fissi" solo sulle caratteristiche di un IDE, es. il fatto che NetBeans ha una voce "Nuovo->Classe entità..." (tra l'altro, cosa fa di specifico? .. non lo so, non uso normalmente NetBeans) ti troverai male con un altro IDE che non ha quella funzionalità (Eclipse non mi pare abbia una voce equivalente, ha il New->Class generico).
    Se invece "sai" davvero Java, programmi in Java con qualunque IDE.

    misonsan ha scritto:


    Ho strutturato il progetto, per maggior chiarezza utilizzando del Package specifi per raccogliere in maniera più organica i file presenti.
    Per esempio nel Package esempio.Windows andranno tutte le form del progetto; nel Package esempio.Images tutti i files .jpg o .png usati, ecc.

    Ho creato con questa logica la esempio.Entities dove ho le classi utilizate.

    Domanda: E' corretta un'impostazione del genere ?
    Grosso modo sì. Sbagliato di per sé non lo è di certo! I nomi di package in generale, per convenzione, dovrebbero però iniziale con la minuscola (es. esempio.windows , non esempio.Windows). In rari casi se un package è composto da più parole si può mettere es. esempi.appGui ma sono appunto casi rari e un esempio reale in questo momento non mi ricordo dove potrei averlo visto.

    misonsan ha scritto:


    minutando la classe Anadip contenuta nel Package esempio.Entities mi da errori.
    Non abbreviare i nomi solo perché "fa comodo". Meglio ad esempio Dipendente piuttosto che Anadip

    misonsan ha scritto:


    
    public class Anadip {
       
        private long matricola;
        private String cognome;
        private String nome;
        private long titolo;
        private String username;
        private String password;
           
        public long Matricola() {
            return matricola;
        }
    
        public String Cognome()
        {
            return cognome;
        }
        
        public String Nome()
        {
            return nome;
        }
        
        public long Titolo()
        {
            return titolo;
        }
        
        public String Username()
        {
            return username;
        }
    Alt. Iniziamo meglio con i metodi getter/setter.
    I campi sono ok: nomi ok e "private" ok.

    Il nome del campo però è una cosa e il nome della "proprietà" a livello di specifiche JavaBeans è un'altra (ma spesso/di norma corrisponde).

    Se hai un campo nome, allora:
    public String getNome() {
        return nome;
    }
    
    public void setNome(String nome) {
        this.nome = nome;
    }

    misonsan ha scritto:


        
        public String Password
        {
            get
            {
                return password;             
            }
        }
    In Java NON esiste una sintassi del genere. Forse hai ancora in mente C# .
  • Re: Utilizzare form con classe da tabella access

    Grazie Andrea per la cortese e rapida risposta.

    Ho cercato di trovare la soluzione alla compilazione della classe "Anadip" (in futuro cercherò di usare nomi completi e parlanti. Grazie del consiglio !!)

    Ho creato i metodi per la validità dei controlli.
    ho un paio di costrutturi per l'istanza della classe.
    Puoi vedere se può andare bene ?
    ti allego il codice.
    
    package esempio.Entities;
    
    /**
     *
     * @author mison
     */
    public class Anadip {
       
        private long matricola;
        private String cognome;
        private String nome;
        private long titolo;
        private String username;
        private String password;
        
        
        //  
        
        
        
        public long Matricola() {
            return matricola;
        }
    
        public String Cognome()
        {
            return cognome;
        }
        
        public String Nome()
        {
            return nome;
        }
        
        public long Titolo()
        {
            return titolo;
        }
        
        public String Username()
        {
            return username;
        }
        
        public String Password()
        {
            return password;
        }  
        
       
        public void Matricola(long matricola) {
          this.matricola = matricola;
       }  
         
       public void Cognome(String cognome) {
          this.cognome = cognome;
       }
        
       public void Nome(String nome)
       {
           this.nome = nome;
       }
       
          public void Titolo(long titolo) {
          this.titolo = titolo;
       }  
       
         public void Username(String userrname) {
          this.username = username;
       }
       
          public void Password(String password) {
          this.password = password;
       } 
         
          public Anadip() {
          super();
          // TODO Auto-generated constructor stub
       }
    
    
       public Anadip(long matricola, String cognome, String nome, long titolo, String username, String password) {
          this.matricola = matricola;
          this.cognome = cognome;
          this.nome = nome;
          this.titolo = titolo;
          this.username = username;
          this.password = password;
    
       }
    
       //  controlli di correttezza dati
       
       
       public boolean IsValidMatricola()
       {
           return this.matricola > 0;
       } 
       
       public boolean IsValidCognome()
       {
           return this.cognome != null && this.cognome.trim().length() > 0;
       }
       
       public boolean IsValidNome()
       {
           return this.nome != null && this.nome.trim().length() >0;
       }
       
       public boolean IsValid()
       {
           return IsValidMatricola() && IsValidCognome() && IsValidNome();
       }
        
    
    }
    
    

    ora ho un altro piccolo problema.

    Come utilizzare la classe nella form.
    effettuato l'istanza della classe, (dopo il costruttore della classe form), e dopo aver effettuata la lettura dal database con il valore della matricola inserita dall'utente. popolo le property della classe dai valori del recordset letto.
    Non ricordo come "Agganciare" le property ai controlli textbox della form

    Spero di aver esposto il problema.

    Hai per caso un progettino minimale del genere ?
    Vorrei imparare a pescare e non mi interessa avere il pesce gratis, ma che mi insegnino a pescare.
    Il progettino vorrebbe essere una forma di riflessione su come leggere.

    Secondo Problema.
    Sicuramente esiste il Binding.
    Come funziona in java ?

    grazie

    Moreno
  • Re: Utilizzare form con classe da tabella access

    misonsan ha scritto:


          public Anadip() {
          super();
          // TODO Auto-generated constructor stub
       }
    
    
       public Anadip(long matricola, String cognome, String nome, long titolo, String username, String password) {
          this.matricola = matricola;
          this.cognome = cognome;
          this.nome = nome;
          this.titolo = titolo;
          this.username = username;
          this.password = password;
    
       }
    I costruttori tecnicamente sono ok. Il super(); nel primo è solo superfluo ma non sbagliato.

    Quelli che ancora non vanno sono i metodi sopra.

    misonsan ha scritto:


       public boolean IsValidMatricola()
       {
           return this.matricola > 0;
       } 
       
       public boolean IsValidCognome()
       {
           return this.cognome != null && this.cognome.trim().length() > 0;
       }
       
       public boolean IsValidNome()
       {
           return this.nome != null && this.nome.trim().length() >0;
       }
       
       public boolean IsValid()
       {
           return IsValidMatricola() && IsValidCognome() && IsValidNome();
       }
    
    Questi, a parte il nome che inizia con "Is" invece che "is", di per sé sono corretti.

    misonsan ha scritto:


    dopo aver effettuata la lettura dal database con il valore della matricola inserita dall'utente. popolo le property della classe dai valori del recordset letto.
    E cosa usi per l'accesso al DB? JDBC? Direttamente con tuo codice o tramite altro?

    misonsan ha scritto:


    Non ricordo come "Agganciare" le property ai controlli textbox della form
    Ma non c'è nulla di "automatico" in questo. Di per sé a livello basilare: si prende un valore da un campo e lo si setta con un "setter" nell'oggetto "bean". Poi bisogna vedere eventuali conversioni ecc...

    Insomma: "Agganciare le property ai controlli textbox della form" non vuol dire niente se non sei tu a fare tutti i singoli passaggi dei dati "a mano" con del codice, oppure architettando una piccola architettura per fare una qualche forma di "binding" oppure usando una qualche libreria esterna che lo fa.

    misonsan ha scritto:


    Hai per caso un progettino minimale del genere ?
    Al momento no.

    misonsan ha scritto:


    Sicuramente esiste il Binding.
    Come funziona in java ?
    Il termine "binding" è un po' generico. Bisogna precisare binding "tra cosa". In Java ci sono svariate librerie/framework di binding per:
    - binding tra classi e documenti XML
    - binding tra classi e documenti JSON
    - binding tra classi e tabelle di DB
    - binding tra classi in generale
    - binding per accesso a file di properties
    ecc.. (sicuramente altro che non mi viene in mente)

    La questione principale è che queste librerie/framework normalmente si basano sulle proprietà secondo le specifiche JavaBeans.
    E qui torniamo al punto di prima: devi (e ripeto, DEVI) dis-abituarti a C#/.NET ed abituarti a Java.
    In Java ci sono le convenzioni di denominazione basilari e poi le specifiche JavaBeans, perlomeno a livello minimale.

    Quindi devi abituarti a scrivere classi, metodi, variabili nel modo convenzionale. E in particolar modo i metodi getter/setter, ancor di più se vuoi usare delle librerie/framework di binding che si basano sulle proprietà dedotte dai metodi come inteso dalle specifiche JavaBeans.
    Se continui a mettere metodi es. Titolo() , nessuna libreria/framework di binding ti funzionerà ....
  • Re: Utilizzare form con classe da tabella access

    Se vuoi capire meglio la questione delle proprietà secondo specifiche JavaBeans, prova questo codice. L'ho scritto al volo, è minimale ma è ok. Utilizza la API standard nel package java.beans che serve per fare una "introspezione" all'interno di oggetti "bean" secondo specifiche JavaBeans.
    Raramente si usa questa API direttamente (come ho fatto io), è più facile che sia usata da librerie di binding o altro che richiede una introspezione all'interno dei bean.
    import java.beans.BeanInfo;
    import java.beans.IntrospectionException;
    import java.beans.Introspector;
    import java.beans.PropertyDescriptor;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class ProvaStampaProprieta {
        public static void main(String[] args) {
            Persona paola = new Persona("Paola", 1981);
    
            try {
                stampaProprieta(paola);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void stampaProprieta(Object oggetto)
                throws IntrospectionException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
            BeanInfo beanInfo = Introspector.getBeanInfo(oggetto.getClass());
    
            for (PropertyDescriptor propertyDesc : beanInfo.getPropertyDescriptors()) {
                String nome = propertyDesc.getName();
                Method m = propertyDesc.getReadMethod();
    
                if (m != null) {
                    Object valore = m.invoke(oggetto);
                    System.out.println("proprietà \"" + nome + "\" = " + valore);
                }
            }
        }
    }
    
    
    class Persona {
        private String nome;
        private int annoNascita;
    
        public Persona(String nome, int annoNascita) {
            this.nome = nome;
            this.annoNascita = annoNascita;
        }
    
        public String getNome() {
            return nome;
        }
    
        public int getAnnoDiNascita() {
            return annoNascita;
        }
    }

    Prova ad eseguirlo e dimmi cosa vedi e se noti qualcosa di particolare.
  • Re: Utilizzare form con classe da tabella access

    Ciao Andrea

    Ho fatto il progettino con il codice che mi hai dato.
    il risultato è questoin allegato.
    Non riesco a capire questo collegato al problema del binding
    Grazie

    Moreno
    Allegati:
    19656_3eb7ce9b9ddc705e99d9f2737c98506e.jpg
    19656_3eb7ce9b9ddc705e99d9f2737c98506e.jpg
  • Re: Utilizzare form con classe da tabella access

    misonsan ha scritto:


    Non riesco a capire questo collegato al problema del binding
    Il "binding" è ancora un'altra cosa. Quello che hai provato ti dovrebbe solo servire per capire innanzitutto la questione delle "proprietà". All'interno dell'oggetto Persona sono state trovate 3 proprietà. E nota: c'è una proprietà "class" che non c'è in Persona. Perché è il getClass() definito ed ereditato da Object! Che come forma è a tutti gli effetti un metodo "getter" valido.
    Inoltre ha trovato una proprietà "annoDiNascita". Nota invece che il campo in Persona è "annoNascita". I nomi delle proprietà vengono dedotti dai metodi, NON dai campi. Il metodo è getAnnoDiNascita(), la logica di introspezione vede il metodo, toglie il "get" e decapitalizza il primo nome, quindi appunto deduce "annoDiNascita".

    Morale: in generale (e specialmente se vorrai usare librerie/framework di binding), abituati a mettere metodi getter/setter in modo appropriato.
Devi accedere o registrarti per scrivere nel forum
6 risposte