Lavorare sulle basi dati con JDBC

di il
105 risposte

Lavorare sulle basi dati con JDBC

Ciao a tutti,
Dovrei fare un po' di esperienza con JDBC imparando a memorizzare in un DB chiamato PosgreSQL alcune informazioni (utenti, password, dati inseriti dai rispettivi utenti, ecc...). Nel testo dell'esercitazione si parla di questo strumento:
https://hub.docker.com/r/kartoza/postgis
In pratica mi stanno chiedendo di creare un database PosgreSQL in locale sul mio PC usando Docker e di creare sull'IDE, nel mio caso IntelliJ, delle servlet e delle classi che interagiscano con i container Docker, giusto?
In pratica si tratta di aprire Docker, lanciare il container, aprire l'IDE e scrivere dentro il container le informazioni?
Oppure bisogna fare tutto sull'IDE ed usare Docker solo per testare il programma creato?
Grazie

105 Risposte

  • Re: Lavorare sulle basi dati con JDBC

    giannino1995 ha scritto:


    Dovrei fare un po' di esperienza con JDBC imparando a memorizzare in un DB chiamato PosgreSQL alcune informazioni (utenti, password, dati inseriti dai rispettivi utenti, ecc...). Nel testo dell'esercitazione si parla di questo strumento:
    https://hub.docker.com/r/kartoza/postgis
    Di Docker e PostGIS non me ne intendo. Ma PostGIS posso dirti che è una estensione di PostgreSQL che aggiunge il supporto per trattare dati geo-spaziali, con lo scopo di realizzare tipicamente sistemi GIS.
    Quindi ti serve? O no?

    Se vuoi fare esperienza con JDBC, basta un qualunque DB relazionale (MySQL, PostgreSQL, ecc..) e il relativo "driver" JDBC.
    Docker non c'entra direttamente.
  • Re: Lavorare sulle basi dati con JDBC

    PostGIS mi serve ma solo nella terza esercitazione, per ora mi basta solo PostgreSQL senza la relativa estensione. Devo salvare delle coordinate in un database. Scrivere delle semplici query.

    Sapresti spiegarmi che cos'è un sistema GIS in parole semplici? A me sembra di aver capito che PostGIS sia un plugin per PostgreSQL che aggiunge dei metodi che aiuta il programmatore ad eseguire delle operazioni matematiche su dati spaziali (latitudine e longitudine) contenuti in PostgreSQL. Sulla pagina che ho postato si parla di QGIS ma online trovo anche ArcGIS ed ArcGIS Pro e non capisco bene cosa centrino con PostGIS. E' possibile che QGIS ed ArcGIS Pro siano dei software simili ad AutoCAD per interpretare database PostgreSQL con estensione PostGIS ed eseguire su questi ulteriori elaborazioni grafiche/matematiche non realizzabili con i semplici metodi di PostGIS?

    Docker nella prima esercitazione l'ho usato per testare i .war in locale su Tomcat. E' un programma ostico... molto ostico... almeno per me...

    Questo è quello che dovrei fare in Java:
    static {
      try{
        Class.forName("foo.bar.Drv");
      }catch (ClassNotFoundException e){
    	throw new 
           ExceptionInInitializerError(e);
        //o invocare System.exit()
      }
    }
    
    private Connection getConnection(String url) 
    		throws SQLException {
      
      return DriverManager.getConnection(url,"myLogin","myPassword");
    }
    
    public void doQuery(Connection c, String p1,? )
    	throws SQLException{
      PreparedStatement ps = null;
      try {
        String query="SELECT * FROM table WHERE value=1";
        if(p1!=null){
    	query=query+" AND P1 = ?";
          ps = c.prepareStatement(query); 	ps.setString(1,p1); 
        } else 
          ps = c.prepareStatement(query); 
        readAndProcessData( ps.executeQuery() );
      } finally {
        try {if (ps!=null) ps.close();} 
        catch (Exception e) { ? }
      }
    }
    
    public void readAndProcessData(ResultSet rs){
      try {
        while(rs.next()) {
          System.out.println(
            rs.getString("Field1")+ " " +
            rs.getInt("Field2")+ " " +
            rs.getDate("Field3")+"\n"                   
        );
      } finally {
        try { rs.close(); } 
        catch (Exception e) { ...}
      }
    }
    
    private int insertData(String value1,?)
    	throws SQLException{
      String q="INSERT INTO myTable"+
        +" (field1, field2, ? ) "+
        +" VALUES (?,?)";
      PreparedStatement ps=conn.prepareStatement(q);      
      try {
        ps.setString(1,value1); 
        ?
        return ps.executeUpdate();  
      } finally {
        try { if (ps!=null) ps.close();}
        catch (Exception e) { ... } 
      }              
    }
    
    private int updateData(String value1,?)
    	throws SQLException{
      String q="UPDATE myTable SET"+
        +" field1 = ?, ? "+
        +" WHERE ?";
      PreparedStatement ps=conn.prepareStatement(q);
      try {
        ps.setString(1,value1); 
        ?
        return ps.executeUpdate();  
      } finally {
        try { if (ps!=null) ps.close();}
        catch (Exception e) { ... }
      }           
    }
    
    private int deleteData(String value1,?)
    	throws SQLException{
      String q=?DELETE FROM myTable "+
        +" WHERE field1 = ? ? ";
      PreparedStatement ps=conn.prepareStatement(q);
      try {
        ps.setString(1,value1); 
        ?
        return ps.executeUpdate();   
      } finally {
        try { if (ps!=null) ps.close();}
        catch (Exception e) { ... }
      }             
    }
    
    public class Contact{
     private String name;
     private long id;
     //getter e setter
    }
    
    public interface ContactDAO{
     public List<Contact> findAll();
     public List<Contact> findByName(String name);
     public Contact findById(long id);
     public void insert(Contact c);
     public void delete(Contact c);
     public void update(Contact c);
    }
    
    public class MySQLContactDAO implements ContactDAO{
     public List<Contact> findAll() {
       Connection c=null; Statement s=null; ResultSet rs=null;
       try{
        c=getConnection(?);
        s = c.createStatement();
        rs = s.executeQuery("SELECT * FROM Contatti");
        List<Contact> l=new ArrayList<Contact>();
        /* process rs and populate l */?; return l;
       } catch (Exception e) { throw new RuntimeException(e); 
       } finally {
    	try {if(rs!=null) rs.close();} catch(Exception e) {?} 
           try {if(s!=null) s.close();} catch(Exception e) {?}
          	try {if(c!=null) c.close();} catch(Exception e) {?} 
       }
     } /* other methods ... */
    }
    
     Connection c = null; 
     Statement s=null; 
     try {
       c=DriverManager.getConnection(url, user, passwd);
       c.setAutoCommit(false);
       try {
         s = c.createStatement();
         s.executeUpdate(...);
         s.executeUpdate(...);
         c.commit();
       } catch (Exception e) {
         c.rollback();
         throw e;
       }
     } finally {
       try {if(s!=null) s.close();} catch (Exception e) {...} 
       try {if(c!=null) c.close();} catch (Exception e) {...}
     }
    
    Statement s = conn.createStatement();
    s.executeUpdate("INSERT INTO authors " +
     "(first, last) VALUES ('George', 'Orwell')",
        Statement.RETURN_GENERATED_KEYS);
    ResultSet rs = s.getGeneratedKeys();
    if ( rs.next() ) {
      int key = rs.getInt(1);
    }
    
    
    Ti è famigliare?
  • Re: Lavorare sulle basi dati con JDBC

    .
  • Re: Lavorare sulle basi dati con JDBC

    giannino1995 ha scritto:


    Docker nella prima esercitazione l'ho usato per testare i .war in locale su Tomcat. E' un programma ostico... molto ostico... almeno per me...
    E allora levalo di mezzo come dice giustamente migliorabile.

    Esercitazione? Ma c'è un prof di mezzo? Se è così piazzati nel suo ufficio e fai presente che ti sta obbligando a usare uno strumento che ti causa problemi e che non c'entra una mazza con l'argomento trattato
  • Re: Lavorare sulle basi dati con JDBC

    La situazione mi sembra chiara.
    gis non memprizza solo i dati, fa elaborazioni, ad esempio su aree lunghezze e perimetri. In realtà talvolta si usa per le funzioni di intersezione di insiemi convessi, ma vabbè

    Il docker banalizzando è una Virtual machine preconfigurata.

    Quindi l'esercizio è : data una macchina virtuale con dentro postgis, ma in realtà postgres, già bello che installato e configurato farci tante cose.

    In pratica suppongo che il docente voglia farti usare pappa già pronta invece di dover installare tutto il sistema.
    Magari pensa di renderti la vita più facile, invece te l'ha complicata

    Se pensi al docker come a una virtualbox tutto è più chiaro.

    Non so che centri gis nel tuo caso, tipicamente ha senso in geomatica.
    Magari studi ingegneria civile?

    Perché ribadisco che così 'a naso' non penso sia il tema della esercitazione, la quale sia più del genere scrivi qualche campo in un database con java. Potrei sbagliare ma è la mia interpretazione
  • Re: Lavorare sulle basi dati con JDBC

    giannino1995 ha scritto:


    Questo è quello che dovrei fare in Java:
    Ti è famigliare?
    Beh, sì. E' scritto male e un tantino disorganizzato ma è sostanzialmente l'uso diretto di JDBC, giusto con un minimo di design (interfaccia DAO e sua implementazione).
  • Re: Lavorare sulle basi dati con JDBC

    Si avete indovinato. +m2+ hai perfettamente ragione. Fatico di più con Docker che con Java ma queste sono le richieste e mi devo adeguare. Non sono uno studente di ingegneria civile.
  • Re: Lavorare sulle basi dati con JDBC

    Ho installato su Docker il DB. Per essere certo che tutto funzioni dovrei digitare l'IP della VM che ospita il container, scegliere la porta e dovrebbe comparirmi nel browser un software simile a phpMyAdmin per la gestione del database, giusto?

    http://IP_VM:5432
  • Re: Lavorare sulle basi dati con JDBC

    giannino1995 ha scritto:


    dovrebbe comparirmi nel browser un software simile a phpMyAdmin per la gestione del database, giusto?
    Esiste effettivamente un phpPgAdmin ma ovviamente serve anche php e un server http. E non posso sapere ora se hai tutto questo in quel bundle in Docker.

    Semplicemente ti basta un client GUI sulla tua macchina (non nel Docker). Il PgAdmin ufficiale oppure un qualunque altro client tipo SquirrelSQL (che funziona anche con altri dbms).
  • Re: Lavorare sulle basi dati con JDBC

    Ho provato con SquirrelSQL e JDBC ma ottengo questo errore:
    Errore inatteso durante il tentativo di aprire una connessione SQL.
    class java.net.ConnectException: Connection refused: connect
    https://prnt.sc/ncu0s
    ed ho il dubbio di aver configurato male il programma.
    Ho scaricato SquirrelSQL da qui:
    https://sourceforge.net/projects/squirrel-sql
    e il driver jdbc da qui:
    https://jdbc.postgresql.org/download.htm
    (ho trovato i link da Google)
  • Re: Lavorare sulle basi dati con JDBC

    Posso provare ad installare il DB da qui:
    https://www.enterprisedb.com/downloads/postgres-postgresql-downloads
    e vedere se riesco a connettermi con SquirrelSQL? Se ci riesco significa che il DB su Docker non funziona. Voi che dite?
    ciao
  • Re: Lavorare sulle basi dati con JDBC

    Oppure mi conviene questo?
    https://www.postgresql.org/ftp/pgadmin/pgadmin4/v4.5/windows/
  • Re: Lavorare sulle basi dati con JDBC

    Scusate, avevo scritto male la URL...
    Con SquirrelSQL e JDBC riesco a connettermi:
    https://prnt.sc/ncuny
    Non mi ci trovo per nulla ma credo che Docker funzioni.
    Grazie andbin!
  • Re: Lavorare sulle basi dati con JDBC

    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.
Devi accedere o registrarti per scrivere nel forum
105 risposte