JDBC e WebProject

di il
10 risposte

JDBC e WebProject

Ciao a tutti, ho alcuni dubbi e spero possiate aiutarmi.
Ho iniziato a studiare da poco i database relazionali, ho visto come fare per interfacciare java al database con il JDBC e come eseguire le query da java. Ho dei dubbio però sulle tabelle e la loro traduzione in codice java.

In caso di relazione N:M bisogna creare una terza tabella con PK della prima entity e PK della seconda, ma in java dovrò creare la classe di questa tabella con attributi le due pk?

In caso di relazione 1:N bisogna inserire la PK della entity 1 nella tabella della entity 2 e fungerà da chiave esterna, quindi nella classe della entity2 dovrò dichiarare la Pk dell'altra entity, giusto?

Ultima cosa... immaginando un web project di un sito stile amazon.
Tabelle Acquirente, Prodotti, Carrello.
L'acquirente seleziona un prodotto e questo viene inserito nella tab Carrello (vi resterà finche non avverrà il pagamento, altrimenti anche ad un nuovo login resterà nel carrello). Ora, devo creare (tramite metodo da una servlet) una tabella Carrello per ogni utente registrato oppure una sola tabella (tanto il prodotto contiene la pk dell'acquirente, quindi ogni acquirente vedrà solo i suoi prodotti)? E soprattutto, la query come va scritta visto che la pk dell'acquirente sarà un id classico, come associo l'id cliente al prodotto?

Lascio testo di alcune query di prova per eventuali correzioni, grazie mille, spero possiate risolvere i miei dubbi.

