DOMANDA Metodi Java su Database MySQL

IlGattoNero1921

Nuovo Utente
75
1
Sera a tutti, sto seguendo un esercitazione di Basi Di Dati della mia facoltà. Ma non ho ben capito come implementare le seguenti informazioni:

Creare il corrispondente DAO StudenteDAO (prendere come esempio l’altro DAO) con i seguenti metodi:

public Studente get(Studente studente)
private Studente recordToStudente(ResultSet rs) throws SQLException
public Vector<Studente> getAll()
public boolean modifica(Studente studente)
public boolean salva(Studente studente)
public boolean elimina(Studente studente)

-Per la gestione del possibile valore null di idcdl, usare il seguente codice:
if (rs.getObject("idcdl")!=null)
studente.setIdcdl(rs.getInt("idcdl"));
-Per la gestione del parametro ? nel caso idcdl (che può essere null) usare il seguente codice:
ps.setNull(XXX, java.sql.Types.INTEGER); //dove XXX è l’ordine del parametro (1, 2, 3, …)
Allora io ho scritto i vari metodi che sarebbero questi.
Java:
package it.unirc.bd.beans;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import it.unirc.bd.utils.DBManager;

public class StudenteDAO {
    private static Connection conn = null;

    public Studente get(Studente studente) {
        String query = "SELECT * FROM studente WHERE matricola = ?";
        Studente res = null;
        PreparedStatement ps;
        conn = DBManager.startConnection();
        try {
            ps = conn.prepareStatement(query);
            ps.setInt(1, studente.getMatricola());
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                res = new Studente();
                res.setMatricola(rs.getInt("matricola"));
                res.setNome(rs.getString("nome"));
                res.setCognome(rs.getString("cognome"));
                res.setIdcdl(rs.getInt("idcdl"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        DBManager.closeConnection();
        return res;
    }

    public boolean salva(Studente studente) {
        String query = "INSERT INTO Studente VALUES (?, ?,?,?)";
        boolean esito = false;
        conn = DBManager.startConnection();
        try {
            PreparedStatement ps = conn.prepareStatement(query);
            ps.setInt(1, studente.getMatricola());
            ps.setString(2, studente.getNome());
            ps.setString(3, studente.getCognome());
            ps.setInt(4, studente.getIdcdl().intValue());
            
            int tmp = ps.executeUpdate();
            if (tmp == 1)
                esito = true;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        DBManager.closeConnection();
        return esito;
    }

    public boolean elimina(Studente studente) {
        String query = "DELETE FROM studente WHERE matricola = ?";
        boolean esito = false;
        conn = DBManager.startConnection();
        try {
            PreparedStatement ps = conn.prepareStatement(query);
            ps.setInt(1, studente.getMatricola());
            int tmp = ps.executeUpdate();
            if (tmp == 1)
                esito = true;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        DBManager.closeConnection();
        return esito;
    }

    public boolean modifica(Studente studente) {
        String query = "UPDATE studente SET nome=?,cognome=?,idcdl=? WHERE matricola=?";
        boolean esito = false;
        conn = DBManager.startConnection();
        try {
            PreparedStatement ps = conn.prepareStatement(query);
            ps.setString(1, studente.getNome());
            ps.setString(2, studente.getCognome());
            ps.setInt(3, studente.getIdcdl());
            ps.setInt(4, studente.getMatricola());

            int tmp = ps.executeUpdate();
            if (tmp == 1)
                esito = true;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        DBManager.closeConnection();
        return esito;
    }
    
    

    protected Studente recordToStudente(ResultSet rs) throws SQLException {
        Studente studente = new Studente();
        studente.setMatricola(rs.getInt("matricola"));
        studente.setNome(rs.getString("nome"));
        studente.setCognome(rs.getString("cognome"));
        studente.setIdcdl(rs.getInt("idcdl"));
        return studente;
    }

    public Vector<Studente> getAll() {

        String query = "SELECT * FROM studente";
        Vector<Studente> list = new Vector<Studente>();
        PreparedStatement ps;
        conn = DBManager.startConnection();
        try {
            ps = conn.prepareStatement(query);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                list.add(recordToStudente(rs));

            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        DBManager.closeConnection();
        return list;
    }
Ora non riesco a capire come dovrei implementare i possibili valori idcdl null. Il database è composto da due tabelle una corsodilaure(id,nome) ed una seconda studenti:
Creare la tabella Studente (matricola, nome, cognome, idcdl) dove idcdl è una foreign key. Aggiungere il vincolo di integrità referenziale.
 

Dumah Brazorf

Utente cAttivo
Utente Èlite
7,511
3,492
Beh invece di null si potrebbe creare un corso di laurea a id -1 e nome "Nessuno". Non sono sicuro sia un po' quello che è scritto qui, mai usata la funzione setNull:
Per la gestione del parametro ? nel caso idcdl (che può essere null) usare il seguente codice:
ps.setNull(XXX, java.sql.Types.INTEGER); //dove XXX è l’ordine del parametro (1, 2, 3, …)


EDIT: eeh mi pare che c'ho preso.


[censurato: l'è canàt]
 
Ultima modifica:

pabloski

Utente Èlite
2,868
916
Beh invece di null si potrebbe creare un corso di laurea a id -1 e nome "Nessuno".

Beh no. Intanto lì c'è un errore, perchè idcdl è un intero, quando dovrebbe essere un riferimento ad un'istanza della classe DAO che rappresenta il corso di laurea. Non ha senso usare lo stesso metodo di riferimento del db ( cioè porre idcdl = id del corso di laurea ).

Il senso di un data access object, è proprio convertire la semantica del db in quella object oriented del linguaggio di programmazione. E in questo senso, il riferimento nullo diventerebbe il null di Java.

Ma comunque andrebbe a violare il vincolo d'integrità referenziale, cioè starebbe forzando l'esistenza di uno studente che non è iscritto a nessun corso di laurea. E questo è un errore enorme, data la specifica del progetto.
 

IlGattoNero1921

Nuovo Utente
75
1
Ragazzi, scusate non vi sto seguendo. Il problema è la traccia o i metodi che ho scritto io? Perché si tratta di una tratta del professore, giusto per capire se ha scritto delle boiate ahahah
 

Dumah Brazorf

Utente cAttivo
Utente Èlite
7,511
3,492
Ok è completamente sbagliato il mio assunto sul mettere -1 e l'uso del setNull.
Il vincolo d'integrità referenziale dovrebbe essere ancora valido se si usa null per idcdl. Sarebbe violato se avesse un valore diverso da null e anche dagli id della tabella dei corsi.

Ah, nell'insert mancano i campi
INSERT INTO Studente(i campi da inserire) VALUES (?, ?,?,?)
 
Ultima modifica:

pabloski

Utente Èlite
2,868
916
Ragazzi, scusate non vi sto seguendo. Il problema è la traccia o i metodi che ho scritto io? Perché si tratta di una tratta del professore, giusto per capire se ha scritto delle boiate ahahah

ci sono problemi in entrambe

riguardo la traccia

Per la gestione del possibile valore null di idcdl

si sta quindi presumendo che uno studente possa essere iscritto a zero corsi di laurea...quindi la sua posizione all'università qual è? scaldasedia? voyeur?

lì si dovrebbero stabilire un valore minimo pari a 1 per la molteplicità

poi c'è la questione del puntatore...una classe DAO serve per consentire l'accesso ai dati, secondo la semantica del linguaggio

se dovessi creare un programma senza db, che tiene in memoria i dati, faresti di idcdl un numero intero o un puntatore al relativo oggetto corsodilaurea?

però, rileggendo il primo post, vedo che è sempre la traccia a suggerire di usare un int

comunque, fatto in quel modo, non implementa un DAO

p.s. dai un'occhiata a qualche esempio su entity fremework di C#, per esempio questo https://www.entityframeworktutorial.net/entity-relationships.aspx

notato nulla?
Post unito automaticamente:

Il vincolo d'integrità referenziale dovrebbe essere ancora valido se si usa null per idcdl. Sarebbe violato se avesse un valore diverso da null e anche dagli id della tabella dei corsi.

Esatto. E' sulla molteplicità che casca. Ma rileggendo, vedo che la traccia lo consente.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!