In qualsiasi progetto il collegamento con la base dati è una spetto fondamentale e la maggior parte dei progetti Java prevedono uno standard chiamato JDBC, abbreviazione di Java DataBase Connection, che permette di utilizzare componenti Java per il collegamento con la base dati, questo standard prevede a basso livello i seguenti componenti:
- un driver “registrato”: identifica il tipo di base di dati e i componenti necessari per il collegamento, come la definizione del endPoint, le credenziali di accesso e qualunque altro parametro necessario al collegamento dal programma in esecuzione alla base dati
- la connessione: rappresenta il filo logico tra il componente in esecuzione e il server
- lo statement: definisce tutte le istruzioni da eseguire e il risultato ritornato dalla base dati, nel caso di database relazionali, indica quali queries scritte nel linguaggio SQL eseguire
I driver di collegamento possono essere di vario tipo visto che i DBMS sono forniti da aziende diverse (più o meno amiche di Java) e possono essere di vario tipo: ODBC, Native API, Network API o pure Java; per la definizione del collegamento il tipo influisce solamente per il tipo di parametri necessari: a seconda del tipo saranno necessarie informazioni diverse, per esempio nel caso di un collegamento via network sarà necessario conoscere le impostazioni di rete mentre nel caso di pure Java sono necessarie il informazioni del socket di connessione.
I componenti di connessione e statement fanno parte di un package globale java.sql
:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet;
Ipotizzando di volersi collegare ad un Database di tipo Mysql con un il driver ufficiale scaricabile con maven aggiungendo nel pom.xml la dipendenza:
<dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.29</version> </dependency>
Il codice per collegarsi è molto semplice e prevede la definizione di driver, connessione e statement. Inoltre il resultSet ritornato dalla query può essere elaborato per il recupero dei dati:
public class MySql { private static final Logger logger = LogManager.getLogger(MySql.class); private final static String URL = "jdbc:mysql://localhost:3306/dbname"; private final static String USERNAME = "admin"; private final static String PASSWORD = "password"; private final static String DRIVER = "com.mysql.jdbc.Driver"; public static void main( String[] args ) throws Exception{ BasicConfigurator.configure(); String sqlCommand="select nome,eta from tab where nome is not null order by nome"; Class.forName(DRIVER); Connection con = DriverManager.getConnection (URL,USERNAME,PASSWORD); PreparedStatement cmd = con.prepareStatement(sqlCommand); ResultSet res = cmd.executeQuery(); ArrayList<String> nomi=new ArrayList<String>(); if (res!=null){ while(res.next()) { logger.debug("name:" + res.getString("nome")); nomi.add( res.getString("nome") ); } } cmd.close(); con.close(); } }
Le istruzioni di modifica dati possono eseguite con la stessa tecnica con l’accorgimento ulteriore che è possibile usare i parametri dello statement per creare query dinamiche:
final String K_INSERT_TABELLA="insert into tab (nome,descrizione,eta) VALUES (?,?,?)"; int numeroParametro=0; Connection con = DriverManager.getConnection (getUrl(),getUser(),getPassword()); PreparedStatement cmd = con.prepareStatement(K_INSERT_TABELLA); cmd.setString(numeroParametro++,"Alberto"); //imposto il primo parametro cmd.setString(numeroParametro++,"bellissimo"); //imposto il secondo parametro cmd.setInt(numeroParametro++,24); //imposto il terzo parametro int result=cmd.executeUpdate(); cmd.close(); con.close();
La stessa tecnica può essere usata anche con altri tipi di DMBS come postgresql la cui configurazione del pom.xml è:
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>9.0-801.jdbc4</version> </dependency>
Per tutti i DMBS più diffusi sono disponibili driver pubblici sui server maven, nel caso di driver proprietari è possibile importare la libreria jar nel progetto e poi usare il driver. L’uso di Connection e Statement è una tecnica talmente diffusa e usata che è diventata uno standard di fatto. Tuttavia non è necessario definire tutti questi passaggi ad ogni istruzione ma ci sono i framework che gestiscono questi componenti, nei prossimi articoli saranno introdotti tecniche meno manuali con l’ausilio di framework come Hibernate e Spring Boot.