10 Risposte

  • Re: JDBC e WebProject

    public void esempioInsert(String cognome, String email, String telefono) throws SQLException {
    		String sql = "INSERT INTO cliente (cognome,email,telefono) VALUES (?, ?, ?)";
    
    		PreparedStatement ps = ConnDB.getConnection().prepareStatement(sql);
    		ps.setString(1, cognome);
    		ps.setString(2, email);
    		ps.setString(3, telefono);
    		ps.executeUpdate();
    		System.out.println("record aggiunto");
    	} 
    
    	public void esempioSelect() throws SQLException {
    		String sql = "SELECT * FROM cliente WHERE cognome=? AND email LIKE '%a%' ";
    
    		PreparedStatement ps = ConnDB.getConnection().prepareStatement(sql);
    		ps.setString(1, "aaaaaa");
    		ResultSet rs = ps.executeQuery();
    
    		while (rs.next()) {
    			System.out.println("--------------");
    			System.out.println(rs.getString(1));
    			System.out.println(rs.getString(2));
    			System.out.println(rs.getString(3));
    			System.out.println(rs.getString(4));
    			System.out.println(rs.getString(5));
    		}
    	}
  • Re: JDBC e WebProject

    WinstonSmith ha scritto:


    In caso di relazione N:M bisogna creare una terza tabella con PK della prima entity e PK della seconda
    Sì, esatto.

    WinstonSmith ha scritto:


    ma in java dovrò creare la classe di questa tabella con attributi le due pk?
    No, la tabella di "relazione" con le due PK non la si rappresenta a livello di oggetti.

    WinstonSmith ha scritto:


    In caso di relazione 1:N bisogna inserire la PK della entity 1 nella tabella della entity 2 e fungerà da chiave esterna, quindi nella classe della entity2 dovrò dichiarare la Pk dell'altra entity, giusto?
    In una relazione uno-a-molti, la foreign key ovvero la chiave che punta verso un'altra tabella sta sempre dalla parte del "molti". Un caso "classico" (ma se ne possono fare molti altri): "clienti" e "ordini". Nella tabella ORDINI ci va il Id del Cliente che è la foreign key verso il record in CLIENTI. Appunto perché 1 cliente può avere N ordini, come nell'esempio sotto dove il singolo cliente Luca Bianchi ha 3 ordini.
    
    
      CLIENTI                          ORDINI
      +------------+--------------+    +-----------+------------+---- - -
      | ID_CLIENTE | NOMINATIVO   |    | ID_ORDINE | ID_CLIENTE | .......
      | (PK)       |              |    | (PK)      | (FK)       |
      +------------+--------------+    +-----------+------------+---- - -
      | 103        | Mario Rossi  |    | 1010      | 103        | .......
      | 105        | Luca Bianchi |    | 1011      | 105        | .......
      +--\---------+--------------+    | 1012      | 105        | .......
          \                            | 1013      | 105        | .......
           \                           +-----------+--/---------+---- - -
            \________________________________________/
    
    

    WinstonSmith ha scritto:


    devo creare una tabella Carrello per ogni utente registrato oppure una sola tabella
    Una sola tabella ... è di nuovo anche qui una relazione uno-a-molti: 1 utente ha N prodotti in carrello.

    WinstonSmith ha scritto:


    E soprattutto, la query come va scritta visto che la pk dell'acquirente sarà un id classico, come associo l'id cliente al prodotto?
    Esattamente come si farebbe per i clienti-ordini visti sopra: avendo il ID_CLIENTE, si fa una query su ORDINI per estrarre tutti gli ordini che hanno quel ID_CLIENTE.
  • Re: JDBC e WebProject

    Grazie mille, davvero.
    Effettivamente non avrebbe senso dichiarare in java la tabella relazione ed idem più tabelle carrello.
    Il discorso query sono ancora fuori strada, ma forse ho posto male la domanda.

    Io ho la tabella prodotto con la lista dei prodotti. In questo momento un prodotto non è stato ancora scelto da un cliente, è solo un inventario con i prodotti presenti, quindi come potrò riempire il campo relativo alla fk?

    e nella query per l'inserimento del prodotto nella tabella carrello... devo recuperare il campo idCliente con il metodo get e passarlo alla query assieme agli attributi dell'oggetto prodotto? insert into nomeProd, prezzo, idCliente value (nome, prezzo, ed id come lo recupero?)

    nel senso, l'id è la mia pk e fk, quindi viene generata in qutomatico quando inserisco l'utente, come faccio a "passarlo", devo scrivere io nel metodo per la query il parametro (id)123434?
  • Re: JDBC e WebProject

    WinstonSmith ha scritto:


    Io ho la tabella prodotto con la lista dei prodotti. In questo momento un prodotto non è stato ancora scelto da un cliente, è solo un inventario con i prodotti presenti, quindi come potrò riempire il campo relativo alla fk?

    e nella query per l'inserimento del prodotto nella tabella carrello... devo recuperare il campo idCliente con il metodo get e passarlo alla query assieme agli attributi dell'oggetto prodotto? insert into nomeProd, prezzo, idCliente value (nome, prezzo, ed id come lo recupero?)

    nel senso, l'id è la mia pk e fk, quindi viene generata in qutomatico quando inserisco l'utente, come faccio a "passarlo", devo scrivere io nel metodo per la query il parametro (id)123434?
    Tabella PRODOTTI:
    ID_PRODOTTO (PK, può essere dato da sequence/auto-increment)
    ...altri dati...

    Una tabella UTENTI avrà:
    ID_UTENTE (PK, può essere dato da sequence/auto-increment)
    ...altri dati...

    La tabella CARRELLO potrebbe essere:
    ID_UTENTE (FK)
    ID_PRODOTTO (FK)
    ...altri dati... (es. quantità ecc...)

    Cosa noti? Che CARRELLO "sembra" una tabella di relazione per N:M. E in effetti lo è. Tra UTENTI e CARRELLO è 1:N ma tra UTENTI e PRODOTTI è N:M perché anche uno stesso prodotto può stare in carrello per più utenti.

    Nota: la PK di CARRELLO potrebbe essere ID_UTENTE e ID_PRODOTTO .... oppure ci potrebbe essere un singolo ID auto-generato (per comodità di update/delete ecc..). Se così fosse, ID_UTENTE e ID_PRODOTTO sarebbe sensato che siano comunque insieme in una chiave secondaria unique.
  • Re: JDBC e WebProject

    Grazie ancora, ho le idee un po' più chiare ed una visuale generale un po' più ampia, mi resta solo da capire come effettuare la query "via java" e purtroppo non ho trovato esempi... mi frega il fatto che la tab carrello ha i campi

    idCliente fk che punta alla pk di cliente, viene autogenerata
    idProdotto fk che punta alla pk di prodotto, viene autogenerata

    ma come recupero questi due valori e li passo al metodo "inserisciRecord(idCliente, idProdotto)" se si tratta di valori generati automaticamente...
  • Re: JDBC e WebProject

    WinstonSmith ha scritto:


    idCliente fk che punta alla pk di cliente, viene autogenerata
    idProdotto fk che punta alla pk di prodotto, viene autogenerata

    ma come recupero questi due valori e li passo al metodo "inserisciRecord(idCliente, idProdotto)" se si tratta di valori generati automaticamente...
    No, quando inserisci un prodotto in carrello, idCliente e idProdotto li DEVI già sapere, perché: l'utente XYZ loggato di idCliente=123 ha cliccato su "Aggiungi al carrello" per il prodotto di idProdotto=1000.

    idCliente e idProdotto possono certamente essere auto-generati ma ben PRIMA, quando è stato creato un nuovo cliente o un nuovo prodotto.
  • Re: JDBC e WebProject

    Scusami, ultima cosa... riassumo in breve lo svolgimento:

    Pagina jsp per registrarsi o loggarsi, a seconda della scelta vieni rimandato in una determinata jsp.
    scegli di registrarti, compili il form e clicchi su registrati. A questo punto con la servlet nel metodo do post recupero col getParameter() i campi che mi interessano e lancio il metodo inserisciUtente(string nome, ecc) che mi compila il record e genera anche un id(pk). Vieni rimandato sulla homepage, questa volta ti logghi, compili e viene lanciato il metodo(implementato in un'altra servlet) che va a recuperare i parametri inseriti e verificare con il metodo che rimanda alla select se questo utente esiste. Se sì, inizia una sessione e viene rimandato in una pagina con la lista dei prodotti e ne aggiunge uno alla volta magari tramite un codice identificativo. ogni volta che sceglie un prodotto ci sarà la servlet col metodo insert che inserirà l'id del prodotto selezionato e l'id dell'utente che sta effettuando la scelta. Mi manca come "compilare" questa insert visto che nel db potrebbero esserci 100 utenti ed a me serve solo quello dell'utente corrente da passare al metodo... è vero che lo conosco(andando a guardare la tabella), ma potrerbbe connetersi chiunque tra i 100..
  • Re: JDBC e WebProject

    Io """programmatore""" non sarò lì a passare l'id del cliente ogni qual volta un utente farà acquisti... magari la dico grossa, ma immaginavo una roba tipo un getId per recuperare l'id di Quel cliente dalla tabella e salvarlo in una variabile da passare poi al metodo.
  • Re: JDBC e WebProject

    WinstonSmith ha scritto:


    Se sì, inizia una sessione [...] a me serve solo quello dell'utente corrente da passare al metodo...

    WinstonSmith ha scritto:


    Io """programmatore""" non sarò lì a passare l'id del cliente ogni qual volta un utente farà acquisti...
    In tutto quanto hai detto, non hai considerato una cosa: se il login ha successo, devi creare una "sessione" in modo che tutta la "navigazione" successiva di quell'utente tra le pagine del sito sia "correlata" attraverso la sessione.

    Nel senso della Servlet API significa gestire il javax.servlet.http.HttpSession. La sessione sta sul SERVER, mentre tra client e server viene passato avanti e indietro solo il ID di sessione (che normalmente sta in un cookie nel browser). Sul server ovvero nel HttpSession ci metti tutti i dati che ti servono come "attributi" di sessione. In questo tuo caso, magari un bel oggetto di classe Utente (con id, nominativo ecc...).

    Quindi, ad ogni richiesta successiva: se c'è sessione E c'è in sessione un oggetto Utente, allora c'è un utente loggato. E il Id dell'utente lo hai sempre implicitamente.
  • Re: JDBC e WebProject

    Grazie ancora. Sapevo di dover creare una sessione ed ho anche visto e capito come fare.
    Quindi al momento del login, validata la sessione, il risultato di quella stessa select potrei raccogliero in un oggetto ResultSet, per poi andare ad inizializzare l'oggetto cliente e con i vari set andrò ad inizializzare i suoi attributi, compreso l'id. A quel punto dovrò subito dopo invocare il setAttribute per mettere l'oggetto cliente in sessione.
Devi accedere o registrarti per scrivere nel forum
10 risposte