Lavorare sulle basi dati con JDBC

di il
105 risposte

105 Risposte - Pagina 2

  • Re: Lavorare sulle basi dati con JDBC

    andbin ha scritto:


    giannino1995 ha scritto:


    Con SquirrelSQL e JDBC riesco a connettermi:
    https://prnt.sc/ncuny
    Non mi ci trovo per nulla ma credo che Docker funzioni.
    Bene, sì deduco anche io che il PostgreSQL nel Docker funzioni.
    Ora se vai sotto quella "public", dovresti trovare varie cose tra cui una "table" (o "tables", non ricordo) e probabilmente ci sono già delle tabelle. Ed è lì che puoi creare eventuali altre tabelle.
    Grazie mille, ora so dove devo buttare l'occhio. Comunque questo PostgreSQL mi sembra incompleto. Non trovo da nessuna parte un pulsante per creare una tabella.
  • Re: Lavorare sulle basi dati con JDBC

    giannino1995 ha scritto:


    Comunque questo PostgreSQL mi sembra incompleto.
    Vabbè, dopo questa potete chiudere il forum
  • Re: Lavorare sulle basi dati con JDBC

    Sono riuscito a creare una tabella, ora devo capire come gestire questi VOLUMI su Docker.
  • Re: Lavorare sulle basi dati con JDBC

    Weierstrass ha scritto:


    giannino1995 ha scritto:


    Comunque questo PostgreSQL mi sembra incompleto.
    Vabbè, dopo questa potete chiudere il forum
    scusa, volevo scrivere SquirrelSQL
  • Re: Lavorare sulle basi dati con JDBC

    Ho creato questa tabella dentro il database gis:
    CREATE TABLE datacamp_courses(
     course_id SERIAL PRIMARY KEY,
     course_name VARCHAR (50) UNIQUE NOT NULL,
     course_instructor VARCHAR (100) NOT NULL,
     topic VARCHAR (20) NOT NULL
    );
    In gis/public/TABLE ho visto comparire datacamp_courses quindi funziona tutto alla perfezione.
    Ho anche provato a spegnere e riaprire Docker. Alla riapertura datacamp_courses era ancora presente quindi funziona anche VOLUME.
    Ora posso dedicarmi alla creazione delle classi per interagire con questo DB.
  • Re: Lavorare sulle basi dati con JDBC

    giannino1995 ha scritto:


    In gis/public/TABLE ho visto comparire datacamp_courses quindi funziona tutto alla perfezione.
    Ti ha creato anche la sequence perché hai usato SERIAL.
    Quindi quando farai una insert:
    - o NON elenchi course_id nella lista delle colonne
    - o se lo elenchi devi poi usare il valore DEFAULT
  • Re: Lavorare sulle basi dati con JDBC

    andbin ha scritto:


    giannino1995 ha scritto:


    In gis/public/TABLE ho visto comparire datacamp_courses quindi funziona tutto alla perfezione.
    Ti ha creato anche la sequence perché hai usato SERIAL.
    Quindi quando farai una insert:
    - o NON elenchi course_id nella lista delle colonne
    - o se lo elenchi devi poi usare il valore DEFAULT
    Grazie per le info. Il codice che leggi l'ho copiato da internet (la prima pagina fornitami da Google). Volevo solo testare quello che mi hai detto a riguardo di "public/TABLE". Scopro a malincuore che la sintassi di PostgreSQL è molto diversa da quella di MySQL.

    Il DB che vorrei creare sarebbe questo ma ci sono una marea di errori:
    /*
    	Database su MySQL.
    */
    
    /*
    CREATE TABLE utenti (
    	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    	nome VARCHAR(255) NOT NULL,
    	password VARCHAR(255) NOT NULL,
    	UNIQUE (nome)
    ) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB;
    
    CREATE TABLE spostamenti (
    	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    	id-autore INT NOT NULL,
    	latitudine DOUBLE PRECISION NOT NULL,
    	longitudine DOUBLE PRECISION NOT NULL,
    	tempo TIMESTAMP NOT NULL,
    	velocita DOUBLE PRECISION
    ) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB;
    */
    
    /*
    	Database su PostgreSQL.
    */
    
    CREATE TABLE utenti (
    	id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    	nome VARCHAR(255) NOT NULL,
    	password VARCHAR(255) NOT NULL,
    	UNIQUE (nome)
    ) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB;
    
    CREATE TABLE spostamenti (
    	id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    	id-autore INT NOT NULL,
    	latitudine DOUBLE PRECISION NOT NULL,
    	longitudine DOUBLE PRECISION NOT NULL,
    	tempo TIMESTAMP NOT NULL,
    	velocita DOUBLE PRECISION
    ) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB;
    
    /*
    	Utenti e password che possono accedere all'applicazione.  
    */
    
    INSERT INTO utenti (id, nome, password) VALUES
    (1, 'Marco', 'vgrfvrfgvrvdrv...'),
    (2, 'Luca', 'dfvvfsdvsdvfdv...');
  • Re: Lavorare sulle basi dati con JDBC

    Se lancio questo funziona:
    CREATE TABLE utenti (
    	id SERIAL PRIMARY KEY,
    	nome VARCHAR(255) NOT NULL,
    	password VARCHAR(255) NOT NULL,
    	UNIQUE (nome)
    );
    
    CREATE TABLE spostamenti (
    	id SERIAL PRIMARY KEY,
    	id_autore INT NOT NULL,
    	latitudine DOUBLE PRECISION NOT NULL,
    	longitudine DOUBLE PRECISION NOT NULL,
    	tempo TIMESTAMP NOT NULL,
    	velocita DOUBLE PRECISION
    );
    ma non riesco a settare il set di caratteri e l'engine.
    Tra il resto i file che contengono codice PostgreSQL che estensione hanno?
    Esistono dei programmi che aiutano a scrivere codice per DB?
    Come posso scrivere i commenti senza che diano problemi su SquirrelSQL?
  • Re: Lavorare sulle basi dati con JDBC

    .
  • Re: Lavorare sulle basi dati con JDBC

    giannino1995 ha scritto:


    Scopro a malincuore che la sintassi di PostgreSQL è molto diversa da quella di MySQL.
    E non è solo questione di "sintassi" (parole chiave, tipi di dati, ecc...) che può ovviamente variare da un DBMS all'altro, ma anche di concetti. PostgreSQL ha le "sequence", MySQL no (ha solo la clausola AUTO_INCREMENT), ad esempio.

    giannino1995 ha scritto:


    Il DB che vorrei creare sarebbe questo ma ci sono una marea di errori:
    Ovviamente non puoi prendere uno script così di MySQL e buttarlo in PostgreSQL !

    giannino1995 ha scritto:


    ma non riesco a settare il set di caratteri e l'engine.
    Il concetto di "engine" è di MySQL ! Non di altri DBMS (sicuramente non PostgreSQL, Oracle DB, DB2 ecc..).

    Per il set di caratteri, puoi verificare quello globale di PostgreSQL (che poi si applica a tutte le nuove tabelle, se non specificato diversamente). Se è UTF-8 va benissimo. Anche se fosse ISO-8859-1, sarebbe valido se non devi scrivere cose "strane" (che so, roba in cirillico o lingue asiatiche ecc..).

    Comunque banalmente, puoi vedere: https://stackoverflow.com/questions/6454146/getting-the-encoding-of-a-postgres-database

    giannino1995 ha scritto:


    Tra il resto i file che contengono codice PostgreSQL che estensione hanno?
    Il codice SQL si scrive generalmente su file con estensione .sql . Ma è solo una convenzione. Al DBMS NON interessa che estensione hanno i file!

    giannino1995 ha scritto:


    Esistono dei programmi che aiutano a scrivere codice per DB?
    Puoi creare ad esempio le tabelle "visualmente" (con un client grafico come SquirrelSQL) e poi andare a vedere il SQL che ne risulta. Non so ora se SquirrelSQL lo fa. Il pgAdmin ufficiale, sì. Ma facendo così comunque non è che vai granché "lontano" ...

    giannino1995 ha scritto:


    Come posso scrivere i commenti senza che diano problemi su SquirrelSQL?
    I commenti in SQL generalmente iniziano con 2 trattini -- e terminano a fine riga.
    Poi se è supportato (PostgreSQL sì), ci sono i commenti multi-linea /* */


    Comunque, migliorabile l'ha detto in maniera più "colorita" ma il succo è quello: dovresti studiare un pochino di più, consultare della documentazione (anche facilmente reperibile in rete) e cercare di orientare subito bene il tuo lavoro. Piuttosto di fare copia incolla di cose che non servono perché palesemente errate o valide solo in altri contesti.
  • Re: Lavorare sulle basi dati con JDBC

    Giannino PostgreSQL ha un ottimo tutorial, così non devi impazzire
    http://www.postgresqltutorial.com

    l'ultima sezione è appunto PostgreSQL JDBC, ma non leggerla se non hai letto prima quelle precedenti

    p.s.: poi, comunque, alla fine ricordati che in fase di sviluppo va bene tutto, ma nell'applicazione reale è pericoloso lanciare i database dai container
  • Re: Lavorare sulle basi dati con JDBC

    Ho letto una breve dispensa su PostgreSQL e ho provato ad aggiungere una classe al mio progetto per fare una semplice query:
    SELECT * FROM utenti WHERE id = 1
    Il mio database è questo:
    CREATE TABLE utenti (
    	id SERIAL PRIMARY KEY,
    	nome VARCHAR(255) NOT NULL,
    	password VARCHAR(255) NOT NULL,
    	UNIQUE (nome)
    );
    CREATE TABLE spostamenti (
    	id SERIAL PRIMARY KEY,
    	id_utente INT NOT NULL,
    	latitudine DOUBLE PRECISION NOT NULL,
    	longitudine DOUBLE PRECISION NOT NULL,
    	tempo TIMESTAMP NOT NULL,
    	velocita DOUBLE PRECISION
    );
    INSERT INTO utenti (id, nome, password) VALUES
    (1, 'Topolino', '...'),
    (2, 'Pippo', '...'),
    (3, 'Pluto', '...'),
    (4, 'Paperino', '...');
    Sono riuscito a connettermi al database ma non a leggere i dati che volevo:
    
    package web1;
    
    import java.sql.*;
    
    // Questa classe serve per gestire PostgreSQL
    
    public class PostgreSQL {
    
        // PASSO 1
        // Si inizializza il driver JDBC per gestire PostgreSQL (1 volta sola).
        static {
            try {
                Class.forName("org.postgresql.Driver");
            } catch (ClassNotFoundException e) {
                throw new ExceptionInInitializerError(e);
            }
        }
    
        private final String url = "jdbc:postgresql://192.168.99.103:5432/gis";
        private final String user = "eb";
        private final String password = "password";
    
        // PASSO 2
        // Si crea un oggetto per la creazione di una connessione.
        public Connection connect() {
            Connection conn = null;
            try {
                conn = DriverManager.getConnection(url, user, password);
                System.out.println("Connesso al server PostgreSQL con successo.");
            } catch (SQLException e) {
                System.out.println(e.getMessage());
            }
    
            return conn;
        }
    
        // PASSO 3
        // Scrivo una query nel database
        public void doQuery(Connection conn, String p1) throws SQLException {
            PreparedStatement ps = null;
            try {
                String query = "SELECT * FROM utenti";
                if (p1 != null) {
                    query = query + " WHERE id = ?";
                    ps = conn.prepareStatement(query);
                    // setString() accetta 2 parametri:
                    // Il primo indica la posizione del "?" nella query;
                    // Se ci sono 2 "?" ci sono due setString(), il primo è setString(1,...) e il secondo setString(2,...);
                    // Il secondo parametro indica la stringa da sostituire a "?";
                    ps.setString(1, p1);
                } else {
                    ps = conn.prepareStatement(query);
                }
                readAndProcessData(ps.executeQuery());
            } finally {
                try {
                    if (ps != null) ps.close();
                } catch (Exception e) {
                    // Si genera questa eccezione quando la classe perde la connessione al database.
                    // Cosa scrivo qui dentro ????!!!!!?????!!!!?????
                }
            }
        }
    
        // Si leggono i dati ottenuti dal database
        public void readAndProcessData(ResultSet rs) throws SQLException {
            try {
                while (rs.next()) {
                    System.out.println(
                            rs.getString("id") + " " +
                                    rs.getString("nome") + " " +
                                    rs.getString("password") + "\n"
                    );
                }
            } finally {
                try {
                    // Si chiude la connessione dopo ogni operazione per non sovraccaricare la memoria del server.
                    rs.close();
                } catch (Exception e) {
                    // Si genera questa eccezione quando la classe perde la connessione al database.
                    // ????
                }
            }
        }
    
    
    }
    
    
    
    Nella Servlet ho scritto questo:
    
    <%@ page import="web1.PostgreSQL" %>
    <%@ page import="java.sql.Connection" %>
    <%@ page import="java.sql.SQLException" %>
    <%
                            PostgreSQL PostgreSQL = new PostgreSQL();
                            Connection connessione = PostgreSQL.connect();
                            try {
                                PostgreSQL.doQuery(connessione, "1");
                            } catch (SQLException e) {
                                e.printStackTrace();
                            }
    
     %>
    Questo è l'errore:
    Suggerimento: No operator matches the given name and argument type(s). You might need to add explicit type casts.
  • Re: Lavorare sulle basi dati con JDBC

    Ho risolto, usavo un setString al posto di setInt.
    Ora funziona tutto! Wawww!
  • Re: Lavorare sulle basi dati con JDBC

    giannino1995 ha scritto:


    Ho risolto, usavo un setString al posto di setInt.
    Sì, era sicuramente quello ma credo più per una "pignoleria" del driver JDBC. Se con un qualunque tool (SquirrelSQL, pgAdmin) fai un ... WHERE id = '1' funziona senza problemi. Comunque se il id è numerico, è giusto trattarlo e passarlo come numerico. Stop.

    Comunque già che ci sono, due cose: hai usato SERIAL, quindi hai le sequence create in automatico. Dovresti usarle. Prima hai inserito degli id "a mano", 1, 2, ecc..

    Adesso magari stai ancora facendo "prove" un po' così. Ma quando poi hai chiarito la struttura della base dati, dovresti mettere i vincoli di foreign key. Il id_autore di spostamenti fa riferimento ad un id in utenti? Se sì, ci vorrebbe appunto una foreign key.
  • Re: Lavorare sulle basi dati con JDBC

    Sempre grazie per il tuo supporto e la tua presenza. Facendo questo corso ogni giorno mi accorgo che dovrei leggere dei libri interi su argomenti diversi. Il problema è che se mi soffermo su questi aspetti non ne esco più e neppure tra 100 anni finisco.
    In pratica id_autore che ho rinominato in id_utente è l’ID dell’utente. Desidero che ogni serie di dati (latitudine, longitudine, ecc…) sia associata ad un utente.
    Adesso sto cercando di concentrarmi sull’esercitazione (rendere persistenti i dati di posizione inseriti dall’utente) e come dici giustamente tu sto facendo delle prove.
    SERIAL l’ho usato perché non conoscevo altro modo di definire l’ID (in MySQL avrei fatto diversamente). foreign key non so cosa significa ma vedo di approfondire e ti ringrazio molto per la dritta.
    Penso che finito questo corso dovrei leggere qualcosa di più specifico come questo:
    https://www.hoepli.it/libro/postgresql-programmazione-avanzata/9788850331482.html
    che è relativamente corto ed in italiano.
Devi accedere o registrarti per scrivere nel forum
105 risposte