MySQL e Java con JDBC

In questo articolo, esploreremo la connessione tra MySQL e Java utilizzando JDBC (Java Database Connectivity). JDBC è un’API (Application Programming Interface) standard del linguaggio Java che consente di interagire con database relazionali come MySQL.

Perché utilizzare JDBC?

JDBC offre numerosi vantaggi per la gestione di database da applicazioni Java:

  • Connettività Universale: JDBC permette di connettersi a svariati database relazionali, non solo MySQL.
  • Flessibilità: Offre un’interfaccia flessibile per eseguire query SQL, aggiornare dati e gestire transazioni.
  • Sicurezza: JDBC supporta l’autenticazione e l’autorizzazione per proteggere l’accesso ai dati.
  • Standardizzazione: Essendo uno standard, JDBC garantisce portabilità del codice tra diverse piattaforme.

Prerequisiti

Per iniziare, è necessario:

Immagine che illustra quale opzione scegliere per il download del JDBC Conncector per Java

Connessione a MySQL da Java

Prestare attenzione alla classe completa in coda ai singoli esempi. Il reference a molti oggetti e’ dichiarato come attributo privato della classe dell’esempio.

private Connection getConnection() throws SQLException {
        if(connection==null){
            MysqlDataSource dataSource = new MysqlDataSource();

            dataSource.setServerName("localhost");
            dataSource.setPortNumber(3306);
            dataSource.setUser("root");
            dataSource.setPassword("");
            dataSource.setDatabaseName("spacecoding");
            connection=dataSource.getConnection();
        }
        return connection;
 }

Nel metodo getConnection per prima cosa controlliamo se l’oggetto della classe Connection e’ null in caso positivo creiamo un oggetto della classe MysqlDataSource e tramite i suoi metodi andiamo a settare il nome del server, la porta, l’utente del database , la password dell’utente, e il nome del database sui cui vogliamo lavorare. Stiamo lavorando in locale e per brevita’ ho utilizzato l’utente root del server MySql fornito con XAMPP. Prima di provare questo codice e’ ovviamente necessario creare un database con il nome desiderato. Nell’esempio il database si chiama spacecoding e contiene solo una tabella di nome users.

Eseguire query e gestire dati

Visualizzare la lista degli utenti presenti nella tabella users

 private ResultSet getUsers() throws SQLException {
        String sql = "SELECT email FROM users";
        preparedStatement = getConnection().prepareStatement(sql);
        resultSet = preparedStatement.executeQuery();
       return resultSet;
}

il metodo getUsers() restituisce un oggetto della classe ResultSet che rappresenta il set di risultati che otterreno dopo l’esecuzione della query. Useremo l’oggetto della classe PreparedStatement per preparare e poi eseguire la query che e’ rappresentata dall’oggetto sql .

In una futura lezione vedremo anche come usare classe PreparedStatement per prevenire l’SQL Injection

Inserire un nuovo utente nella tabella users

  private int createUser(String email, String password) throws SQLException {
        String sql = "INSERT INTO users(email, password) VALUES('"+email+"','"+password+"')";
        preparedStatement = getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
        preparedStatement.executeUpdate();
        resultSet = preparedStatement.getGeneratedKeys();
        resultSet.next();
        return resultSet.getInt(1);
 }

Nel metodo createUser() riceviamo email e password e costruiamo la query prestando attenzione alla sintassi SQL che prevede gli apici per le stringhe e quindi dobbiamo concatenare le variabili includendo gli apici la sintassi SQL finale deve essere la seguente

INSERT INTO users(email, password) VALUES('test@example.com', 'secret');

In questo esempio utilizzaremo il metodo prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS); con due parametri, la stringa e l’attributo statico RETURN_GENERATED_KEYS in modo che dopo l’esecuzione potremo recuperare l’ID dell’utente che e’ la primary key di tipo auto increment. Con il metodo getGeneratedKeys() la assegnamo a resultSet e la restituiamo invocando il metodo getInt(1) dove uno rappresenta la prima chiave restituita.

MySQL e Java con JDBC : esempio completo


package database;

import com.mysql.cj.jdbc.MysqlDataSource;

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

public class DatabaseExample {
    private Connection connection;
    private PreparedStatement preparedStatement;
    private ResultSet resultSet;

    public static void main(String[] args) {
        DatabaseExample databaseExample = new DatabaseExample();
        ResultSet users;
        int id;
        try {
            id=databaseExample.createUser("test@example.com","secret");
            System.out.println("ID dell' account creato = " + id);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            // databaseExample.getConnection();
            users = databaseExample.getUsers();
            while(users.next()){
                System.out.println("Email: "+users.getString(1));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private ResultSet getUsers() throws SQLException {
        String sql = "SELECT email FROM users";
        preparedStatement = getConnection().prepareStatement(sql);
        resultSet = preparedStatement.executeQuery();
       return resultSet;
    }
    private int createUser(String email, String password) throws SQLException {
        String sql = "INSERT INTO users(email, password) VALUES('"+email+"','"+password+"')";
        preparedStatement = getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
        preparedStatement.executeUpdate();
        resultSet = preparedStatement.getGeneratedKeys();
        resultSet.next();
        return resultSet.getInt(1);
    }

    private Connection getConnection() throws SQLException {
        if(connection==null){
            MysqlDataSource dataSource = new MysqlDataSource();

            dataSource.setServerName("localhost");
            dataSource.setPortNumber(3306);
            dataSource.setUser("root");
            dataSource.setPassword("");
            dataSource.setDatabaseName("spacecoding");
            connection=dataSource.getConnection();
        }
        return connection;
    }
}

Conclusione

Questo articolo ha fornito una panoramica introduttiva su come connettersi a un database MySQL da un’applicazione Java utilizzando JDBC. Per approfondire, consulta la documentazione ufficiale di JDBC e MySQL.

Risorse utili:

Pubblicato da Carlo Contardi

Carlo Contardi, docente di informatica e sviluppatore Full Stack, condivide la sua passione per la programmazione e l’informatica attraverso il suo blog Space Coding. Offre preziosi consigli e soluzioni pratiche a chi vuole imparare a programmare o migliorare le proprie abilità. 🚀👨‍💻

Translate »