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:
- Avere installato Java Development Kit (JDK)
- Avere installato e configurato un server MySQL
- Familiarità con il linguaggio di programmazione Java
- Avere scaricato il driver JDBC MySQL Connector/J
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:
- Documentazione JDBC: https://docs.oracle.com/javase/tutorial/jdbc/basics/index.html
- Documentazione MySQL: https://dev.mysql.com/doc/
- Esempio completo su GitHub: DatabaseExample