0Pricing
Java Academy · Lezione

Fondamenti di JDBC

Connessioni, statement e result set

Fondamenti di JDBC è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.

Che cos'è JDBC?

JDBC (Java Database Connectivity) è l'API standard per comunicare con i database relazionali da Java.

  • Si trova nel pacchetto java.sql.
  • Ogni database fornisce un driver che implementa le interfacce JDBC.
  • Il codice viene scritto usando interfacce come Connection, Statement e ResultSet, mai direttamente le classi del fornitore.

Questa astrazione consente di usare lo stesso codice con PostgreSQL, MySQL, H2 o Oracle.

Le interfacce fondamentali

Tre interfacce svolgono la maggior parte del lavoro:

  • Connection — una sessione aperta con il database.
  • Statement / PreparedStatement — invia istruzioni SQL.
  • ResultSet — un cursore sulle righe restituite da una query.

Si ottiene una Connection da DriverManager o da un DataSource.

Aprire una connessione

DriverManager.getConnection(url, user, password) restituisce una Connection attiva.

L'URL JDBC identifica il database, ad esempio jdbc:postgresql://localhost:5432/shop. I driver moderni si registrano automaticamente, quindi non è più necessario chiamare Class.forName(...).

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/shop";
        try (Connection conn = DriverManager.getConnection(url, "app", "secret")) {
            System.out.println("Connected: " + !conn.isClosed());
        } catch (SQLException e) {
            System.out.println("Connection failed: " + e.getMessage());
        }
    }
}

try-with-resources

Connection, Statement e ResultSet implementano tutti AutoCloseable.

Li apra sempre all'interno di un blocco try-with-resources, in modo che vengano chiusi automaticamente, anche quando viene lanciata un'eccezione. La mancata chiusura delle connessioni esaurisce rapidamente le risorse del database.

  • Le risorse vengono chiuse in ordine inverso.
  • Non è necessario un blocco finally.

Eseguire una query

Per una SELECT semplice, crei uno Statement e chiami executeQuery, che restituisce un ResultSet.

L'esempio usa una simulazione in memoria, così può vedere il flusso senza un database reale. In produzione, l'SQL verrebbe eseguito sulla connessione.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        // Simulated result of: SELECT name FROM users
        List<String> names = List.of("Ada", "Linus", "Grace");
        System.out.println("Query returned " + names.size() + " rows:");
        for (String name : names) {
            System.out.println(" - " + name);
        }
    }
}

Leggere un ResultSet

Un ResultSet inizia prima della prima riga. Chiami rs.next() in un ciclo: restituisce false quando non ci sono altre righe.

Legga le colonne per nome o tramite un indice a partire da 1, usando getter tipizzati:

  • rs.getInt("id")
  • rs.getString("name")
  • rs.getDouble("price")
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/shop";
        try (Connection conn = DriverManager.getConnection(url, "app", "secret");
             Statement st = conn.createStatement();
             ResultSet rs = st.executeQuery("SELECT id, name FROM users")) {
            while (rs.next()) {
                System.out.println(rs.getInt("id") + ": " + rs.getString("name"));
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

executeUpdate per le scritture

Per INSERT, UPDATE e DELETE, usi executeUpdate. Restituisce un int: il numero di righe interessate.

Usi execute solo quando non è noto in anticipo se l'istruzione restituisce un result set.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/shop";
        try (Connection conn = DriverManager.getConnection(url, "app", "secret");
             Statement st = conn.createStatement()) {
            int rows = st.executeUpdate("DELETE FROM sessions WHERE expired = true");
            System.out.println("Deleted " + rows + " rows");
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

Mappare le righe in oggetti

La maggior parte delle applicazioni converte ogni riga in un oggetto di dominio. Iteri sul ResultSet e costruisca le istanze.

Ecco il modello, simulato in modo che possa essere eseguito autonomamente. Un record rende concisa la mappatura.

import java.util.ArrayList;
import java.util.List;

public class Main {
    record User(int id, String name) {}

    public static void main(String[] args) {
        // Stand-in for iterating a ResultSet
        String[][] rows = {{"1", "Ada"}, {"2", "Linus"}};
        List<User> users = new ArrayList<>();
        for (String[] row : rows) {
            users.add(new User(Integer.parseInt(row[0]), row[1]));
        }
        users.forEach(System.out::println);
    }
}

Gestire SQLException

Quasi tutti i metodi JDBC lanciano l'eccezione checked SQLException.

Contiene informazioni diagnostiche utili:

  • getMessage() — testo leggibile dall'utente.
  • getSQLState() — il codice di stato standard di 5 caratteri.
  • getErrorCode() — il codice specifico del fornitore.

Registri queste informazioni invece di ignorarle.

import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        SQLException e = new SQLException("duplicate key", "23505", 7);
        System.out.println("Message: " + e.getMessage());
        System.out.println("SQLState: " + e.getSQLState());
        System.out.println("ErrorCode: " + e.getErrorCode());
    }
}

DatabaseMetaData

conn.getMetaData() restituisce un oggetto DatabaseMetaData che descrive il database stesso.

Può indicare il nome e la versione del prodotto, le funzionalità supportate e persino elencare tabelle e colonne. È il modo in cui strumenti come i browser di schema funzionano senza inserire nei sorgenti dettagli specifici del fornitore.

Mettere tutto insieme

Un tipico flusso di lettura:

  • Apra una Connection in un blocco try-with-resources.
  • Crei uno Statement o, meglio ancora, un PreparedStatement.
  • Chiami executeQuery e iteri con rs.next().
  • Mappi le colonne negli oggetti.
  • Lasci che try-with-resources chiuda tutto.

Nella prossima lezione renderemo le query sicure contro la SQL injection.

Verifica rapida

Che cosa restituisce Statement.executeUpdate?

Riepilogo

Ora conosce il flusso fondamentale di JDBC:

  • DriverManager.getConnection apre una Connection.
  • Statement invia SQL; executeQuery restituisce un ResultSet, mentre executeUpdate restituisce il numero di righe interessate.
  • Iteri con rs.next() e usi getter tipizzati.
  • Usi sempre try-with-resources e gestisca SQLException insieme ai relativi codici di stato e di errore.

Domande Frequenti

La lezione «Fondamenti di JDBC» è gratuita?

Sì — il testo completo di «Fondamenti di JDBC» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.

Cosa imparerò in «Fondamenti di JDBC»?

Connessioni, statement e result set Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Java Academy?

Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Fondamenti di JDBC»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Java Academy?

Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Fondamenti di JDBC
  2. PreparedStatement
  3. Transazioni
  4. Connection pooling con HikariCP
← Torna a Java Academy